深度学习&计算机视觉系列---TensorRT&DIGITS(一)

[table]
[tr][td]
外部媒体

Deploying DeepLearning

DIGITS Workflow

本文是从https://github.com/dusty-nv/jetson-inference翻译的,您可以在这里下载源码

如果您是深度神经网络的新手,您可以查看这个教程,了解更多关于训练和推演的内容

外部媒体

使用NVIDIA深度学习工具,您可以很容易的开始训练深度神经网络,还能高效的在您所需要的地方部署它们。独立的GPU通常在服务器,个人电脑或者笔记本电脑上面利用DIGITS进行训练。而Jetson 和集成的GPU通常用于嵌入式平台。

外部媒体

NVIDIA DIGITS 是部署在云服务器或者个人电脑上的,用于训练网络模型的交互系统。而TensoRT和Jetson 是用于部署运行时的推理平台。TensorRT利用了图优化和半精度FP16来支持双精度深度神经网络的推演。DIGITS和TensorRT一起构建了,开发和部署高层次的人工智能和感知的神经网络的高效的工作流程

System Setup

在这份教程中,我们会使用一个PC(或者AWS)来训练深度神经网络。另外,我们会使用Jetson来进行推演。我们还会利用PC来对Jetson刷新最新的JetPack版本。

首先我们来安装和配置pc端需要的系统和工具

Installing Ubuntu on the Host

在PC端下载并且安装Ubungu 16.04 x86_64,下面是下载地址:

http://releases.ubuntu.com/16.04/ubuntu-16.04.2-desktop-amd64.iso

http://releases.ubuntu.com/16.04/ubuntu-16.04.2-desktop-amd64.iso.torrent

Ubuntu 14.04 x86_64也是可以的,但是在利用apt-get安装包的时候,需要对镜像进行一些修改

Running JetPack on the Host

在PC端下载最新版本的JetPack。除了刷新最新版的Jetson的BSP之外,JetPack还会自动安装一些类似于CUDAToolkit的工具。您可以在ReleaseNotes查看全版本特性列表和安装包

下载完上面的JetPack,在您的PC端执行下面的命令:

$ cd

$ chmod +x JetPack-L4T-3.1-linux-x64.run

$ ./JetPack-L4T-3.1-linux-x64.run

执行完上面的命令,JetPack 的界面就会启动,跟着下面的安装教程,就可以一步步完成安装。在开始的时候,JetPack将会确认您要部署的Jetson版本。

外部媒体

选择您自己的Jetson版本(TX1,TX2或者TK1),然后选择Next继续。接下来,您就可以看到能够安装的包的列表。已经在host上面安装的包会在界面中Host-Ubuntu的栏目下面列出。而打算在Jetson上面安装的会在底部列出。您可以在菜单中选择或者取消一个独立的包装。

如果想用CUDA来加速host端的网络训练,推荐选择右上角的Full选项。然后,选择Next开始安装。JetPack将会下载并且安装一系列的包。注:如果你想要找到下载的包,所有下载的.deb安装包都会保存在jetpack_downloads这个文件夹下面。

在下载完成之后,Jetpack将会进入最后的安装阶段,L4T BSP将会被刷入板子中。您需要把你的Jetson板子通过micro-USB接口连接到PC端(利用您的Jetson包装盒中的那条micro-USB的线)。

然后,同时按住Jetson板子上的Recovery按钮和Reset按钮,一小段时间之后,松开Reset按钮。接下来,您的Jetson 板子就会进入Recovery mode。

在PC端输入lsusb,如果出现了您的NVIDIA设备,那么就证明您的设备已经和PC端链接成功了。接下来JetPack就会把系统和相关工具刷入您的板子中。

刷完系统之后,Jetson就会重新启动,如果连接到了一个HDMI的显示器上,就会看到一个Ubuntu 的桌面。然后,JetPack就会通过SSH连接到您的PC端来安装剩下的包(例如:ARMaarch64版本的CUDA Toolkit,cuDNN 和TensorRT)。您还可以选择您的JetPack以何种模式连接到您的PC端,可以直接相连,也可以连接到同一个路由器中。JetPack的安装程序会让您来确认一下。您可以查看JetPack的安装指南,来了解更多的内容。

