rb.research record · int8-resnet50/INT8 ResNet-50 on ImageNet2026-10-19 14:20 UTC · rb 0.9.0

INT8 ResNet-50 on ImageNet

main · 8 recorded runs · changed 2 h ago

Open

Does INT8 post-training quantization keep ResNet-50 within 1 point of FP32 top-1?

The record does not answer it yet: the FP32 baseline is not reproduced, and 2 of 6 criteria are not met.

4 met · 1 not reproduced · 1 not met

How far to trust it

2 of 6 criteria were declared after their evidence existed.

6 of 8 runs do not record the command they were run with.

Read them as a description of what happened, not as a test.

Needs your judgment 4

  • Review the FP32 baseline mismatchFP32 baseline: observed 75.97% · published 76.13%Review
  • Decide on the calibration gatecalibration set size · gate missedReview
  • Review a result that rests on one runthe ONNX export holds onnx_top1Review
  • Inspect a changed config nothing in the record citesconfigs/data.yamlInspect

Research questions

How rb reads this repository
  • configs/data.yaml: changed since 3f2a9c1; nothing in the record cites it

rb looks at out/, results/ and the git history; last looked 2026-10-19 14:20 UTC.

Research

Research

Does INT8 post-training quantization keep ResNet-50 within 1 point of FP32 top-1?

2 results to review

fp32 top1 matches the published 76.13 c2

Recorded interpretation

INT8 keeps ResNet-50 within the one-point budget

1 more interpretation

the ONNX export keeps the INT8 reading · not confirmed

1 run not counted
qualification

1 run not counted

runs2 was retracted and replaced by runs2b.

All criteria

c1 int8 holds top1 within 1 point of fp32 · criterion met
criterionc1in e1

int8 holds top1 within 1 point of fp32

criterion met · loss

-0.0029 [-0.0071, +0.0013] top1 · paired difference, t interval, 3 seeds, 95% (rb)

what it rests on

  • runs1 fp32 and int8 · seed 1 · counted
  • runs2b fp32 and int8 · seed 2 · counted
  • runs2 fp32 and int8 · seed 2 · not counted: retracted
  • runs3 fp32 and int8 · seed 3 · counted

read in imagenet-val

receipt

declared 2026-10-12 · experiment e1 · metric top1

c2 fp32 top1 matches the published 76.13 · not reproduced
criterionc2in e1

fp32 top1 matches the published 76.13

not reproduced · measured

0.7597

what it rests on

Your call on c2

c3 the ONNX export holds onnx_top1 · criterion met
criterionc3

the ONNX export holds onnx_top1

criterion met · point only

rests on runs1

c4 the per-class top1 drop stays under 2 points · criterion met
criterionc4

the per-class top1 drop stays under 2 points for at least 99% of classes

criterion met · measured

read through a1

c5 int8 stays within 1 point of fp32 at every calibration size · criterion not met
criterionc5

int8 stays within 1 point of fp32 at every calibration size

gate missed · point only

rests on runc128, runc512

c6 int8 latency is at most 0.6 of fp32 on the T4 · criterion not met
criterionc6

int8 latency is at most 0.6 of fp32 on the T4

criterion not met · point only

rests on runsql7

Experiments

Experiments

int8 against fp32

design confirmed, then changed: rb confirm e1 lists it

Reproduce

ready: code, environment and inputs recorded

The whole recipe as one script
git checkout 3f2a9c1
python eval.py --precision int8 --seed 1
runarmstop1
runs1fp32 and int8 · seed 10.7598 · 0.7569
runs3fp32 and int8 · seed 30.7599 · 0.7572

calibration set size: how many images INT8 needs

design not confirmed: rb confirm e2 lists it

Record

Runs

runs1 fp32 and int8 · seed 1
runruns1in e1

fp32 and int8 · seed 1

run · recorded 2026-10-12 09:14 UTC
produced 2026-10-12 09:02 (file)

fp32: top1=0.7598 onnx_top1=0.7569 · int8: top1=0.7569 onnx_top1=0.7566

counts toward c1, c2, c3 · made ckpt-int8-s1 · read imagenet-val

python eval.py --precision int8 --seed 1
runs2 fp32 and int8 · seed 2 · retracted
runruns2retracted

fp32 and int8 · seed 2

retracted 2026-10-13: the wrong checkpoint was loaded

replaced by runs2b

runs2b fp32 and int8 · seed 2
runruns2b

fp32 and int8 · seed 2

replaces runs2 · counts toward c1

runs3 fp32 and int8 · seed 3
runruns3

fp32 and int8 · seed 3

counts toward c1, c2

runsql7 fp32 and int8 · results/runs.db row 7
runrunsql7

fp32 and int8 · results/runs.db row 7

fp32: latency_ms=6.1 · int8: latency_ms=3.9

runc128 fp32 and int8 · calib_images 128
runrunc128

fp32 and int8 · calib_images 128

runc512 fp32 and int8 · calib_images 512
runrunc512

fp32 and int8 · calib_images 512

same bytes as what runs1 made

Analyses

a1 per-class bootstrap over images
analysisa1

per-class bootstrap over images

reads runs1, runs2b, runs3 · used by c4

Resources

imagenet-val · ImageNet-1k validation · evaluation data · remote
resourceimagenet-val

ImageNet-1k validation

read by runs1, runs3 and 6 more

ckpt-int8-s1 · ResNet-50 INT8, seed 1 · checkpoint · present
resourceckpt-int8-s1

ResNet-50 INT8, seed 1

made by runs1

python quantize.py --calib 512 --seed 1

History

  1. 2026-10-19 · accepted c1: within the one-point budget on three seeds
  2. 2026-10-13 · runs2 retracted: the wrong checkpoint was loaded

