int8 推論
int8 推論是真正會上線的量化最常見的具體實例:用 8 位元整數(有號為 −128…127,無號為 0…255)而非 32 位元浮點,來執行模型沉重的矩陣乘法。現代 CPU、GPU 與手機 NPU 都有專用的 int8 算術單元,能快上數倍且只搬運四分之一的位元組——因此同時改善速度與記憶體。
機制上:權重與激活值以 per-channel 或 per-tensor 的縮放係數量化成 int8;矩陣乘法做 int8 乘 int8,但把乘積以 int32 累加(讓累加和不會溢位);接著一個「再量化」(requantization)步驟把該 int32 結果重新縮放回 int8 供下一層使用,方法是乘以合併後的縮放係數——通常以定點整數乘法加位移高效實作。偏差項保留為 int32。一個常見且對硬體友善的慣例是:對稱的 int8 權重,搭配非對稱(帶零點)的 int8 激活值,而激活範圍可採靜態(校準)或動態。
實務上的準確率,對 CNN 分類與偵測極佳——ResNet、YOLO、EfficientDet 通常損失低於 1%——前提是縮放係數校準良好且採 per-channel。ViT 與重度使用注意力/正規化的網路,則需要仔細處理離群值(或採量化感知訓練)才能持平。相對 FP32 的典型收益,是在網路中受矩陣乘法限制的部分約降低 2 至 4 倍延遲、減少 4 倍記憶體,並透過 TensorRT、ONNX Runtime、TFLite、oneDNN 與 XNNPACK 等後端實現。
並非每樣東西都該用 int8。softmax、layer norm,以及常見的第一層卷積與最後的分類器,最好保留較高精度;混合 int8/FP16 的計算圖是常態。把對數值敏感的運算硬塞成 int8,是準確率莫名崩跌的常見原因。