ONNX:
把不同深度学习框架里的模型,统一描述成一种标准的计算图。
YOLO模型原来是PyTorch的yolo.pt,里面包含:
网络结构和权重
导出ONNX后,会把Pytorch中的网络计算过程转换成ONNX能理解的标准结构。
ONNX模型主要包含三类东西:
计算图:规定数据按什么顺序流动。
算子:例如Conv、Add、Mul、Concat、Resize。
参数/权重:例如卷积核权重、Bias等。
ONNX本质上不是一个训练框架,而更像一个中间标准格式。
Pytorch-->.pt-->.onnx--> TensoRT/openVINO/Sophon/ONNX Runtime
它解决的问题是不同框架、不同硬件之间直接转换很麻烦。ONN在中间充当翻译。
拿一个简单卷积网络来说,PyTorch的代码可能是:
x = conv(x)
x = relu(x)
x = pool(x)
导出ONNX后,不再关心这段PyTorch Python代码,而变成:
Input
↓
Conv
↓
Relu
↓
MaxPool
↓
Output
部署框架读取这个计算图,就知道先做卷积、再做激活、再做池化。
因此,ONNX的运行逻辑就是:
输入 Tensor
↓
按照计算图执行算子
↓
读取模型权重参与计算
↓
生成中间 Tensor
↓
继续执行下一个算子
↓
最终输出