Installing NVIDIA Driver on the Host

到这里,JetPack将会将最新的系统和工具刷进您的板子中,cuda toolkit也会在PC端和Jetson端都安好。不过,您还是需要将您PC端的NVIDIA的PCIe驱动安装进去。

在您的PC端输入一下命令来安装驱动:

$ sudo apt-get install nvidia-375

$ sudo reboot

在重新启动之后,输入以下命令,就可以看到英伟达驱动:

$ lsmod | grep nvidia

nvidia_uvm 647168 0

nvidia_drm 49152 1

nvidia_modeset 790528 4 nvidia_drm

nvidia 12144640 60 nvidia_modeset,nvidia_uvm

drm_kms_helper 167936 1 nvidia_drm

drm 368640 4nvidia_drm,drm_kms_helper

接下来运行CUDA samples中的例子来确认CUDA toolkit和driver安装好了:

$ cd /usr/local/cuda/samples

$ sudo make

$ cd bin/x86_64/linux/release/

$ ./deviceQuery

$ ./bandwidthTest --memory=pinned

Installing cuDNN on the Host

接下来这步是在您的PC端安装NVIDIA的cuDNN库。从Nvidia官网下载libcudnn和libcudnn 包:

https://developer.nvidia.com/compute/machine-learning/cudnn/secure/v6/prod/8.0_20170307/Ubuntu16_04_x64/libcudnn6-dev_6.0.20-1+cuda8.0_amd64-deb

Then install the packages with the followingcommands:

$ 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

NVcaffe 是NVIDIA版本的对于GPU优化过的Caffe。NVcaffe 利用cuDNN和DIGITS来训练深度神经网络。从GitHub上面下载并且编译源码(下面介绍的是NVcaffe-0.15):

注:在这个教程中,NVcaffe只需要在PC端中安装用于训练。推演阶段我们使用的是TensorRT并不需要安装caffe。

首先,安装一些caffe需要的工具库,包括DIGITS所需要的Python的库。

$ sudo apt-get install --no-install-recommends build-essentialcmake git gfortran libatlas-base-dev libboost-filesystem-devlibboost-python-dev libboost-system-dev libboost-thread-dev libgflags-devlibgoogle-glog-dev libhdf5-serial-dev libleveldb-dev liblmdb-devlibprotobuf-dev libsnappy-dev protobuf-compiler python-all-dev python-devpython-h5py python-matplotlib python-numpy python-opencv python-pil python-pippython-protobuf python-scipy python-skimage python-sklearn python-setuptools

$ sudo pip install --upgrade pip

$ git clone -b caffe-0.15 https://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

现在Caffe已经配置编译好了。接下来编辑~/.bashrc来把你的Caffe添加到你的系统环境中去(替换成你自己的地址)。

export CAFFE_ROOT=/home/your-name/workspace/caffe

export PYTHONPATH=/home/your-name/workspace/caffe/python:$PYTHONPATH

然后关闭并且重新打开终端来加载新改的环境。

Installing DIGITS on the Host

NVIDIA DIGITS 是一个基于Python的Web服务,提供了训练深度神经网络和管理数据集的交互界面。它最大的亮点是,您可以在PC端训练您的网络,然后把训练好的模型复制到您的Jetson端,然后再利用TensorRT进行推演。

首先,我们安装DIGITS所需要的库,然后从GitHub上下载:

$ sudo apt-get install --no-install-recommends graphvizpython-dev python-flask python-flaskext.wtf python-gevent python-h5pypython-numpy python-pil python-pip python-protobuf python-scipy python-tk

$ git clone https://github.com/nvidia/DIGITS

$ cd DIGITS

$ sudo pip install -r requirements.txt

Starting the DIGITS Server

在终端中进入您的DIGITS的文件夹下,执行下面的命令,就可以启动DIGITS了:

$ ./digits-devserver


| _ _/ _| | _/ __|

