我第一次以与本教程相同的方式完成了 PyTorch 模块的量化和脚本化过程:https ://leimao.github.io/blog/PyTorch-Static-Quantization/
教程代码运行良好,但是当我将它翻译成我自己的编码器解码器模块时,我看到了一些奇怪的行为。所以这里有一些相关的代码:
def measure_inference_latency(model, input_size, num_samples=100, num_warmups=10):
model.eval()
x = torch.rand(size=input_size)
with torch.no_grad():
for _ in range(num_warmups):
_ = model(x)
# torch.cuda.synchronize()
with torch.no_grad():
start_time = time.time()
for _ in trange(num_samples):
_ = model(x)
# torch.cuda.synchronize()
end_time = time.time()
elapsed_time = end_time - start_time
elapsed_time_ave = elapsed_time / num_samples
return elapsed_time_ave
num_samples = 5
fp32_latency = measure_inference_latency(model_fp32, input_size = [1, 3] + CFG.image_dim, num_samples=num_samples)
q_latency = measure_inference_latency(model_q, input_size = [1, 3] + CFG.image_dim, num_samples=num_samples)
start = time.time()
qj_latency = measure_inference_latency(model_qj, input_size = [1, 3] + CFG.image_dim, num_samples=num_samples)
print(time.time() - start)
我得到的输出是:
FP32 inference latency: 269.17 ms
Quantized inference latency: 38.93 ms
Quantized + JIT inference latency: 24.36 ms
看起来很合理,但这是我注意到的问题:
- 在挂钟时间,这
qj_latency
条线运行了大约 17 秒。我将其缩小到measure_inference_latency
未包含在最后报告的时间中的预热步骤。当我在热身中添加进度条时,我注意到大部分时间都在第一步。TorchScript 模块需要很长的预热时间吗? - 有一次我的整台电脑刚刚关闭(Ubuntu 20.04.2 LTS)。
我知道我没有提供完整的代码,但首先我想知道是否有一个我不知道的明显答案。