Layer Reduction
使用知识蒸馏;减少hidden layer层数,不改变层的宽度;
目的:降低延迟,减少模型大小;
输入teacher model, 输出student model
Weight & Activation quantization
在手机等嵌入式设备上,存储小加算能力弱,量化技术有大用。
属于quantization-aware training (QAT),一边训练一边量化;而不是训练完成之后量化一把。
权重矩阵,是先分组,每组内部进行量化;
weights可以在训练开始时,使用start_bits来量化,过程中,逐渐过渡到target_bits来量化;
weights、attention、FFN,可以各自使用不同的量化bits设置;
forward时,"quantize_weight_in_forward"控制weight使用量化后还是量化前的数值来进行计算;backward时,weight都使用量化后的值来计算梯度;activation在forward和backward都使用量化后的值来计算;
"weight_quantization": { "enabled": true, "quantize_groups": 64, "quantize_bits": { "start_bits": 8, "target_bits": 4 } }, "activation_quantization": { "quantize_bits": 8 }
activation的静态量化:预先跑一小部分数据,得到min、max,用作量化;后续不会再动了;
activation的动态量化:每个token有自己的min、max;每个image有自己的min、max;
动态量化,精度更高,但会增加一些量化计算时间开销;
"schedule_offset": 训练刚开始的这些step,不进行activation量化;为了让训练刚开始的效果稳定;
Pruning: 把一些值置为0;减小model大小,加速计算;
structured pruning: 整个一块、一个filter、一个channel,这种成片的置0;可利用GPU硬件特性,更快的加速计算;
unstructured pruning: 绝对值足够小的就置0;不考虑周围数值;(稀疏矩阵可用稀疏计算kernel来跑)
Method Type Sparse pruning Unstructured and Structured Row pruning Structured Head pruning Structured Channel pruning Structured
1. Spare pruning
将weight矩阵里的某些数值置为0;
2. Row pruning
将矩阵的整个行置为0;
3. Head pruning
把multi-heads中的某些heads整个删掉;主要是concatenate后的向量乘以的那个转换矩阵,维度会变少,然后就是删掉的哪些heads对应的Key、Value和计算他们的矩阵,不需要了;
依据:文献上说,最后训好的模型,删掉一些head,对评测效果影响不大;
4. Channel pruning
卷据网络里,可以整个删掉一些中间层的channel;
ZeroQuant
2种结果:INT8;INT4/INT8混合;
Train完之后进行该步量化;
优点:
1. 硬件友好的量化方式,weights和activation都进行量化,量化误差小;
2. layer-by-layer知识蒸馏,不需要使用原始训练数据;目的:减少量化误差,而不是减少层数;一层优化完,再加载和优化另一层,对内存占用的小;
3. 量化/反量化,时间开销小;