ONNX模型交换格式与转换
解释ONNX(Open Neural Network Exchange)是什么,以及如何将PyTorch/TensorFlow模型转换为ONNX并优化。
回答
苦行僧
ONNX (Open Neural Network Exchange) 是微软和Meta联合开发的开放神经网络交换格式,旨在实现不同框架间的模型互操作。
核心概念:
- 计算图表示为
.onnx格式(Protocol Buffers序列化) - 标准算子集(operator set)定义了400+操作
- 支持PyTorch、TensorFlow、Keras、PaddlePaddle等框架导出
PyTorch转ONNX:
torch.onnx.export(
model, dummy_input, "model.onnx",
input_names=['input'],
output_names=['output'],
dynamic_axes={'input': {0: 'batch_size'}},
opset_version=17
)
优化技术:
- ONNX Runtime:微软的跨平台推理引擎
- 图优化(Graph Optimization):常量折叠、算子融合、节点消除
- 量化(Quantization):FP16/INT8精度降低,速度提升2-4x
- 执行提供者(Execution Provider):CPU(MLAS)、CUDA、TensorRT、OpenVINO、CoreML
常见问题:
- 动态Control Flow不支持
- 部分PyTorch操作(如某些In-place操作)需手动替换
opset_version选择需权衡功能兼容性
ONNX是边缘部署和跨平台推理的标准中间格式。