PyTorch 2.0 于 2022 年 12 月上旬在 NeurIPS 2022 上公布,它新增的 torch.compile 组件引起了宽泛关注,因为该组件宣称比 PyTorch 的先前版本带来更大的计算速度晋升。
这对咱们来说是一个好消息,训练工夫改良的后果令人印象粗浅。PyTorch 团队在公布新闻稿和 PyTorch GitHub 上没有提到的是 PyTorch 2.0 推理性能。所以咱们来对推理的速度做一个简略的钻研,这样能够理解 PyTorch 2.0 如何与其余推理加速器(如 Nvidia TensorRT 和 ONNX Runtime)是否还有差距。
咱们应用 Nebuly 的开源库 Speedster 运行了一些推理测试,对于这个咱们这个测试,Speedster 容许咱们运行 TensorRT、ONNX Runtime,并将它们与 16 位和 8 位动静和动态量化相结合(仅用 2 行代码)。在测试期间,咱们还应用 Speedster 收集无关顶级策略的性能信息,以缩小推理提早。
这次测试是在带有 ResNet 的 Nvidia 3090Ti GPU 进行的,与 PyTorch 2.0 新闻稿中示例中应用的模型雷同。
PyTorch 2.0 的推理性能后果如下图:
以下是测试后果的 4 个要点总结:
- 批量大小越大 PyTorch 2.0 的速度晋升越显著(与前版本相比)。fp16 的精度在大批次时比 fp32 编译版本更无效,这应该是因为 Pytorch 2.0 编译次要是为训练而设计的,训练的批大小个别会高于推理(线上产品应用时)。对 fp16 的优化是很失常的,因为在训练时,咱们个别都会应用混合精度,特地是对于大型模型来说。
- ONNX Runtime 在较小的批量大小下比 PyTorch 2.0 体现更好,而在较大的批量大小下后果恰恰相反。这也是因为 ONNX Runtime 次要是为推理而设计的(通常应用较小的批大小),而 PyTorch 2.0 的次要指标是训练。
- PyTorch eager 模式和 PyTorch 2.0(已编译)都显示批大小 1 和 8 的运行工夫雷同。这阐明批大小等于 1 时没有应用全副计算能力,而其余推理的优化器,如 ONNX 运行时可能更好地治理计算能力。还是那句话这可能与 PyTorch 编译器次要为训练而设计无关,它会疏忽批大小不足以应用其内核的所有计算能力的状况。
- 在通过测试的 Nvidia GPU 上,TensorRT 在小批量和大批量方面的体现都远远优于其余。随着批量大小的减少,相对速度变得更快。这显示了 Nvidia 可能在推理时更好地利用硬件缓存,因为激活占用的内存随着批量大小线性增长,适当的内存应用能够大大提高性能。
基准测试高度依赖于所应用的数据、模型、硬件和优化技术。为了在推理中获得最佳性能,始终倡议在将模型部署到生产环境之前测试。
参考
Speedster 是一个开源工具,可硬件上主动利用 SOTA 优化技术实现最大的推理减速。
本文的代码在这里:
https://avoid.overfit.cn/post/0db857b606044b1db30210e32ca071af