File size: 2,536 Bytes
31596cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/env python3
"""Compare a deterministic llama-completion output with the HF BF16 reference."""

from __future__ import annotations

import argparse
import json
from pathlib import Path


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("--artifact", required=True)
    parser.add_argument("--hf-reference", type=Path, required=True)
    parser.add_argument("--gguf-output", type=Path, required=True)
    parser.add_argument("--case", default="greedy_capitals_12")
    parser.add_argument("--prompt-text", required=True)
    parser.add_argument(
        "--mismatch-policy",
        choices=("fail", "report"),
        default="fail",
        help="Whether a valid but different quantized generation is fatal.",
    )
    parser.add_argument("--output", type=Path, required=True)
    args = parser.parse_args()

    reference = json.loads(args.hf_reference.read_text(encoding="utf-8"))
    reference_case = reference["generations"][args.case]
    expected = reference_case["new_text"]
    expected_prompt = reference_case["prompt"]
    raw = args.gguf_output.read_text(encoding="utf-8")
    transport_suffix_present = raw.endswith("\n\n")
    actual = raw[:-2] if transport_suffix_present else raw
    execution_failures = []
    if args.prompt_text != expected_prompt:
        execution_failures.append("llama.cpp prompt differs from HF reference prompt")
    if not transport_suffix_present:
        execution_failures.append("missing llama-completion terminal newline suffix")
    result = {
        "artifact": args.artifact,
        "case": args.case,
        "prompt": args.prompt_text,
        "prompt_exact_match": args.prompt_text == expected_prompt,
        "expected_hf_bf16_text": expected,
        "actual_gguf_text": actual,
        "exact_text_match": actual == expected,
        "transport_suffix_present": transport_suffix_present,
        "execution_failures": execution_failures,
        "mismatch_policy": args.mismatch_policy,
    }
    args.output.parent.mkdir(parents=True, exist_ok=True)
    args.output.write_text(
        json.dumps(result, ensure_ascii=False, indent=2, sort_keys=True) + "\n",
        encoding="utf-8",
    )
    print(json.dumps(result, ensure_ascii=False, sort_keys=True))
    if execution_failures:
        raise SystemExit("; ".join(execution_failures))
    if not result["exact_text_match"] and args.mismatch_policy == "fail":
        raise SystemExit("greedy generation differs from HF BF16 reference")


if __name__ == "__main__":
    main()