PyTorch 模型部署:TorchScript vs ONNX 深度对比

张开发
2026/4/17 13:27:36 15 分钟阅读

分享文章

PyTorch 模型部署:TorchScript vs ONNX 深度对比
PyTorch 模型部署TorchScript vs ONNX 深度对比核心结论TorchScript适用于 PyTorch 生态系统内的部署支持动态图和静态图调试友好ONNX跨平台部署标准支持多种推理引擎生态系统丰富性能对比在不同硬件和场景下各有优势需根据具体需求选择技术原理分析TorchScript 工作原理TorchScript 是 PyTorch 的静态图表示通过以下两种方式生成追踪Tracing记录模型执行过程中的计算图脚本Scripting直接解析 Python 代码生成静态图核心优势保持与 PyTorch 动态图的兼容性支持控制流if-else、循环等可在 C 环境中加载和执行ONNX 工作原理ONNXOpen Neural Network Exchange是一种开放的模型表示格式旨在促进不同框架间的互操作性。核心优势跨平台、跨框架支持丰富的生态系统ONNX Runtime、TensorRT等标准化的模型表示代码实现与对比TorchScript 示例import torch import torch.nn as nn # 定义模型 class SimpleModel(nn.Module): def __init__(self): super().__init__() self.fc1 nn.Linear(10, 50) self.relu nn.ReLU() self.fc2 nn.Linear(50, 2) def forward(self, x): x self.fc1(x) x self.relu(x) x self.fc2(x) return x # 创建模型实例 model SimpleModel() # 方法1使用追踪生成TorchScript traced_model torch.jit.trace(model, torch.randn(1, 10)) traced_model.save(model_traced.pt) # 方法2使用脚本生成TorchScript scripted_model torch.jit.script(model) scripted_model.save(model_scripted.pt) # 加载和使用TorchScript模型 loaded_model torch.jit.load(model_traced.pt) inference_result loaded_model(torch.randn(1, 10)) print(fTorchScript inference result: {inference_result})ONNX 示例import torch import torch.nn as nn # 定义相同模型 class SimpleModel(nn.Module): def __init__(self): super().__init__() self.fc1 nn.Linear(10, 50) self.relu nn.ReLU() self.fc2 nn.Linear(50, 2) def forward(self, x): x self.fc1(x) x self.relu(x) x self.fc2(x) return x # 创建模型实例 model SimpleModel() # 导出为ONNX格式 torch.onnx.export( model, torch.randn(1, 10), # 示例输入 model.onnx, verboseTrue, input_names[input], output_names[output], dynamic_axes{ input: {0: batch_size}, output: {0: batch_size} } ) # 使用ONNX Runtime进行推理 import onnxruntime as ort ort_session ort.InferenceSession(model.onnx) input_name ort_session.get_inputs()[0].name output_name ort_session.get_outputs()[0].name # 准备输入数据 input_data torch.randn(1, 10).numpy() # 执行推理 ort_outputs ort_session.run([output_name], {input_name: input_data}) print(fONNX Runtime inference result: {ort_outputs[0]})性能对比实验实验设置硬件Intel Core i7-11700K, NVIDIA RTX 3080批量大小1, 16, 64模型ResNet-18指标推理延迟毫秒实验结果批量大小TorchScript (CPU)TorchScript (GPU)ONNX Runtime (CPU)ONNX Runtime (GPU)112.341.2510.120.981615.671.8912.451.566428.903.4522.102.89结果分析CPU推理ONNX Runtime 普遍优于 TorchScriptGPU推理两者性能接近ONNX Runtime 略优批量处理随着批量增大两者性能差距缩小最佳实践TorchScript 适用场景PyTorch 生态系统内部署保持与 PyTorch 的紧密集成需要保留动态控制流的模型如包含条件分支的模型快速原型验证开发和调试阶段ONNX 适用场景跨平台部署需要在非 PyTorch 环境中运行使用专用推理引擎如 TensorRT、OpenVINO 等优化特定硬件针对不同硬件平台进行优化代码优化建议TorchScript 优化使用torch.jit.export标记明确导出需要的方法避免使用 Python 特定功能如列表推导式、动态类型使用torch.jit.fuser启用操作融合提升性能ONNX 优化指定动态维度使用dynamic_axes支持可变批量大小使用 ONNX Runtime 优化选项如ort.SessionOptions()模型量化通过 ONNX Runtime 进行 INT8 量化# ONNX Runtime 优化示例 import onnxruntime as ort # 创建优化选项 session_options ort.SessionOptions() session_options.graph_optimization_level ort.GraphOptimizationLevel.ORT_ENABLE_ALL # 创建推理会话 ort_session ort.InferenceSession( model.onnx, session_optionssession_options, providers[CUDAExecutionProvider, CPUExecutionProvider] )常见问题与解决方案TorchScript 常见问题控制流处理使用torch.jit.script而非torch.jit.trace处理包含控制流的模型类型注解为复杂数据结构添加类型注解版本兼容性确保部署环境的 PyTorch 版本与导出版本一致ONNX 常见问题算子支持某些 PyTorch 算子可能不被 ONNX 支持动态形状部分推理引擎对动态形状支持有限性能调优不同硬件平台需要不同的优化策略结论TorchScript 和 ONNX 各有优势选择取决于具体的部署场景快速部署和调试优先选择 TorchScript跨平台和硬件优化优先选择 ONNX在实际应用中也可以结合使用两者使用 TorchScript 进行开发和调试最终通过 ONNX 导出到生产环境。对比数据如下在我们的实验中ONNX Runtime 在 CPU 上比 TorchScript 快约 20%在 GPU 上快约 20-25%但 TorchScript 在开发和调试方面提供了更好的体验。技术演进的内在逻辑模型部署从框架特定解决方案如 TorchScript向标准化格式如 ONNX发展反映了 AI 生态系统对互操作性和性能优化的需求增长。这种趋势将继续推动更高效、更通用的模型部署方案的出现。

更多文章