summaryrefslogtreecommitdiff
path: root/gguf-py/gguf/gguf.py
diff options
context:
space:
mode:
Diffstat (limited to 'gguf-py/gguf/gguf.py')
-rw-r--r--gguf-py/gguf/gguf.py36
1 files changed, 29 insertions, 7 deletions
diff --git a/gguf-py/gguf/gguf.py b/gguf-py/gguf/gguf.py
index f4db7001..838a2c0f 100644
--- a/gguf-py/gguf/gguf.py
+++ b/gguf-py/gguf/gguf.py
@@ -13,7 +13,7 @@ from typing import Any, IO, List, Optional
#
GGUF_MAGIC = 0x46554747
-GGUF_VERSION = 1
+GGUF_VERSION = 2
GGUF_DEFAULT_ALIGNMENT = 32
# general
@@ -365,6 +365,9 @@ class GGUFValueType(IntEnum):
BOOL = 7
STRING = 8
ARRAY = 9
+ UINT64 = 10
+ INT64 = 11
+ FLOAT64 = 12
@staticmethod
def get_type(val):
@@ -378,6 +381,7 @@ class GGUFValueType(IntEnum):
return GGUFValueType.BOOL
elif isinstance(val, int):
return GGUFValueType.INT32
+ # TODO: need help with 64-bit types in Python
else:
print("Unknown type: "+str(type(val)))
sys.exit()
@@ -400,8 +404,8 @@ class GGUFWriter:
def write_header_to_file(self):
self.fout.write(struct.pack("<I", GGUF_MAGIC))
self.fout.write(struct.pack("<I", GGUF_VERSION))
- self.fout.write(struct.pack("<I", self.ti_data_count))
- self.fout.write(struct.pack("<I", self.kv_data_count))
+ self.fout.write(struct.pack("<Q", self.ti_data_count))
+ self.fout.write(struct.pack("<Q", self.kv_data_count))
self.flush()
# print("tensors " + str(self.ti_data_count) + " kv " + str(self.kv_data_count))
@@ -444,6 +448,18 @@ class GGUFWriter:
self.add_key(key)
self.add_val(val, GGUFValueType.FLOAT32)
+ def add_uint64(self, key: str, val: int):
+ self.add_key(key)
+ self.add_val(val, GGUFValueType.UINT64)
+
+ def add_int64(self, key: str, val: int):
+ self.add_key(key)
+ self.add_val(val, GGUFValueType.INT64)
+
+ def add_float64(self, key: str, val: float):
+ self.add_key(key)
+ self.add_val(val, GGUFValueType.FLOAT64)
+
def add_bool(self, key: str, val: bool):
self.add_key(key)
self.add_val(val, GGUFValueType.BOOL)
@@ -483,17 +499,23 @@ class GGUFWriter:
self.kv_data += struct.pack("<i", val)
elif vtype == GGUFValueType.FLOAT32:
self.kv_data += struct.pack("<f", val)
+ elif vtype == GGUFValueType.UINT64:
+ self.kv_data += struct.pack("<Q", val)
+ elif vtype == GGUFValueType.INT64:
+ self.kv_data += struct.pack("<q", val)
+ elif vtype == GGUFValueType.FLOAT64:
+ self.kv_data += struct.pack("<d", val)
elif vtype == GGUFValueType.BOOL:
self.kv_data += struct.pack("?", val)
elif vtype == GGUFValueType.STRING:
encoded_val = val.encode("utf8") if isinstance(val, str) else val
- self.kv_data += struct.pack("<I", len(encoded_val))
+ self.kv_data += struct.pack("<Q", len(encoded_val))
self.kv_data += encoded_val
elif vtype == GGUFValueType.ARRAY:
ltype = set([GGUFValueType.get_type(item) for item in val])
assert len(ltype) == 1, "All items in a GGUF array should be of the same type"
self.kv_data += struct.pack("<I", list(ltype)[0])
- self.kv_data += struct.pack("<I", len(val))
+ self.kv_data += struct.pack("<Q", len(val))
for item in val:
self.add_val(item, add_vtype=False)
else:
@@ -507,12 +529,12 @@ class GGUFWriter:
assert raw_dtype is not None or tensor_dtype in (np.float32, np.float16), "Only F32 and F16 tensors are supported for now"
encoded_name = name.encode("utf8")
- self.ti_data += struct.pack("<I", len(encoded_name))
+ self.ti_data += struct.pack("<Q", len(encoded_name))
self.ti_data += encoded_name
n_dims = len(tensor_shape)
self.ti_data += struct.pack("<I", n_dims)
for i in range(n_dims):
- self.ti_data += struct.pack("<I", tensor_shape[n_dims - 1 - i])
+ self.ti_data += struct.pack("<Q", tensor_shape[n_dims - 1 - i])
if raw_dtype is None:
dtype = GGMLQuantizationType.F32 if tensor_dtype == np.float32 else GGMLQuantizationType.F16
else: