File size: 1,750 Bytes
12496fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Static figure from observed training/quantization measurements."""
from pathlib import Path
import json
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt


def main():
    r = json.loads(Path("artifacts/tiny/training-report.json").read_text())
    q = json.loads(Path("reports/quantization.json").read_text())
    plt.rcParams.update({"font.size": 10, "axes.spines.top": False, "axes.spines.right": False})
    fig, axes = plt.subplots(1, 2, figsize=(11, 4.3), layout="constrained")
    rows = r["metrics"]
    axes[0].plot([x["step"] for x in rows], [x["train_loss"] for x in rows], "o-", label="Training batch", color="#2456a6")
    axes[0].plot([x["step"] for x in rows], [x["validation_loss"] for x in rows], "s-", label="Fixed validation batch", color="#c25823")
    axes[0].set(xlabel="Optimization step", ylabel="Cross-entropy (nats / byte token)", title="820,736-parameter training experiment")
    axes[0].legend(frameon=False)
    names = ["fp32", "dynamic_int8_linear_only"]
    p50 = [q[n]["batch_latency_seconds"]["p50"]*1000 for n in names]
    p95 = [q[n]["batch_latency_seconds"]["p95"]*1000 for n in names]
    x = [0, 1]
    axes[1].bar([i-.17 for i in x], p50, width=.34, label="P50", color="#2456a6")
    axes[1].bar([i+.17 for i in x], p95, width=.34, label="P95", color="#87a5d4")
    axes[1].set_xticks(x, ["FP32", "INT8 linear layers"])
    axes[1].set(ylabel="CPU batch latency (ms)", title="20 samples; no clear tail-latency win")
    axes[1].legend(frameon=False)
    fig.suptitle("NEXORA local prototype: measured mechanics, not capability benchmarks", fontsize=12, fontweight="bold")
    fig.savefig("reports/measurements.png", dpi=160)
    plt.close(fig)


if __name__ == "__main__":
    main()