NVIDIA TensorRT使用記錄
1. 準備工作
1) Pipeline
- train: 在Host PC的GPU上訓練
- test/deployment: 在TX1/TX2上部署使用
2) 主機部署步驟
- Running JetPack on the Host
$ ./JetPack-L4T-3.0-linux-x64.run
- Installing NVIDIA Driver on the Host
- Installing cuDNN on the Host
$ sudo dpkg -i libcudnn6_6.0.20-1+cuda8.0_amd64.deb
$ sudo dpkg -i libcudnn6-dev_6.0.20-1+cuda8.0_amd64.deb
- Installing NVcaffe on the Host
$ sudo apt-get install --no-install-recommends build-essential cmake git gfortran libatlas-base-dev libboost-filesystem-dev libboost-python-dev libboost-system-dev libboost-thread-dev libgflags-dev libgoogle-glog-dev libhdf5-serial-dev libleveldb-dev liblmdb-dev libprotobuf-dev libsnappy-dev protobuf-compiler python-all-dev python-dev python-h5py python-matplotlib python-numpy python-opencv python-pil python-pip python-protobuf python-scipy python-skimage python-sklearn python-setuptools
$ sudo pip install --upgrade pip
$ git clone -b caffe-0.15 http://github.com/NVIDIA/caffe
$ cd caffe
$ sudo pip install -r python/requirements.txt
$ mkdir build
$ cd build
$ cmake ../ -DCUDA_USE_STATIC_CUDA_RUNTIME=OFF
$ make --jobs=4
$ make pycaffe
- Installing DIGITS on the Host
NVIDIA DIGITS is a Python-based web service which interactively trains DNNs and manages datasets.
$ sudo apt-get install --no-install-recommends graphviz python-dev python-flask python-flaskext.wtf python-gevent python-h5py python-numpy python-pil python-pip python-protobuf python-scipy python-tk
$ git clone http://github.com/nvidia/DIGITS
$ cd DIGITS
$ sudo pip install -r requirements.txt
安裝完以后,運行 ./digits-devserver就可以打開DIGITS, 但是, 什么都不會發生, 我還以為會自動打開網頁啥的, 這只是打開服務器, 要在瀏覽器中輸入網址:http://localhost:5000/ 自己手動打開.
3) TX1/TX2部署步驟
- Cloning the Repo
$ sudo apt-get install git cmake
$ git clone http://github.com/dusty-nv/jetson-inference
- compile
注意: 在cmake時,會調用腳本CMakePrebuild.sh去下載一些依賴的包和訓練好的網絡, 那些訓練好的網絡需要翻墻下載, 可以自己下載完以后解壓到jetson-inference/data/networks目錄下.
$ cd jetson-inference
$ mkdir build
$ cd build
$ cmake ..
$ make
- 測試編譯是否成功, 運行一個classification的栗子, 如果output_0.jpg左上角有識別結果, 說明編譯成功,能夠正常使用了.
$ cd jetson-inference/build/aarch64/bin
> ./imagenet-console orange_0.jpg output_0.jpg
2. DIGITS訓練自己的模型并使用
1) 訓練步驟
- 下載/構建數據集.
數據集的文件夾格式為: 根目錄下有train(訓練集),val(驗證集),test(測試集)三個文件夾, 每個文件夾下面有images和labels兩個子文件夾. images下是圖片數據(.png), labels下是標簽數據(.txt), 每個圖片a.png都有對應的一個標簽a.txt. 用的kitti的數據, 標簽數據的格式采用kitti的數據格式
驗證集與測試集的區別?
驗證集是在訓練時使用, 用來調節網絡中的超參數. 測試集不參與訓練, 在整個網絡訓練完成后來測試訓練結果的性能.
- 打開DIGITS
在jetson-inference目錄下運行digits-devserver打開DIGITS服務器, 然后在瀏覽器中輸入 http://localhost:5000/ 進入DIDITS客戶端. - 導入DIGITS數據集
參照git上的readme, 在datasets標簽頁導入剛才的數據集.
導入數據集時, 圖像的尺寸是可以改的, 用640480的圖片做過訓練,把尺寸改成640480, 是可以用的.
- 訓練模型
參照readme構建模型, 教程中是用的custom模型, 自己寫入model.prototxt描述網絡的結構, 然后在pretrained models填入googlenet的caffemodel, 應該是使用之前已經訓練過的權值. 創建完以后,就自動訓練了, 然后就等待訓練完成.
訓練的過程中需要看mAP是否在增加, 如果一直是0, 那肯定是有問題的, 應該停掉訓練排查問題
- 測試模型
訓練完成后, 在標簽頁可以選擇測試圖片或測試數據集.
- **遇到的坑: 在自己構建數據集訓練前, 一定要確認一下數據標注沒問題, **不然就白訓練了. 訓練一次少說也要半天, 這個確認還是很有必要.
- 訓練過程中是可以用中間結果去測試單張圖片(不能測試多張,因為測試多張需要用GPU, 而訓練過程中GPU資源被占用掉了), 在前期經常輸入一些圖像看測試結果, 這個步驟很重要, 能夠在早期發現訓練任務是不是有問題,從而避免了花了幾天時間訓練完發現輸入錯了的尷尬, 如果用train的圖像取做test都啥都檢測不出來, 說明肯定是訓練任務有問題, 比如label錯了什么的.
- 一般趨勢是: 模型在剛開始是誤檢比較多, 隨著epoch增加, 誤檢越來越少, bbox越來越準
2) TX2上跑自己訓練好的模型
當DIGITS訓練好模型后, 用DIGITS測試過模型沒問題后, 可以把模型放到tx2上使用了,步驟如下:
- 選擇最后一個epoch然后點download model, 會下載一個壓縮包, 名字類似于20170801-222946-5eb0_epoch_100.0.tar.gz.將該壓縮包用U盤,網線等任何方式拷貝到tx2上
- 將壓縮包解壓到jetson-inference/data/networks目錄下, 可以看到解壓后里面有好幾個文件, 其中deploy.prototxt是描述網絡結構的, snapshot_iter_37100.caffemodel(名字不一定完全一樣)是網絡的權值, 其他的還不知道是啥
- 運行處理離線圖片的程序, input_blob, output_cvg, output_bbox貌似可以不要設, 只要設置一下模型結果的prototxt文件和模型權值caffemodel文件就行.
./detectnet-console dog_0.jpg output_0.jpg
--prototxt=<你的模型目錄>/deploy.prototxt
--model=<你的模型目錄>/snapshot_iter_38600.caffemodel
--input_blob=data \
--output_cvg=coverage
--output_bbox=bboxes
- 運行在線程序(需要連接相機): 如果是用USB相機, 需要改下源碼, 打開jetson-inference/detectnet-camera/detectnet-camera.cpp, 把DEFAULT_CAMERA宏從-1改成0(如果0不行再改成1依次加1試吧, 最好先用cheese確認USB相機能成功連上)
./detectnet-camera
--prototxt=<你的模型目錄>/deploy.prototxt
--model=<你的模型目錄>/snapshot_iter_38600.caffemodel
3 在Host PC上安裝jetson-inference
操作環境: Host PC x86_64平臺, Ubuntu14.04, GPU: Geforce GTX 1050, cuda8.0.
默認已經裝好了NVIDIA驅動和CUDA, 可參見之前的主機部署.
1) 安裝tensorRT
進入官網https://developer.nvidia.com/tensorrt, 點擊download下載, 需要注冊用戶并登錄才能下載. 登錄后, 就會看到下載連接和安裝提示, 選擇Debian安裝, 提示如下.

