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()
|