(O^^O)你是怎么用tensorRT開發的,我是這樣的


作為一個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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM