NVIDIA TensorRT使用記錄

NVIDIA TensorRT使用記錄

1. 準備工作

1) Pipeline

  • train: 在Host PC的GPU上訓練
  • test/deployment: 在TX1/TX2上部署使用

2) 主機部署步驟

  1. Running JetPack on the Host
$ ./JetPack-L4T-3.0-linux-x64.run 
  1. Installing NVIDIA Driver on the Host
  2. 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
  1. 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
  1. 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部署步驟

  1. Cloning the Repo
$ sudo apt-get install git cmake
$ git clone http://github.com/dusty-nv/jetson-inference
  1. compile
    注意: 在cmake時,會調用腳本CMakePrebuild.sh去下載一些依賴的包和訓練好的網絡, 那些訓練好的網絡需要翻墻下載, 可以自己下載完以后解壓到jetson-inference/data/networks目錄下.
$ cd jetson-inference
$ mkdir build
$ cd build
$ cmake ..
$ make
  1. 測試編譯是否成功, 運行一個classification的栗子, 如果output_0.jpg左上角有識別結果, 說明編譯成功,能夠正常使用了.
$ cd jetson-inference/build/aarch64/bin
> ./imagenet-console orange_0.jpg output_0.jpg

2. DIGITS訓練自己的模型并使用

1) 訓練步驟

  1. 下載/構建數據集.
    數據集的文件夾格式為: 根目錄下有train(訓練集),val(驗證集),test(測試集)三個文件夾, 每個文件夾下面有images和labels兩個子文件夾. images下是圖片數據(.png), labels下是標簽數據(.txt), 每個圖片a.png都有對應的一個標簽a.txt. 用的kitti的數據, 標簽數據的格式采用kitti的數據格式

驗證集與測試集的區別?
驗證集是在訓練時使用, 用來調節網絡中的超參數. 測試集不參與訓練, 在整個網絡訓練完成后來測試訓練結果的性能.

  1. 打開DIGITS
    在jetson-inference目錄下運行digits-devserver打開DIGITS服務器, 然后在瀏覽器中輸入 http://localhost:5000/ 進入DIDITS客戶端.
  2. 導入DIGITS數據集
    參照git上的readme, 在datasets標簽頁導入剛才的數據集.

導入數據集時, 圖像的尺寸是可以改的, 用640480的圖片做過訓練,把尺寸改成640480, 是可以用的.

  1. 訓練模型
    參照readme構建模型, 教程中是用的custom模型, 自己寫入model.prototxt描述網絡的結構, 然后在pretrained models填入googlenet的caffemodel, 應該是使用之前已經訓練過的權值. 創建完以后,就自動訓練了, 然后就等待訓練完成.

訓練的過程中需要看mAP是否在增加, 如果一直是0, 那肯定是有問題的, 應該停掉訓練排查問題

  1. 測試模型
    訓練完成后, 在標簽頁可以選擇測試圖片或測試數據集.
  • **遇到的坑: 在自己構建數據集訓練前, 一定要確認一下數據標注沒問題, **不然就白訓練了. 訓練一次少說也要半天, 這個確認還是很有必要.
  • 訓練過程中是可以用中間結果去測試單張圖片(不能測試多張,因為測試多張需要用GPU, 而訓練過程中GPU資源被占用掉了), 在前期經常輸入一些圖像看測試結果, 這個步驟很重要, 能夠在早期發現訓練任務是不是有問題,從而避免了花了幾天時間訓練完發現輸入錯了的尷尬, 如果用train的圖像取做test都啥都檢測不出來, 說明肯定是訓練任務有問題, 比如label錯了什么的.
  • 一般趨勢是: 模型在剛開始是誤檢比較多, 隨著epoch增加, 誤檢越來越少, bbox越來越準

2) TX2上跑自己訓練好的模型

當DIGITS訓練好模型后, 用DIGITS測試過模型沒問題后, 可以把模型放到tx2上使用了,步驟如下:

  1. 選擇最后一個epoch然后點download model, 會下載一個壓縮包, 名字類似于20170801-222946-5eb0_epoch_100.0.tar.gz.將該壓縮包用U盤,網線等任何方式拷貝到tx2上
  2. 將壓縮包解壓到jetson-inference/data/networks目錄下, 可以看到解壓后里面有好幾個文件, 其中deploy.prototxt是描述網絡結構的, snapshot_iter_37100.caffemodel(名字不一定完全一樣)是網絡的權值, 其他的還不知道是啥
  3. 運行處理離線圖片的程序, 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

  1. 運行在線程序(需要連接相機): 如果是用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安裝, 提示如下.
![](./Screenshot from 2017-09-20 11:38:32.png)
根據操作系統14.04和CUDA版本8.0選擇第二個package. 然后根據提示安裝即可.

2) 安裝jetson-inference

  1. 先下載jetson-inference代碼, 代碼在x86平臺不能直接編譯, 需要做一些修改

git clone https://github.com/dusty-nv/jetson-inference.git

  1. 把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安裝,自己下模型也是一樣的.

  1. 修改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 #這是我增加的行
)
  1. 修改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. 編譯安裝, 參見1-3)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容