简介
ONNX Runtime是一个用于ONNX(Open Neural Network Exchange)模型推理的引擎。微软联合Facebook等在2017年搞了个深度学习以及机器学习模型的格式标准–ONNX,顺路提供了一个专门用于ONNX模型推理的引擎,onnxruntime。目前ONNX Runtime 还只能跑在HOST端,不过官网也表示,对于移动端的适配工作也在进行中。
一半处于工作需要一半出于兴趣,决定阅读一下onnxruntime的源码。这里算个学习记录吧。
安装
ONNX Runtime 的GitHub仓库地址为 https://github.com/microsoft/onnxruntime 。编译安装过程可以参照GitHub上的说明,这里为了方便,直接选择了PyPi的安装源。执行
pip install onnxruntime
即完成了安装。需要注意的是只支持Python3。
开始
涉及文件
onnxruntime\onnxruntime\python\session.py
onnxruntime\onnxruntime\core\framework\utils.cc
onnxruntime\onnxruntime\python\onnxruntime_pybind_state.cc
onnxruntime\onnxruntime\core\session\inference_session.cc
onnxruntime\onnxruntime\core\session\inference_session.h
代码入口
代码阅读需要先找到一个入口。通过onnxruntime的例子我们知道,在Python使用使用onnxruntime很简单,主要代码就三行:
import onnxruntime
sess = onnxruntime.InferenceSession('YouModelPath.onnx')
output = sess.run([output_nodes], {
input_nodes: x})
第一行导入onnxruntime模块;第二行创建一个InferenceSession
的实例并传给它一个模型地址;第三行调用run
方法进行模型推理。因此onnxruntime模块中的InferenceSession
就是我们的切入点。
实例生成
ONNX Runtime的代码组织非常良好,我们很容易找到InferenceSession
所在文件session.py
,整个文件非常简单,就只定义了一个InferenceSession
类。通过阅读InferenceSession
的__init__
函数,
def __init__(self, path_or_bytes, sess_options=None, providers=[]):
"""
:param path_or_bytes: filename or serialized model in a byte string
:param sess_options: session options
:param providers: providers to use for session. If empty, will use
all available providers.
"""
self._path_or_bytes = path_or_bytes
self._sess_options = sess