跳至主要內容

Int8量化技术原理讲解

最后的开神-wkyc大约 2 分钟微调技术优化内存机器学习

Int8量化技术原理讲解

Int量化技术是一种节约大模型推理或训练的过程中占用的显存的技术。量化的目是为了减少计算时间和计算能耗 。在一些场景下对能耗和时间的要求,要高于模型的指标,所以在这种情况下量化是一个必然的选择。

1 公式解析

基准:普通的Linear层:y=Wx+by=Wx+b

x:tensor([1., 2., 3., 4.], device='cuda:0')
W:tensor([[ 0.4753,  0.4548, -0.2720,  0.0310],
                   [-0.3591, -0.4820, -0.3717, -0.2604]], device='cuda:0',requires_grad=True)
b:tensor([-0.4314,  0.1237], device='cuda:0', requires_grad=True)
y:tensor([ 0.2612, -3.3559], device='cuda:0', grad_fn=<AddBackward0>)

(1)令W=TWW=TW',其中TT是一个对角矩阵,相当于WW'的每行乘以一个系数。

(2)选定TT保证WW'的每一行四舍五入到整型之后最大值为127127或者最小值为127-127即可,因此TT完全由WW决定。

T的对角元素:tensor([0.0037, 0.0038], device='cuda:0', dtype=torch.float16)

W':tensor([[ 127,  122,  -73,    8],
                    [ -95, -127,  -98,  -69]], device='cuda:0', dtype=torch.int8)
b:tensor([-0.4314,  0.1237], device='cuda:0', dtype=torch.float16)

(3)前向传播的计算公式变成了 y=TWx+by=TW'x+b

(4)量化操作仅针对W,不针对bb。量化之后,网络相当于舍弃了WW,而保留了WW'TTWW'由于变成了int8整型,因此对显存来说相当于多存了TT的对角元素,少存了WW的一半大小,总体上显存的压力是大大变小了。

y:tensor([ 0.2571, -3.3652], device='cuda:0', dtype=torch.float16)

2 非对称量化

以上描述的过程是对称量化,对称量化把每一行的绝对值的最大值变换到127127,而非对称量化是把每一行的最大值变换到127127,最小值变换到128-128,因此非对称量化的W=TWpW'=TW-p,除了多一个TT的对角元素之外还多一个偏移向量。