onnxruntime 是个啥子?

我们都知道onnx,onnx只是一个协议格式,它没有具体的推理框架。我们知道,不同厂商,它的推理框架速度有很大的差异。我们有自己做的,比如ncnn,mnn,mace这些都是前向推理框架,他们也可以用来推理onnx模型。这是在CPU上,这些框架CPU的速度毫无疑问,比得上intel吗?比的过openvino吗?不一定。
另外一个就是GPU,你pytorch的GPU推理速度能比得过英伟达人家的TensorRT吗?比不过,至少差三倍的速度。为什么会有这么大的差别?
原因很简单,人家卖硬件的,为了让你用它的硬件,肯定会想方设法让你在硬件上速度更快,这是刚需,你对CPU的了解能比得过intel?你对GPU的了解能比得过NVIDIA??

那么onnxruntime是个什么鬼呢?

onnxruntime是一个实实在在的onnx模型推理引擎,但,它统一了一个前端接口,而真正的实现支持openvino,支持mkldnn,支持TensorRT,支持CUDA,也支持CPU,换句话说,一次编写,可以直接根据硬件使用对应的库来编译。

这个很管用。那么它的速度gain到底有多大呢?

先安装一下onnxruntime吧。我们将用onnxruntime的GPU库 (不带TensorRT)来推理一下maskrcnn,看看速度和官方的pytorch、比有多大的提升。
为了加上tensorrt支持,你需要下载一下tensorrt,根据你的系统版本。解压到 ~/tensorrt5.1.5 5.1.5是最新的TensorRT。下面我们将要用到。

  1. 安装
git clone --recursive https://github.com/microsoft/onnxruntime

# 如果你遇到了libFuzzer clone不下来,从这个地方下载[Fuzzer.zip](https://github.com/alibaba/euler/files/2991980/Fuzzer.zip)解压到对应的目录,这个没有办法,Q在那儿。注意文件夹的名字不要错: https://github.com/alibaba/euler/files/2991980/Fuzzer.zip
# 注意,这里把解压后的mv的时候要把.git也move过去。

./build.sh \
	--use_cuda \
	--cuda_version=10.0 \
	--cuda_home=/usr/local/cuda \
	--cudnn_home=/usr/local/cuda \
	--use_tensorrt --tensorrt_home=$HOME/TensorRT \
	--build_shared_lib --enable_pybind \
	--build_wheel --update --build

其实也简单,通过 build.sh 来编译。

6bf5d374-fc74-440e-88bf-3c03406ca341-image.png

可以看到,onnxruntime里面实际上有很多GPU或者CPU的实现,来支持onnx的各种operators.

如果你能开始编译,请评论一下.

onnxruntime 编译完了之后,如何进一步安装对应的python wrapper呢?
实际上已经生成了:

onnxruntime                   0.5.0                  
onnxruntime-gpu-tensorrt      0.5.0     

但是这个wheel文件怎么没有找到呢。。。

更新
由于最近总是忘记onnxtensorrt如何编译。这里再记录一下,如何编译 onnx-tensorrt 以及TensorRT两个工程。

  • onnx-tensorrt:
git clone --recursive https://github.com/onnx/onnx-tensorrt.git
cd onnx-tensorrt
cmake -DTENSORRT_ROOT=~/TensorRT  ..

其中~/TensorRT 是你的tensorrt的安装位置。但是请注意,你要根据你的tensorrt版本去编译不同的onnx-tensorrt版本,现在master branch应该是需要tensorrt6.0