PyTorch 动态量化(Dynamic Quantization)
PyTorch 的动态量化Dynamic Quantization包括原理、适用场景和具体示例。1. 动态量化的概念动态量化 (Dynamic Quantization)是一种后训练量化Post-Training Quantization方法。特点只量化权重模型的权重从float32→int8减小模型存储大小。激活在推理时动态量化前向传播时激活会在每次计算时动态转换成int8再做矩阵运算。不需要重新训练直接对训练好的模型量化即可。适合 CPU 推理可以显著加速模型推理同时减少内存占用。适合全连接层和 LSTM对 Transformer、RNN、LSTM、全连接层效果好对卷积层效果有限。2. 动态量化原理对于一个全连接层y x W.T bW权重矩阵 → 量化成 int8x输入激活 → 保持 float32前向计算时动态量化矩阵乘法在 int8 上计算然后转换回 float32 输出。优势模型大小减小 3~4 倍推理速度提升 2~4 倍CPU 上明显3. PyTorch 使用示例以你之前的SimpleModel为例importtorchimporttorch.nnasnnfromtorch.quantizationimportquantize_dynamic# 定义模型classSimpleModel(nn.Module):def__init__(self):super().__init__()self.fc1nn.Linear(128,96)self.fc2nn.Linear(96,64)self.fc3nn.Linear(64,32)self.relunn.ReLU()defforward(self,x):xself.relu(self.fc1(x))xself.relu(self.fc2(x))outself.fc3(x)returnout# 创建并训练好的模型假设已经训练好modelSimpleModel()# ----------------------------# 模拟训练完成直接量化# ----------------------------# 对全连接层进行动态量化quantized_modelquantize_dynamic(model,# 原始模型{nn.Linear},# 只量化 Linear 层dtypetorch.qint8# 量化数据类型)# 保存量化后的模型torch.save(quantized_model.state_dict(),simple_model_dynamic_quant.pth)# 使用量化模型进行推理quantized_model.eval()x_newtorch.randn(5,128)withtorch.no_grad():y_predquantized_model(x_new)print(动态量化模型输出形状:,y_pred.shape)# [5, 32]4. 动态量化特点总结特性动态量化权重类型int8激活类型float32 → 推理时动态量化是否需要训练不需要适用层Linear, LSTM, Transformer优势模型小推理快兼容 CPU缺点对卷积网络加速有限精度可能略下降✅小结动态量化训练后直接量化 → CPU 推理加速 → 不改训练代码静态量化/量化感知训练 (QAT)需要校准或训练 → 精度更高 → GPU/CPU 均可