ivere27's picture
tiny-receipt-reader-digit-slots-2m — question-free receipt digit reader (2.46M params, epoch 100)
c9fa078
Raw
History Blame Contribute Delete
2.02 kB
{
"name": "tiny-receipt-reader-digit-slots-2m",
"format": "receipt_digit_reader_onnx_v1",
"library": "onnxruntime",
"opset": 18,
"architecture": {
"kind": "conv stem + iterative slot readout",
"d_model": 256,
"readout_rounds": 3,
"grid": [
10,
42
],
"slots": 16,
"phone_slots": 12,
"street_slots": 4,
"num_classes": 11,
"parameters": 2457387,
"self_attention_layers": 0,
"decoder_layers": 0,
"tokenizer": null
},
"source": {
"checkpoint_epoch": 100,
"selection": "last.pt at the end of a completed 100-epoch OneCycleLR schedule. Synthetic validation saturated near epoch 80 (street exact reached 1.0000), so the best.pt criterion had no discriminating power left and the choice was made on schedule completion instead. best.pt (epoch 86) and last.pt (epoch 100) were afterwards compared on the held-out split and differed by 0.0010 answer_exact, two questions out of 2000, inside the binomial standard error of 0.0038. That post-hoc look means the held-out split is a development test for this checkpoint choice rather than a fully blind benchmark, even though it never entered training, checkpointing, or calibration.",
"training_precision": "bfloat16 autocast, float32 weights",
"question_handling": "regex, question_router.py; the graph never sees the question"
},
"artifacts": {
"model.onnx": {
"bytes": 9863204,
"sha256": "b84c53d5282dfd0d572bb8ef48216c29928a42dd859e0f4d7bea466126d3d8e8"
},
"model_int8.onnx": {
"bytes": 4067894,
"sha256": "0f30b70bf507b51ebe933275d920fd8f006f6187fad280f09e1a2ca9753ef73f"
}
},
"evaluation": {
"heldout": "eval/heldout_summary.json",
"int8_w8a8": "eval/int8_w8a8_summary.json",
"fp32_int8_comparison": "eval/fp32_int8_comparison.json",
"runtime_fp32": "eval/runtime_benchmark_fp32_cpu.json",
"runtime_int8": "eval/runtime_benchmark_int8_cpu.json",
"summary": "eval/comparison.json"
},
"license": "Apache-2.0"
}