作為一個AI打工人怎么能少得了在服務器端推理的框架TensorRT呢,但是安裝過的打工人知道,各種依賴,是讓人抓狂,那今天我來說一套我的方法
原理:GPU + nvidia-docker2 + tiny-TensorRT
先說下筆者的硬件環境(其實就是想秀波GPU)
首先給服務器安裝驅動
不用安裝cuda、cudnn等,具體請看筆者上篇博客 https://www.cnblogs.com/nanmi/p/14132105.html
安裝docker
既然使用容器化的東西,得安裝docker吧,版本安裝最新的就好了,網上教程一大堆就不寫了。
安裝nvidia-docker2
安裝過程可以參考bewithme大神的博客https://blog.csdn.net/bewithme/article/details/105092159 如果是別的系統的請百度對應的安裝方法,筆者宿主機是CentOS
測試安裝的是否能在容器中調用GPU不用按照網上教程直接下載nvidia/cuda鏡像,太大了,可以下載相應的tag版本,比如筆者這個就挺好才100多M
測試方法:
$ docker run --runtime=nvidia --rm nvidia/cuda:10.0-base nvidia-smi
有輸出顯卡的使用內容即成功
啟動tensorrt容器
$ docker pull venalone/tensorrt7:cuda10.2
$ docker pull nvcr.io/nvidia/tensorrt:20.12-py3
$ docker run -itd --name my_tensorrt_env --runtime=nvidia -p 0.0.0.0:xx:22 venalone/tensorrt7:cuda10.2 /bin/bash
$ docker run -itd --name my_tensorrt_env --runtime=nvidia -p 0.0.0.0:xx:22 nvcr.io/nvidia/tensorrt:20.12-py3 /bin/bash
進容器先看看
發現在容器的/usr/local/下cuda也有了,tensorrt也有了,此時python也沒有建立軟連接的,但是已經在/usr/local/bin下有python3了
開發環境都建立好了,那我要怎么開發呢,開發tensorrt C++可是很煩人呢,有人說那兒哦用tensorrt python API啊,實際上,我接觸到的是,大家沒人用python來做推理,那C++ API又很復雜,python API又應用不廣泛,
怎么辦呢?答案是tiny-TensorRT,GitHub項目地址 https://github.com/zerollzeng/tiny-tensorrt,這是大神Ren Zeng 在nvidia tensorrt C++ API的基礎上做了分裝,使得我這種混子之類的可以站在巨人的肩膀上開發
下載項目及子模塊
$ git clone --recurse-submodules -j8 https://github.com/zerollzeng/tiny-tensorrt.git $ cd tiny-tensorrt
該項目包含幾個部分:
cmake:定義了project CMakeLists.txt去查找你系統的架構、cuda等的函數
plugin:是當模型的某些OP不被支持,這是很常見的事情,自定義的插件代碼,里面又三個示例,插件才是靈魂啊!!!
pybind11:項目作者不僅考慮到C++作為入口,同時也考慮到python作為入口,這樣主體是C++的發揮其性能和靈活性,入口卻是python入口,果然是大神,膜拜。
spdlog:是輸出日志,打印等函數的分裝,這樣使用起來就好用了。
test:是測試調用該框架是最終是如何使用調用的呢,真的分裝很好了,極簡單了。
另外幾個文件:Int8Calibrator.cpp和其同名頭文件是用來做INT8單精度量化的,不了解原理的可以百度下,量化單精度時是分為飽和量化和不飽和量化,網絡模型的weight是做不飽和的量化(對稱量化),按比例壓縮到±127,而對每一層的響應做的是飽和量化,又叫非對稱量化,總之int8的模型weight是做不飽和量化,響應(激活值做飽和量化),這個會涉及到KL散度(相對熵),具體可參考我的另外稍早時候的博客,有對量化做詳細說明https://www.cnblogs.com/nanmi/p/13607515.html
PyTrt.cpp是為了做C++和python綁定用的,入口
Trt.cpp和Trt.h是代碼的核心之一,可以詳細閱讀
utils.h是定義了一些簡單的小工具的組件頭文件引用就可以
編譯
首先在/etc/profile配置環境變量
export CUDA_HOME=/usr/local/cuda export PATH=$CUDA_HOME/bin:$PATH export LD_LIBRARY_PATH=$CUDA_HOME/lib64$LD_LIBRARY_PATH export TENSORRT_HOME=/usr/local/TensorRT-7.0.0.11/ export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:${TENSORRT_HOME}/include export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${TENSORRT_HOME}/lib export LIBRARY_PATH=$LIBRARY_PATH:${TENSORRT_HOME}/lib export PATH=$PATH:${TENSORRT_HOME}/bin
然后編譯
修改CMakeLists.txt中放開編譯python、test的選項ON
$ cd tiny-tensorrt $ mkdir -p build && cd build $ cmake .. $ make -j32
編譯完成后,會產生libtinytrt.so結合Trt.h只需要這兩個就可以完成對該封裝的使用,使用示例在test文件夾下
Reference
[1] https://github.com/zerollzeng/tiny-tensorrt
[2] https://github.com/zerollzeng/tiny-tensorrt/blob/master/docs/CustomPlugin-CN.md