| |
| """Emit a compact, reproducible tensor and parameter audit for GGUF files.""" |
|
|
| from __future__ import annotations |
|
|
| import argparse |
| import hashlib |
| import json |
| from collections import Counter |
| from pathlib import Path |
|
|
| from gguf import GGUFReader |
|
|
|
|
| def sha256(path: Path) -> str: |
| digest = hashlib.sha256() |
| with path.open("rb") as stream: |
| for chunk in iter(lambda: stream.read(8 * 1024 * 1024), b""): |
| digest.update(chunk) |
| return digest.hexdigest() |
|
|
|
|
| def audit(path: Path, with_hash: bool) -> dict[str, object]: |
| reader = GGUFReader(path, "r") |
| tensors: Counter[str] = Counter() |
| parameters: Counter[str] = Counter() |
| protected: dict[str, str] = {} |
|
|
| for tensor in reader.tensors: |
| tensor_type = tensor.tensor_type.name.lower() |
| tensors[tensor_type] += 1 |
| parameters[tensor_type] += int(tensor.n_elements) |
| if tensor.name.endswith( |
| ( |
| "audio_patch_proj.weight", |
| "video_patch_proj.weight", |
| "condition_proj.weight", |
| ) |
| ): |
| protected[tensor.name] = tensor_type |
|
|
| result: dict[str, object] = { |
| "file": path.name, |
| "bytes": path.stat().st_size, |
| "tensor_count": len(reader.tensors), |
| "tensor_histogram": dict(sorted(tensors.items())), |
| "parameter_histogram": dict(sorted(parameters.items())), |
| "protected_tensors": dict(sorted(protected.items())), |
| } |
| if with_hash: |
| result["sha256"] = sha256(path) |
| return result |
|
|
|
|
| def main() -> None: |
| parser = argparse.ArgumentParser() |
| parser.add_argument("files", nargs="+", type=Path) |
| parser.add_argument("--sha256", action="store_true") |
| parser.add_argument("--output", type=Path) |
| args = parser.parse_args() |
|
|
| report = [audit(path.resolve(), args.sha256) for path in args.files] |
| rendered = json.dumps(report, indent=2, sort_keys=True) + "\n" |
| if args.output: |
| args.output.write_text(rendered, encoding="utf-8") |
| else: |
| print(rendered, end="") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|