INT8也能训练
在 前一篇博客 中,我们深入探讨了DeepSeek V3如何通过FP8实现高效训练,并成功克服了精度挑战。本文探讨另一个问题:如果用INT8代替FP8做训练,会发生什么?
INT8 量化
给定一个浮点数向量
其中
这确保了量化后的值不会超出INT8的表示范围。而零点偏移
对于LLM训练场景,由于权重和激活值通常呈现对称分布,我们可以使用对称量化方案:
def symmetric_quantize(x: torch.Tensor) -> Tuple[torch.Tensor, float]:
alpha = x.abs().max() / 127.0 # 计算缩放因子
x_q = torch.round(x / alpha) # 量化
x_q = torch.clamp(x_q, -128, 127) # 截断
return x_q, alpha
反量化操作则是将INT8值映射回浮点数空间:
其中
与FP8的浮点量化不同,INT8采用均匀量化方案:
- 优势区间:大值区域精度更高(固定量化步长)
- 劣势区间:小值区域精度较低(相对误差更大)
这种特性使得INT8对数据分布形态更为敏感,需要针对性优化策略。