如何静态编译onnxruntime-gpu+CUDA+cuDNN+TensorRT在VS2017上实现GPU加速?
摘要:用vs2017 qt5.12 静态编译onnxruntime-gpu CUDA cuDNN TensorRT的完整教程
因为工作业务需求的关系,需编译onnxruntime引入项目中使用,主项目exe是使用的vs2017+qt5.12。
onnxruntime就不用介绍是啥了撒,在优化和加速AI机器学习推理和训练这块赫赫有名就是了。
有现成的别人编译好的只有dll动态库,当然我们显然是不可能使用的,因为BOSS首先就提出一定要让发布出去的程序体积尽量变少,我肯定是无法精细的拆分哪一些用到了的,哪一些代码是没用到的,还多次强调同时执行效率当然也要杠杠滴。
所以下面就开始描述这几天一系列坎坷之路,留个记录,希望过久了自己不会忘记吧,如果能帮助到某些同行少走些弯路也最好:
1. Clone repo
诧一听你可能会觉得一个大名鼎鼎的Microsoft开源项目,又是在自家的Windows上编译应该很简单很容易吧?
的确我一开始也是这样认为的,犯了太藐视的心态来对待他。
一开始就使用git clone下来代码,分支先锁定在rel-1.13.1发行版上。
简单cmake跑了下,这些就省略,发现少了一些external里面的子项目的引用,
这当然难不倒我,简单,git --recursive 重新下载所有的submodules。
碍于网络情况,等待许久时间下载到一半就断了,后来给git设置了代理,下载完成。
2. CMake Configure
后来等待cmake跑先编译纯cpu的版本(不带gpu并行运算加速)。
具体表现在cmake上是设置 onnxruntime_USE_CUDA 、onnxruntime_USE_TENSORRT、onnxruntime_USE_ROCM 等等一系列环境变量设置 False。
现在都忘记中间的过程了,反正自己鼓弄后来发现这步骤,最好是使用他所提供的一个python脚本,内部去调用cmake生成项目。这个步骤在它onnxruntime的官方文档上有说。
大概就是用这个脚本项目根目录上的build.bat 去执行。
内部会调用 onnxruntime\tools\ci_build\build.py 去跑cmake,内部会用cmake Configure和Generate版本。
前提是很多参数需要提前设置好,比如说我是预先执行这一串命令:
set ZLIB_INCLUDE_DIR=D:\extlibs\zlib\build-msvc-static\install\include/
set ZLIB_LIBRARY=D:/extlibs/zlib/build-msvc-static/install/lib/
set ZLIB_LIBRARY_DEBUG=D:/extlibs/zlib/build-msvc-static/install/lib/zlibstaticd.lib
set ZLIB_LIBRARY_RELEASE=D:/extlibs/zlib/build-msvc-static/install/lib/zlibstatic.lib
set CUDA_HOME=F:\NVIDIA\CUDA\v11.6
set CUDNN_HOME=F:\NVIDIA\CUDNN\v8.5
set TENSORRT_HOME=F:\NVIDIA\TensorRT\v8.4.3.1
set HTTP_PROXY=http://127.0.0.1:10809 rem 你懂的
set HTTPS_PROXY=http://127.0.0.1:10809 rem 你懂的
然后执行:
build.bat --config RelWithDebInfo --skip_tests --parallel --cmake_generator "Visual Studio 15 2017"
中间肯定是不会一次成功的,相信我,后来再跑到cmake成功后,我用cmake-gui重新打开刚刚generate好的project,发现有不少环境变量需要调整,比如一些test不需要,一些unit_test不需要,所有shared_lib都改成static_lib,还有absl需要使用自己编译的,AVX2和AVX等CPU指令加速都开启来。当然这些只是小试牛刀,后面还有更多隐晦的参数需要改动。
