Skip to content

Commit 3fa9dfc

Browse files
committed
convert : better logging of partially reflinkable tensors
1 parent 810039c commit 3fa9dfc

File tree

2 files changed

+12
-9
lines changed

2 files changed

+12
-9
lines changed

gguf-py/gguf/gguf_writer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ def print_plan(self) -> list[Path]:
201201
assert len(filenames) == len(self.tensors)
202202
for name, tensors in zip(filenames, self.tensors):
203203
total_size = sum(ti.nbytes for ti in tensors.values())
204-
reflinkable_size = count_reflinkable_size(ti.tensor for ti in tensors.values()) if self.use_reflinks else 0
204+
reflinkable_size = count_reflinkable_size((name, ti.tensor) for name, ti in tensors.items()) if self.use_reflinks else 0
205205
logger.info(f"{name}: n_tensors = {len(tensors)}, total_size = {GGUFWriter.format_n_bytes_to_str(total_size)}{', reflinked = ' + GGUFWriter.format_n_bytes_to_str(total_size - reflinkable_size) if self.use_reflinks else ''}")
206206

207207
if self.dry_run:

gguf-py/gguf/lazy.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -278,17 +278,22 @@ def best_extra_offset(t: np.ndarray | LazyNumpyTensor | None, current_offset: in
278278
return best_offset
279279

280280

281-
def count_reflinkable_size(tensors: Iterable[np.ndarray | LazyNumpyTensor | None]) -> int:
281+
def count_reflinkable_size(tensors: Iterable[tuple[str, np.ndarray | LazyNumpyTensor | None]]) -> int:
282282
if not hasattr(os, "copy_file_range"):
283283
return 0
284-
285284
size = 0
286-
for t in tensors:
285+
for name, t in tensors:
287286
if isinstance(t, LazyNumpyTensor) and len(t._ranges) > 0:
288287
align_offset = best_extra_offset(t, 0)
288+
misaligned = 0
289289
for range in t._ranges:
290-
if range.block_size > 0 and range.offset % range.block_size == align_offset:
291-
size += range.size
290+
if range.block_size > 0:
291+
if range.offset % range.block_size == align_offset:
292+
size += range.size
293+
else:
294+
misaligned += 1
295+
if misaligned > 0:
296+
logger.debug(f"{name} misaligned for reflinking, fallback to copy for {misaligned} of {len(t._ranges)} parts")
292297
return size
293298

294299

@@ -317,7 +322,7 @@ def copy_tensor_ranges(t: LazyNumpyTensor, fout: BufferedWriter):
317322

318323
has_copy_file_range = hasattr(os, "copy_file_range")
319324

320-
for i, r in enumerate(ranges):
325+
for r in ranges:
321326
src = src_files[r.filename]
322327
if has_copy_file_range:
323328
if r.block_size > 0 and (r.offset % r.block_size) == (start_offset % r.block_size):
@@ -354,8 +359,6 @@ def copy_tensor_ranges(t: LazyNumpyTensor, fout: BufferedWriter):
354359
os.copy_file_range(src.fileno(), fout.fileno(), size, offset_src, dst_offset)
355360
dst_offset += r.size - extra_size
356361
else:
357-
if r.block_size > 0:
358-
logger.debug(f"misaligned for reflinking, falling back to copy ({i}/{len(ranges)})")
359362
# not trying to use reflinks, but still using os.copy_file_range for speed
360363
os.copy_file_range(src.fileno(), fout.fileno(), r.size, r.offset, dst_offset)
361364
dst_offset += r.size

0 commit comments

Comments
 (0)