第一阶段 环境依赖安装
1.请先参考Jetson Nano 介绍文档,了解产品构造和开机流程,【Jetson Nano 介绍文档链接】: https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#intro
2.以Windows系统为例,在上述链接的第三目录【Write Image to the microSD Card】中,下载以及
3.下载对应镜像系统JetPack。【下载链接】:https://developer.nvidia.com/embedded/downloads
注意:安装JetPack版本必须是平台文档中SDK所要求的版本,并且是支持多个版本的,选择其中一个JetPack版本进行刷机。
具体版本建议参见官方集成文档,这个可能会随着时间变化的,【Jetson专用SDK集成文档链接】https://ai.baidu.com/ai-doc/EASYDL/Dka3ky0an
4.准备就绪后,用下载好的软件SD Card Formatter,格式化SD卡两遍,再用Etcher把刚下载好的对应版本系统烧录到sd卡内。
注意:若使用SDK Manager安装方法,在刷机的时候务必把CUDA、cuDNN、TensorRT、OpenCV这些系统组件也安装上去,因为这些组件是EasyDL的SDK运行所必须依赖的。Nano或Xavier NX使用SD Card Image安装的不用担心,这些系统组件会自动安装上去。
5.注意连接电源的方式有两种:使用microusb或直流电源口供电,使用直流电源口的时候需要把J48引脚用跳线帽短接。
6.安装cmake,可以通过apt-get安装。注意,如果提示无法定位软件包之类的问题,记得先执行update这条命令。
$ sudo apt-get update
$ sudo apt-get install cmake g++
第二阶段 编译并运行SDK提供的demo
SDK内目前已经提供了三个demo文件和CMakeLists.txt,可以直接编译运行。
demo文件介绍:
- demo_batch_inference.cpp:提供了一个对批量图片预测的能力,这个cpp文件是最常用的,也是推理速度最快的,注意编译产出的对应可执行文件命名为easyedge_batch_inference,这个在CMakeLists.txt里可以看到,也可以对其进行修改。
- demo_multi_thread.cpp:这个demo文件功能多一些,可以支持单机多线程,对应demo中的run_multi_infer函数,通常不建议使用,因为资源抢占会导致推理时间不稳定,而且基本上可以断定不如上面demo_batch_inference的推理效率高。但如果把max_concurrency设置为1,其实就变成和demo_batch_inference一样效果了。
- demo_serving.cpp:这个demo文件提供了一个起http服务的功能,服务起来之后就可以使用其他语言或在其他项目中直接调用http api直接对图片做推理,api会返回预测时间和预测结果。
序列号
注意编译之前一定要把序列号正确填写到cpp文件里,否则无法通过鉴权,也就无法执行推理。
编译方法如下:
# 1. 首先进入demo目录
$ cd /home/work/easydl/sdk/demo
# 2. 创建build文件夹并进入
$ mkdir build && cd build
# 3. 执行编译
$ cmake ..
$ make -j $(nproc)
# 4. 执行安装,把lib文件安装到系统路径,需要sudo权限
# 也可以选择不执行安装,把lib路径加为环境变量即可
$ sudo make install
# 5. 这时候应该会产出demo编译的可执行文件,直接执行可以查看需要的参数
$ ./easyedge_batch_inference {res_dir} {image}
# 或
$ ./easyedge_serving {res_dir} {serial_key} {host, default 0.0.0.0} {port, default 24401}
SDK运行参数配置
SDK的一些运行选项可以通过config来配置。config的定义可以在SDK里的include/easyedge/easyedge.h里找到,是一个名为TensorRTConfig的结构体。具体使用方式可以参考三个demo的实现。这里仅列举几个比较重要且常用的选项:
1. max_batch_size:通过修改config里面的max_batch_size,可以设置支持的最大batch size,不过这个值最好设置为实际需要传入图片的个数,因为这个值越大占用的资源越多,相应的预测速度也会有所下降,虽然不明显。如果不需要同时预测多张图片或不使用batch,建议max_batch_size设置为1。
2. max_concurrency:这个选项可以支持多个线程并发,但是并发会相互竞争计算资源,所以如果使用batch能满足需求,尽量不要设置这个选项,值保持为1就好。若模型比较大,比如使用yolov3这种网络,在Nano上一定不要开通这个选项。
3. compile_level:模型第一次加载会比较慢,加载完之后会有缓存保存,下一次运行速度就会提升,这种策略是通过compile_level来控制的,你可以控制是否使用缓存,并且也可以通过设置cache_name来控制缓存的命名。
查询板子信息
1. 有时候我们可能不记得自己的板子刷的是哪个JetPack版本了,则可以通过下面这条命令查询L4T的版本。
# 在终端输入如下命令并回车
$ head -n 1 /etc/nv_tegra_release
# 就会输出类似如下结果
$ # R32 (release), REVISION: 2.0, GCID: 15966166, BOARD: t186ref, EABI: aarch64, DATE: Wed Jul 17 00:26:04 UTC 2019
从输出的结果来看,板子当前的L4T版本为R32.2.0,对应JetPack4.2.1
注意:L4T的版本不是JetPack的版本,但是一般可以从L4T的版本唯一对应到JetPack的版本,下面列出了最近几个版本的对应关系:
L4T R32.4.3 --> JetPack4.4
L4T R32.4.2 --> JetPack4.4DP
L4T R32.2.1 --> JetPack4.2.2
L4T R32.2.0 --> JetPack4.2.1
2. 功率模式设置与查询
不同的功率模式下,执行AI推理的速度是不一样的,如果对速度需求很高,可以把功率开到最大,但记得加上小风扇散热~
# 1. 运行下面这条命令可以查询开发板当前的运行功率模式
$ sudo nvpmodel -q verbose
# $ NV Power Mode: MAXN
# $ 0
# 如果输出为MAXN代表是最大功率模式
# 2. 若需要把功率调到最大,运行下面这条命令
$ sudo nvpmodel -m 0
# 如果你进入了桌面系统,也可以在桌面右上角有个按钮可以切换模式
# 3. 查询资源利用率
$ sudo tegrastats