根據操作系統14.04和CUDA版本8.0選擇第二個package. 然后根據提示安裝即可.
2) 安裝jetson-inference
- 先下載jetson-inference代碼, 代碼在x86平臺不能直接編譯, 需要做一些修改
- 把CMakePrebuild.sh中下面兩行注釋掉:
# sudo rm /usr/lib/aarch64-linux-gnu/libGL.so
# sudo ln -s /usr/lib/aarch64-linux-gnu/tegra/libGL.so /usr/lib/aarch64-linux-gnu/libGL.so
或者可以干脆不運行這個腳本, 這個腳本主要是apt-get安裝依賴庫和wget下載網絡模型. 自己apt-get安裝,自己下模型也是一樣的.
- 修改CMakelist.txt, 增加x86平臺的GPU架構, 我的GPU是GTX1050, 架構是61, 所以在第32~38中, 增加一行. 如果是別的GPU,可以去https://developer.nvidia.com/cuda-gpus上查看, 架構就是Compute Capability, 如果Compute Capability是6.1那就寫61,如果Compute Capability是5.2,那就寫52.
set(
CUDA_NVCC_FLAGS
${CUDA_NVCC_FLAGS};
-O3
-gencode arch=compute_53,code=sm_53
-gencode arch=compute_62,code=sm_62
-gencode arch=compute_61,code=sm_61 #這是我增加的行
)
- 修改CMakelist.txt, 在上面文本的后面添加一行, 以使CUDA支持c++11
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};--disable-warnings;--ptxas-options=-v;-use_fast_math;-lineinfo;-std=c++11)
- 編譯安裝, 參見1-3)