ONNX - 它到底快在哪,又慢在哪
ONNX - 它到底快在哪,又慢在哪 一、ONNX 是什么 ONNX(Open Neural Network Exchange)本质上是一种模型的中间表示格式(IR),类似于编译器里的 LLVM IR。 用 PyTorch 训练完一个模型之后,模型的计算逻辑是用 Python 描述的,跑推理的时候要经过 Python 解释器、PyTorch 的调度器、再到底层的 CUDA kernel。这条链路很长,开销不小。ONNX 做的事情是:把模型的计算图从 PyTorch 的世界里"导出"成一个独立的、与框架无关的静态计算图,然后交给专门的推理引擎(比如 ONNX Runtime)去执行。 打个比方:PyTorch 训练出来的模型像一份 Python 脚本,每次执行都要解释器逐行翻译;ONNX 导出后的模型像一份编译好的二进制文件,直接跑就行。 一个典型的 ONNX 文件(.onnx)里面存的是: 计算图的拓扑结构(哪些算子、怎么连接) 每个算子的类型和参数(Conv、MatMul、Relu 等) 模型的权重(以 protobuf 格式序列化) 输入输出的 shape 和数据类型 这里要注意一点:ONNX 本身只是一个格式规范,它不负责执行。真正跑推理的是 ONNX Runtime(简称 ORT)或者其他兼容 ONNX 的推理引擎(TensorRT、OpenVINO 等)。说"用 ONNX 加速",实际上是"用 ONNX Runtime 加速"。 二、ONNX Runtime 为什么能快 理解了 ONNX 是什么之后,关键问题来了:为什么换个引擎跑就能快? 2.1 去掉了 Python 开销 PyTorch 推理时,即使模型本身的计算是在 GPU 上跑的,Python 层面仍然有大量开销: ...