-
Notifications
You must be signed in to change notification settings - Fork 9.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Enable llama.cpp on s390x big endian platform #3552
Changes from 6 commits
0613562
fa62c8c
1ce890a
8640f3b
e4efbdb
51e9d39
7fc0250
e513abe
eb5b832
4389bda
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -22,6 +22,7 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUF_VERSION = 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUF_DEFAULT_ALIGNMENT = 32 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# general | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
KEY_GENERAL_ARCHITECTURE = "general.architecture" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
KEY_GENERAL_QUANTIZATION_VERSION = "general.quantization_version" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -569,6 +570,10 @@ class GGMLQuantizationType(IntEnum): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Q6_K = 14 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Q8_K = 15 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
class GGUFEndian(IntEnum): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
LITTLE = 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
BIG = 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
class GGUFValueType(IntEnum): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
UINT8 = 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -616,18 +621,39 @@ class GGUFWriter: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
temp_file: tempfile.SpooledTemporaryFile[bytes] | None = None | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tensors: list[tuple[np.ndarray[Any, Any], int]] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def __init__(self, path: os.PathLike[str] | str, arch: str, use_temp_file = True): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def get_pack_prefix(self): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
chenqiny marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if self.endianess==GGUFEndian.LITTLE: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "<" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ">" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def __init__(self, path: os.PathLike[str] | str, arch: str, use_temp_file = True, endianess=GGUFEndian.LITTLE): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.fout = open(path, "wb") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.arch = arch | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.endianess = endianess | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self._simple_value_packing = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.UINT8: f"{self.get_pack_prefix()}B", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.INT8: f"{self.get_pack_prefix()}b", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.UINT16: f"{self.get_pack_prefix()}H", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.INT16: f"{self.get_pack_prefix()}h", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.UINT32: f"{self.get_pack_prefix()}I", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.INT32: f"{self.get_pack_prefix()}i", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.FLOAT32: f"{self.get_pack_prefix()}f", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.UINT64: f"{self.get_pack_prefix()}Q", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.INT64: f"{self.get_pack_prefix()}q", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.FLOAT64: f"{self.get_pack_prefix()}d", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.BOOL: "?" , | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.add_architecture() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.use_temp_file = use_temp_file | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.tensors = [] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
print(f"This gguf file is for {self.endianess} only") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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("<Q", self.ti_data_count)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.fout.write(struct.pack("<Q", self.kv_data_count)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.fout.write(struct.pack(f"{self.get_pack_prefix()}I", GGUF_MAGIC)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The magic is meant to be exactly the ascii bytes G G U F in the file, regardless of the system endianness. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I suggest to check magic code instead. If the endianess is not match, magic code is 0x47475546. Then we can warn user:
Suggested change
Result after apply fix ~/code/aiu/work/llama.cpp> ./main -m ~/gguf-s390/Baichuan-7B-f16.gguf
Log start
main: build = 1360 (51e9d39)
main: built with cc (SUSE Linux) 7.5.0 for x86_64-suse-linux
main: seed = 1697040195
Endianess of the GGUF file and platform do not match.gguf_init_from_file: invalid magic number 47475546.
error loading model: llama_model_loader: failed to load model from /home/cqy/gguf-s390/Baichuan-7B-f16.ggufllama_load_model_from_file: failed to load model
llama_init_from_gpt_params: error: failed to load model '/home/cqy/gguf-s390/Baichuan-7B-f16.gguf'
main: error: unable to load model There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you do want to start loading and saving files that start with There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I added endianess check There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
@cebtenzzre This depends on whether we think the magic number is a number or a string. ggml.c read the magic number as uint_32. This is endianess sensitive. If we think magic is int type, I think my update is compatible to the spec. But if we think magic is string type, then we need to update both ggml.h, ggml.c and gguf.py. @ggerganov what's your opinion?
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Isn't it better to fix There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Appreciate for your comments. Yes. Let me clarify my update. I fixed the ggml.h to use the difference int magic value according to endianess which always represents "GGUF" characters. Now the file is always compatible to the spec. Now the GGUF file for big endian is started with "GGUF" as small endian GGUF file is. See the hexdump of llama2 gguf file on s390x big endian: [aiu gguf-s390]$ hexdump -C gguf-s390/llama-2-7b-f16-new.gguf|head -n 20
00000000 47 47 55 46 00 00 00 03 00 00 00 00 00 00 01 23 |GGUF...........#|
00000010 00 00 00 00 00 00 00 0f 00 00 00 00 00 00 00 14 |................|
00000020 67 65 6e 65 72 61 6c 2e 61 72 63 68 69 74 65 63 |general.architec|
00000030 74 75 72 65 00 00 00 08 00 00 00 00 00 00 00 05 |ture............|
00000040 6c 6c 61 6d 61 00 00 00 00 00 00 00 0c 67 65 6e |llama........gen|
00000050 65 72 61 6c 2e 6e 61 6d 65 00 00 00 08 00 00 00 |eral.name.......|
00000060 00 00 00 00 08 4c 4c 61 4d 41 20 76 32 00 00 00 |.....LLaMA v2...|
00000070 00 00 00 00 14 6c 6c 61 6d 61 2e 63 6f 6e 74 65 |.....llama.conte|
00000080 78 74 5f 6c 65 6e 67 74 68 00 00 00 04 00 00 10 |xt_length.......|
00000090 00 00 00 00 00 00 00 00 16 6c 6c 61 6d 61 2e 65 |.........llama.e|
000000a0 6d 62 65 64 64 69 6e 67 5f 6c 65 6e 67 74 68 00 |mbedding_length.|
000000b0 00 00 04 00 00 10 00 00 00 00 00 00 00 00 11 6c |...............l|
000000c0 6c 61 6d 61 2e 62 6c 6f 63 6b 5f 63 6f 75 6e 74 |lama.block_count|
000000d0 00 00 00 04 00 00 00 20 00 00 00 00 00 00 00 19 |....... ........|
000000e0 6c 6c 61 6d 61 2e 66 65 65 64 5f 66 6f 72 77 61 |llama.feed_forwa|
000000f0 72 64 5f 6c 65 6e 67 74 68 00 00 00 04 00 00 2b |rd_length......+|
00000100 00 00 00 00 00 00 00 00 1a 6c 6c 61 6d 61 2e 72 |.........llama.r|
00000110 6f 70 65 2e 64 69 6d 65 6e 73 69 6f 6e 5f 63 6f |ope.dimension_co|
00000120 75 6e 74 00 00 00 04 00 00 00 80 00 00 00 00 00 |unt.............|
00000130 00 00 1a 6c 6c 61 6d 61 2e 61 74 74 65 6e 74 69 |...llama.attenti| And I rolled back the line to write GGUF_MAGIC in gguf.py. It always write the magic in byte order. def write_header_to_file(self):
self.fout.write(struct.pack("<I", GGUF_MAGIC))
self.fout.write(struct.pack(f"{self.pack_prefix}I", GGUF_VERSION))
self.fout.write(struct.pack(f"{self.pack_prefix}Q", self.ti_data_count))
self.fout.write(struct.pack(f"{self.pack_prefix}Q", self.kv_data_count))
self.flush() There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, this works, but I wish to avoid the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I like this choice. Previously I thought maybe this change is too big. I will also need to change the magic in struct gguf_header to char array. If you agree, I will update according to your comments. struct gguf_header {
uint32_t magic; => char magic[4];
uint32_t version;
uint64_t n_tensors; // GGUFv2
uint64_t n_kv; // GGUFv2
}; There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @ggerganov updated according to your comments |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.fout.write(struct.pack(f"{self.get_pack_prefix()}I", GGUF_VERSION)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.fout.write(struct.pack(f"{self.get_pack_prefix()}Q", self.ti_data_count)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.fout.write(struct.pack(f"{self.get_pack_prefix()}Q", self.kv_data_count)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.flush() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# print("tensors " + str(self.ti_data_count) + " kv " + str(self.kv_data_count)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -699,40 +725,27 @@ def add_array(self, key: str, val: Sequence[Any]): | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.add_key(key) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.add_val(val, GGUFValueType.ARRAY) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_simple_value_packing = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.UINT8: "<B", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.INT8: "<b", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.UINT16: "<H", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.INT16: "<h", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.UINT32: "<I", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.INT32: "<i", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.FLOAT32: "<f", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.UINT64: "<Q", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.INT64: "<q", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.FLOAT64: "<d", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GGUFValueType.BOOL: "?" , | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def add_val(self, val: Any, vtype: GGUFValueType | None = None, add_vtype: bool = True): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if vtype is None: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vtype = GGUFValueType.get_type(val) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if add_vtype: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.kv_data += struct.pack("<I", vtype) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.kv_data += struct.pack(f"{self.get_pack_prefix()}I", vtype) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.kv_data_count += 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pack_fmt = self._simple_value_packing.get(vtype) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if pack_fmt is not None: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.kv_data += struct.pack(pack_fmt, val) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
elif vtype == GGUFValueType.STRING: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
encoded_val = val.encode("utf8") if isinstance(val, str) else val | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.kv_data += struct.pack("<Q", len(encoded_val)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.kv_data += struct.pack(f"{self.get_pack_prefix()}Q", len(encoded_val)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.kv_data += encoded_val | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
elif vtype == GGUFValueType.ARRAY and isinstance(val, Sequence) and len(val) > 0: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ltype = GGUFValueType.get_type(val[0]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if not all(GGUFValueType.get_type(i) is ltype for i in val[1:]): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError("All items in a GGUF array should be of the same type") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.kv_data += struct.pack("<I", ltype) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.kv_data += struct.pack("<Q", len(val)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.kv_data += struct.pack(f"{self.get_pack_prefix()}I", ltype) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.kv_data += struct.pack(f"{self.get_pack_prefix()}Q", len(val)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for item in val: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.add_val(item, add_vtype=False) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -746,22 +759,24 @@ def add_tensor_info(self, name: str, tensor_shape: Sequence[int], tensor_dtype: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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("<Q", len(encoded_name)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.ti_data += struct.pack(f"{self.get_pack_prefix()}Q", len(encoded_name)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.ti_data += encoded_name | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
n_dims = len(tensor_shape) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.ti_data += struct.pack("<I", n_dims) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.ti_data += struct.pack(f"{self.get_pack_prefix()}I", n_dims) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for i in range(n_dims): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.ti_data += struct.pack("<Q", tensor_shape[n_dims - 1 - i]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.ti_data += struct.pack(f"{self.get_pack_prefix()}Q", tensor_shape[n_dims - 1 - i]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if raw_dtype is None: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dtype = GGMLQuantizationType.F32 if tensor_dtype == np.float32 else GGMLQuantizationType.F16 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dtype = raw_dtype | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.ti_data += struct.pack("<I", dtype) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.ti_data += struct.pack("<Q", self.offset_tensor) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.ti_data += struct.pack(f"{self.get_pack_prefix()}I", dtype) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.ti_data += struct.pack(f"{self.get_pack_prefix()}Q", self.offset_tensor) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.offset_tensor += GGUFWriter.ggml_pad(tensor_nbytes, self.data_alignment) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.ti_data_count += 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def add_tensor(self, name: str, tensor: np.ndarray[Any, Any], raw_shape: Sequence[int] | None = None, raw_dtype: GGMLQuantizationType | None = None): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if self.endianess == GGUFEndian.BIG: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tensor.byteswap(inplace=True) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if self.use_temp_file and self.temp_file is None: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fp = tempfile.SpooledTemporaryFile(mode="w+b", max_size=256*1024*1024) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fp.seek(0) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be handle in
GGUFWriter.write_tensor_data
just like you do inadd_tensor
. Conversion script should not have no responsibility for handling endianness other than setting it in the constructor.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@monatis updated as your comments