| |) | | (_ || | | | __ \

|/_|| || |___/ 5.1-dev

2017-04-17 13:19:02 [INFO ] Loaded 0 jobs.

DIGITS将会在digits/jobs这个目录下保存您的任务(包括训练数据库和训练好的模型)。您可以在浏览器输入:localhost:5000来访问DIGITS界面

注:5000是DIGITS的默认端口,您可以用digits-devserver --port number来更改这个端口

Building from Source on Jetson

与此同时,JetPack还会提供TensorRT。它可以利用GoogleNet/Alexnet 和实时摄像头对图片进行识别,行人检测(画出检测框)和分割。它还能够部署在Jetson上面并且利用在PC端的DIGITS服务器上面训练的网络模型。

您可以在 GitHub上面下载最新的源码,并且在您的TX1/TX2上面编译。

注:您需要验证您的BSP版本和Jetson版本是否对应:

         > JetsonTX2 - JetPack 3.0 / L4T R27.1 aarch64 (Ubuntu 16.04 LTS) 

Jetson TX1 - JetPack 2.3 / L4T R24.2 aarch64 (Ubuntu 16.04 LTS)
Jetson TX1 - JetPack 2.3.1 / L4T R24.2.1 aarch64 (Ubuntu 16.04 LTS)

note: this branch is verifiedagainst the following BSP versions for Jetson TX1/TX2:

Jetson TX2 - JetPack 3.0 / L4T R27.1 aarch64 (Ubuntu 16.04 LTS)
Jetson TX1 - JetPack 2.3 / L4T R24.2 aarch64 (Ubuntu 16.04 LTS)
Jetson TX1 - JetPack 2.3.1 / L4T R24.2.1 aarch64 (Ubuntu 16.04 LTS)

Cloning the Repo

首先,您需要安装git,cmake等工具:

$ sudo apt-get install git cmake

接下来下载jetson-inference:

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

Configuring with CMake

运行cmake的时候,预安装的脚本(CMakePreBuild.sh)将会自动的安装一些依赖:

$ cd jetson-inference

$ mkdir build

$ cd build

$ cmake …/

注:cmake在加载CMakePrebuild.sh的时候,可能需要sudo权限。它还会从网上下载一些已经训练好的网络模型。

Compiling the Project

进入到jetson-inference/build的文件夹里面进行编译(注意,这里是step#2,后面会用到):

$ cd jetson-inference/build # omit if pwd is already/build from above

$ make

您可以根据您的系统架构,在不同的文件夹里面编译成不同包(armhf或者 aarch64):

|-build

\aarch64 (64-bit)

  \bin                        where the samplebinaries are built to

  \include           where the headers reside

  \lib                        where the libraries arebuild to

\armhf (32-bit)

  \bin                        where the samplebinaries are built to

  \include           where the headers reside

  \lib                        where the libraries arebuild to

Digging Into the Code

作为参考,请参阅可用的视觉网络,包括用于图像识别的imageNet和用于目标检测的detectNet

/**

  • Image recognition withGoogleNet/Alexnet or custom models, using TensorRT.

*/

class imageNet : public tensorNet

{

public:

    /**

     * Network choice enumeration.

     */

    enum NetworkType

    {

             ALEXNET,

             GOOGLENET

    };


    /**

     * Load a new network instance

     */

    static imageNet* Create( NetworkTypenetworkType=GOOGLENET );


    /**

     * Load a new network instance

     * @param prototxt_path File path to thedeployable network prototxt

     * @param model_path File path to thecaffemodel

     * @param mean_binary File path to the meanvalue binary proto

     * @param class_info File path to list of classname labels

     * @param input Name of the input layer blob.

     */

    static imageNet* Create( const char* prototxt_path, const char* model_path, const char* mean_binary,

                                                        const char* class_labels, const char* input="data", const char* output="prob" );


    /**

     * Determine the maximum likelihood imageclass.

     * @param rgba float4 input image in CUDAdevice memory.

     * @param width width of the input image inpixels.

     * @param height height of the input image inpixels.

     * @param confidence optional pointer to floatfilled with confidence value.

     * @returns Index of the maximum class, or -1on error.

     */

    int Classify( float* rgba, uint32_t width, uint32_t height, float* confidence=NULL );

};

这两个网络都从包含了TensorRT代码的共享tensorNet网络中继承了实例

[/td][/tr]
[/table]