Your call (4)

4 calls wait on you.

Not reproduced · estimate 0.7597 outside 0.7613 ± 0.001fp32 top1 matches the published 76.13 c2
your callReview this resultc2

fp32 top1 matches the published 76.13

Why this needs a call

Not reproduced · estimate 0.7597 outside 0.7613 ± 0.001

It rests on 3 runs · 1 run not counted · the whole finding

Source details
declared
2026-10-12 · experiment e1 · metric top1
runs
runs1, runs2b, runs3 · out/seed1/metrics.json …

Record a call

  • Accept
    rb decide c2 accept --why '‹why›'
    Its review will read: accepted ‹day›: ‹why›
  • Reject
    rb decide c2 reject --why '‹why›'
    Its review will read: rejected ‹day›: ‹why›
  • Investigate
    rb decide c2 investigate --why '‹why›'
    Its review will read: investigating since ‹day›: ‹why›
Gate missedcalibration set size: how many images INT8 needs e2
your calle2

calibration set size: how many images INT8 needs

Why this needs a call

calib_images 64: int8 top1 within 1 point of fp32 in 0 of 3 seeds

calib_images 128: int8 top1 within 1 point of fp32 in 1 of 3 seeds

calib_images 192: int8 top1 within 1 point of fp32 in 2 of 3 seeds

calib_images 256: int8 top1 within 1 point of fp32 in 3 of 3 seeds

calib_images 320: int8 top1 within 1 point of fp32 in 0 of 3 seeds

calib_images 384: int8 top1 within 1 point of fp32 in 1 of 3 seeds

calib_images 448: int8 top1 within 1 point of fp32 in 2 of 3 seeds

calib_images 512: int8 top1 within 1 point of fp32 in 3 of 3 seeds

calib_images 576: int8 top1 within 1 point of fp32 in 0 of 3 seeds

calib_images 640: int8 top1 within 1 point of fp32 in 1 of 3 seeds

calib_images 704: int8 top1 within 1 point of fp32 in 2 of 3 seeds

calib_images 768: int8 top1 within 1 point of fp32 in 3 of 3 seeds

calib_images 832: int8 top1 within 1 point of fp32 in 0 of 3 seeds

calib_images 896: int8 top1 within 1 point of fp32 in 1 of 3 seeds

calib_images 960: int8 top1 within 1 point of fp32 in 2 of 3 seeds

calib_images 1024: int8 top1 within 1 point of fp32 in 3 of 3 seeds

calib_images 1088: int8 top1 within 1 point of fp32 in 0 of 3 seeds

calib_images 1152: int8 top1 within 1 point of fp32 in 1 of 3 seeds

calib_images 1216: int8 top1 within 1 point of fp32 in 2 of 3 seeds

calib_images 1280: int8 top1 within 1 point of fp32 in 3 of 3 seeds

calib_images 1344: int8 top1 within 1 point of fp32 in 0 of 3 seeds

calib_images 1408: int8 top1 within 1 point of fp32 in 1 of 3 seeds

calib_images 1472: int8 top1 within 1 point of fp32 in 2 of 3 seeds

calib_images 1536: int8 top1 within 1 point of fp32 in 3 of 3 seeds

calib_images 1600: int8 top1 within 1 point of fp32 in 0 of 3 seeds

calib_images 1664: int8 top1 within 1 point of fp32 in 1 of 3 seeds

calib_images 1728: int8 top1 within 1 point of fp32 in 2 of 3 seeds

calib_images 1792: int8 top1 within 1 point of fp32 in 3 of 3 seeds

calib_images 1856: int8 top1 within 1 point of fp32 in 0 of 3 seeds

calib_images 1920: int8 top1 within 1 point of fp32 in 1 of 3 seeds

calib_images 1984: int8 top1 within 1 point of fp32 in 2 of 3 seeds

calib_images 2048: int8 top1 within 1 point of fp32 in 3 of 3 seeds

calib_images 2112: int8 top1 within 1 point of fp32 in 0 of 3 seeds

calib_images 2176: int8 top1 within 1 point of fp32 in 1 of 3 seeds

calib_images 2240: int8 top1 within 1 point of fp32 in 2 of 3 seeds

calib_images 2304: int8 top1 within 1 point of fp32 in 3 of 3 seeds

calib_images 2368: int8 top1 within 1 point of fp32 in 0 of 3 seeds

calib_images 2432: int8 top1 within 1 point of fp32 in 1 of 3 seeds

calib_images 2496: int8 top1 within 1 point of fp32 in 2 of 3 seeds

calib_images 2560: int8 top1 within 1 point of fp32 in 3 of 3 seeds

Record a call

  • Continue
    rb decide e2 continue --why '‹why›'
  • Park
    rb decide e2 park --why '‹why›'
  • Stop
    rb decide e2 stop --why '‹why›'
Rests on one runthe ONNX export holds onnx_top1 c3
your callc3

the ONNX export holds onnx_top1

It rests on 1 run

Waiting for your confirmation, listed apart

Proposed, not made (1)

  • accept c3: the ONNX export holds onnx_top1

    note: one run is enough for an export check · not confirmed

    rb decide c3 accept --why 'one run is enough for an export check'

    Confirm it in your own terminal:

    rb confirm d7k2pqa

Past calls mentioned, not confirmed (1)

  • park e2, as notes.md:3 reads: "we park the 128-image cell for now"

    Confirm it in your own terminal:

    rb confirm d4m8xqe

What waits for your confirmation, listed apart →

What the words on this page mean
command (as given)
the command the run names, as given; rb did not run it
Retrospective
declared after its evidence existed