| 35 | return GGMLQuantizationType.Q4_0 |
| 36 | |
| 37 | |
| 38 | def copy_metadata(r: GGUFReader, w: GGUFWriter) -> None: |
| 39 | skip = {"GGUF.version", "GGUF.tensor_count", "GGUF.kv_count", "general.architecture"} |
| 40 | T = gguf.GGUFValueType |
| 41 | for f in r.fields.values(): |
| 42 | if f.name in skip: |
| 43 | continue |
| 44 | ftype = f.types[0] |
| 45 | val = f.parts[f.data[0]] |
| 46 | if ftype == T.STRING: |
| 47 | w.add_string(f.name, bytes(val).decode()) |
| 48 | elif ftype == T.ARRAY: |
| 49 | sub = f.types[1] |
| 50 | vals = [f.parts[i] for i in f.data] |
| 51 | if sub == T.STRING: |
| 52 | w.add_array(f.name, [bytes(v).decode() for v in vals]) |
| 53 | else: |
| 54 | w.add_array(f.name, [np.asarray(v)[0].item() for v in vals]) |
| 55 | elif ftype == T.BOOL: |
| 56 | w.add_bool(f.name, bool(val[0])) |
| 57 | elif ftype == T.FLOAT32: |
| 58 | w.add_float32(f.name, float(val[0])) |
| 59 | elif ftype == T.FLOAT64: |
| 60 | w.add_float64(f.name, float(val[0])) |
| 61 | else: |
| 62 | fn = {T.UINT32: w.add_uint32, T.INT32: w.add_int32, |
| 63 | T.UINT64: w.add_uint64, T.INT64: w.add_int64, |
| 64 | T.UINT8: w.add_uint8, T.INT8: w.add_int8, |
| 65 | T.UINT16: w.add_uint16, T.INT16: w.add_int16}[ftype] |
| 66 | fn(f.name, val[0].item()) |
| 67 | |
| 68 | |