NVIDIA TensorRT使用记录

2023-05-16

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)



作者:不掉发码农
链接:https://www.jianshu.com/p/59fe26073a41
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NVIDIA TensorRT使用记录 的相关文章

  • 如何将 cv::MAT 转换为 NHCW 格式?

    在User Guide html中 tensorRT的输入 输出需要使用NCHW格式 什么是 NCHW 格式 如何将 cv MAT 转换为 NCHW 格式 我使用 TensorRT 运行推理 如下代码所示 没有任何错误 但是 这不是正确的输
  • 了解 CUDA 网格维度、块维度和线程组织(简单解释)[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 GPU 如何组织线程来执行 Hardware 例如 如果 GPU 设备有 4 个多处理单元 并且每个单元可以运行 768 个线程 那么在给定时刻 真正并行运行的线程不会超过 4
  • DataGridView 在我的两个屏幕之一上的重绘性能非常糟糕

    我实际上已经解决了这个问题 但我将其发布给后代 我在双显示器系统上的 DataGridView 遇到了一个非常奇怪的问题 该问题表现为控件重绘极其缓慢 完全重绘大约需要 30 秒 但仅当它出现在我的其中一个屏幕上时 另一方面 重绘速度很好
  • OpenMP 卸载了在主机和目标设备中执行的目标区域

    我正在开发一个项目 需要使用 Clang 将 OpenMP 卸载到 Nvidia GPU 我能够按照提到的说明安装 Clang 以支持卸载here 系统规格 操作系统 Ubuntu 16 04 LTS 铿锵 版本 4 00 处理器 Inte
  • 如何理解“warp 中的所有线程同时执行相同的指令”。在 GPU 中?

    我在读专业CUDA C编程 并在GPU 架构概述部分 CUDA 采用单指令多线程 SIMT 架构来管理和执行 32 个线程组 称为 warp warp 中的所有线程同时执行相同的指令 每个线程都有自己的指令地址计数器和寄存器状态 并根据自己
  • Linux 中没有 X.org 的 OpenGL

    我想在 Linux 中打开一个没有 X 的 OpenGL 上下文 有什么办法可以做到吗 我知道集成英特尔显卡硬件是可能的 尽管大多数人的系统中都有 Nvidia 卡 我想要一个适用于 Nvidia 卡的解决方案 如果除了通过集成英特尔硬件之
  • 强制 Windows 视频驱动程序重新加载。有可能吗?

    某些驱动程序在启动时加载时使用注册表中写入的参数来配置自身 我可以修改这些值然后重新启动 但我想知道是否可以强制重新加载驱动程序 使更改在不重新启动的情况下生效 具体来说 我正在谈论视频驱动程序 nvidia 我在某处读到 通过 pINvo
  • CUDA 中的块间同步

    我为这个问题搜索了一个月 我无法同步 CUDA 中的块 我读过很多关于atomicAdd 合作组等的文章 我决定使用一个全局数组 这样一个块就可以在全局数组的一个元素上写入 写入之后 块的线程将等待 即陷入 while 循环 直到所有块都写
  • Tensorflow:GPU 加速仅在首次运行后发生

    我已经在我的机器 Ubuntu 16 04 上安装了 CUDA 和 CUDNNtensorflow gpu 使用的版本 CUDA 10 0 CUDNN 7 6 Python 3 6 张量流 1 14 这是输出nvidia smi 显示显卡配
  • 为什么 Cuda/OpenCL 的全局内存中不存在库冲突?

    我还没有弄清楚并且谷歌没有帮助我的一件事是 为什么有可能与共享内存发生银行冲突 但在全局内存中却没有 银行与寄存器会存在冲突吗 UPDATE哇 我真的很感谢 Tibbit 和 Grizzly 的两个回答 看来我只能给一个答案打绿色复选标记
  • 检测显示器是否关闭

    我有一个信息亭类型的应用程序 如果液晶电视关闭 我需要收到通知 以便我可以惩罚某人 我正在运行带有 nVidia 显卡和 nVidia 驱动程序的 Ubuntu 10 10 电视通过 HDMI 插入 我看过了nvidia settings
  • Tensorflow:GPU 利用率几乎始终为 0%

    我将张量流与 Titan X GPU 一起使用 并且我注意到 当我运行 CIFAR10 示例时 Volatile GPU utilization稳定在 30 左右 而当我训练自己的模型时 Volatile GPU utilization远非
  • CUDA和cuDNN在Windows上的安装问题

    我正在检查系统上的 CUDA 和 cuDNN 安装 并有几个观察结果 CUDA有两个版本 9 0和11 2 只在CUDA 9 0的安装目录下找到cuDNN CUDA 9 0目录下有cudafe exe 而CUDA 11 2目录下没有 按照目
  • 当有足够可用内存时 CUDA 内存不足

    I m having trouble with using Pytorch and CUDA Sometimes it works fine other times it tells me RuntimeError CUDA out of
  • nvcc fatal:尽管 Visual Studio 12.0 已添加到 PATH,但无法在 PATH 中找到编译器“cl.exe”

    我已遵循以下所有指示https datanoord com 2016 02 01 setup a deep learning environment on windows theano keras with gpu enabled http
  • CUDA:是否可以将全部 48KB 片上内存用作共享内存?

    我正在 Windows 7 64 位 SP1 上使用 CUDA Toolkit 4 0 和 Visual Studio 2010 Professional 为 GTX 580 开发 CUDA 应用程序 我的程序比典型的 CUDA 程序更占用
  • nvcc 和 NVIDIA-smi 显示的不同 CUDA 版本

    我对运行时显示的不同 CUDA 版本感到非常困惑which nvcc and nvidia smi 我的 ubuntu 16 04 上安装了 cuda9 2 和 cuda10 现在我将 PATH 设置为指向 cuda9 2 所以当我跑步时
  • 无法在tensorflow r1.14中导入“tensorflow.contrib.tensorrt”

    我已经安装了Tensorflow r1 14并想使用TF TRT 但是 出现以下错误 ModuleNotFoundError 没有名为 tensorflow contrib tensorrt 的模块 运行示例代码时 同样的错误发生在Tens
  • OpenCL 在调用 clGetPlatformIDs 时崩溃

    我是 OpenCL 新手 在配备 Intel R HD Graphics 4000 运行 Windows 7 的 Core i5 计算机上工作 我安装了支持 OpenCL 的最新 Intel 驱动程序 GpuCapsViewer 确认我有
  • 是否可以在设备函数中调用cufft库调用?

    我在主机代码中使用 cuFFT 库调用 它们工作正常 但我想从内核调用 cuFFT 库 早期版本的 CUDA 没有这种支持 但是有了动态并行性 这可能吗 如果有任何关于如何实现这一目标的示例 那就太好了 尽管在 Kepler cc 3 5

随机推荐