Rabbit holes
-
Why did S3D collapse under INT8 when R(2+1)D-18 and the 2D control did not? Same entropy calibrator, same 200 calibration clips, same TensorRT build: two models lossless, S3D at 1.7 % with its FP16 engine untouched at 66.1 %. Sweep on a 512-clip subset (fp32 67.4 %): MinMax calibration 2.2 %, 640 calibration clips 1.8 %, FP16 fallback for unquantised layers 1.2 %, all 14 pooling layers fp32 0.8 %, all nine concatenations fp32 1.8 %, last eight layers fp32 2.9 %, first eight layers fp32 68.2 %. Single-layer sweep: any one of layers 0, 1 or 2 in fp32 restores 67.8 to 68.0 %; no single layer from 3 to 9 helps. The tensor between those layers is the stem’s first activation, 64 channels × 16 frames × 112².1
The mechanism, measured in a later workflow run over 2.5 × 10⁹ values: per-tensor absmax 45.9 sets an INT8 step of 0.36, the median absolute value is 0.46, p99 is 6.1, and per-channel absmax spans 0.77 to 45.9. Per-tensor activation quantisation cannot resolve the bulk and keep the tails; the downstream layers lack that spread. Became the shipped fix: per-model layer patterns kept in fp32 inside INT8 engines via TensorRT precision constraints, the naive engine emitted beside the pinned one in every report. Pinned INT8 66.1 % (entropy) and 65.7 % (MinMax) against fp32 66.3 %, naive 2.0 %. The repaired engine is slower than FP16 (1.22 against 1.08 ms), so for S3D the recommendation is FP16; INT8 pays for R(2+1)D-18.2
-
A negative shuffle gap. Under frame hold (every second frame repeated), Swin3D-T scored 64.6 % on ordered clips and 68.0 % on permuted ones; at a quarter rate R(2+1)D-18 did the same (45.1 against 47.2). The models were trained on full-rate motion; a held frame is a zero-velocity step they never saw, and permuting the held pairs apart restores something closer to the statistics they know. Dead end as a bug hunt (the permutation is applied after the hold, as intended); a finding about rate mismatch, kept as is.3
-
25 “undecodable” clips. The first real run rejected the dataset because 25 clips would not open. Not corrupt: PyAV decodes AVI metadata as strict UTF-8 and these carry Latin-1 bytes in their info chunks. Dead end as a data problem; became a decoder setting plus a manifest-driven repair that re-decodes only the failed rows.4
-
TensorRT 11 versus the fix. The first export reported both TensorRT rows unavailable: version 11 removed the FP16 builder flag and the INT8 entropy calibrator the code targets. Both rows degraded to “unavailable, with reason” rather than failing the unit. Dead end on 11; became a pin to the last 10.x line.4
-
The lock a cancelled run left behind. Cancelling a workflow stopped its decode unit with a signal and the unit died holding its lock; the next run’s prep refused to start rather than race a 28 GB array. Became a fix: the lock is released on termination and a lock whose holder process is gone on the same host is stale at once.2
-
The probe that ate the export unit. The first attempt to measure the stem tensor’s statistics concatenated every activation and pushed the export unit past its memory cap; the kernel killed it with an empty log. Became a streaming estimator (running per-channel maxima and a fixed reservoir for percentiles), explicit release between engine builds, progress lines that reach the log, and a recorded host-memory peak (15.2 GB on the rerun).2
Sources
Numbers on this page are quoted from the lab's own records. The records are private; each note gives the record's date.