模型量化后性能下降原因排查
在PyTorch模型量化实践中,我们遇到了一个典型问题:量化后的模型推理速度反而比原始浮点模型更慢。本文将通过具体案例分析可能的原因。
问题复现
我们使用以下代码进行量化测试:
import torch
import torch.quantization as quantization
class SimpleModel(torch.nn.Module):
def __init__(self):
super().__init__()
self.conv1 = torch.nn.Conv2d(3, 64, 3)
self.relu = torch.nn.ReLU()
self.fc = torch.nn.Linear(64 * 30 * 30, 10)
def forward(self, x):
x = self.relu(self.conv1(x))
x = x.view(x.size(0), -1)
x = self.fc(x)
return x
model = SimpleModel()
model.eval()
# 量化配置
model.qconfig = quantization.get_default_qconfig('fbgemm')
quantized_model = quantization.prepare(model)
quantized_model = quantization.convert(quantized_model)
性能测试结果
我们使用以下代码测试推理性能:
import time
def benchmark(model, input_tensor, iterations=100):
model.eval()
with torch.no_grad():
# 预热
for _ in range(10):
_ = model(input_tensor)
start_time = time.time()
for _ in range(iterations):
_ = model(input_tensor)
end_time = time.time()
return (end_time - start_time) / iterations
input_tensor = torch.randn(1, 3, 224, 224)
baseline_time = benchmark(model, input_tensor)
quantized_time = benchmark(quantized_model, input_tensor)
print(f'Baseline: {baseline_time:.6f}s')
print(f'Quantized: {quantized_time:.6f}s')
可能原因分析
-
量化粒度问题:默认配置的
fbgemm后端在小模型上开销较大,建议使用qnnpack后端:model.qconfig = quantization.get_default_qconfig('qnnpack') -
CPU架构适配:检查是否启用了AVX指令集支持。
-
量化精度损失:在某些层上量化误差过大,可使用动态量化或混合精度方案。

讨论