3、英伟达计算平台与开发环境搭建:安装JetPack SDK、CUDA、cuDNN、TensorRT,配置Docker开发环境,验证硬件编解码能力。

好,咱们直接进入正题。这一章,说白了就是给你的英伟达平台「装系统、配环境」。很多新手拿到Orin或者Xavier的板子,第一反应就是「刷机」。嗯,刷机只是第一步,后面那一整套开发环境的搭建,才是真正磨人的地方。

我个人习惯,拿到一块新板子,先不急着跑模型。先把底层的计算库、推理引擎、容器环境全部捋顺了。否则后面跑着跑着发现CUDA版本不对,或者编解码器没使能,那才叫崩溃。我在项目中遇到过好几次,团队花了两周调好的模型,换了一块板子就报错,最后发现是JetPack版本不一致。所以,这一章的内容,值得你花点时间,一步一个脚印走完。

3.1 安装JetPack SDK:板子的「操作系统」

JetPack SDK,你可以把它理解成英伟达为嵌入式平台定制的「全家桶」。它包含了Linux内核、驱动、CUDA、cuDNN、TensorRT等等。你不需要一个个去官网下载,JetPack会帮你搞定依赖关系。

安装方式有两种:

  • SDK Manager(推荐): 在PC主机(Ubuntu系统)上安装NVIDIA SDK Manager,通过USB或网线连接板子,图形化界面一键刷机。我个人觉得这是最省心的方式,尤其是对于初学者。
  • 命令行刷机: 下载JetPack的BSP包,手动执行刷机脚本。这种方式更灵活,适合批量部署或者没有图形界面的服务器环境。

核心要点: 选择JetPack版本时,一定要和你后续要用的CUDA、TensorRT版本匹配。比如JetPack 5.1对应CUDA 11.4,TensorRT 8.5。别贪新,稳定第一。

刷机完成后,板子会自动重启。你可以在终端输入 nvidia-smi 或者 jp-version 来验证是否安装成功。如果能看到GPU信息和JetPack版本号,恭喜,第一步走通了。

3.2 安装CUDA与cuDNN:计算的「引擎」

JetPack SDK其实已经自带了CUDA和cuDNN,但有时候我们需要特定版本,或者需要手动安装到自定义路径。为什么会这样?因为有些老项目可能只支持CUDA 10.2,而JetPack 5.1自带的是11.4。这时候你就得手动搞了。

安装CUDA:

  1. 从NVIDIA官网下载对应架构的.run文件(比如aarch64架构)。
  2. 执行 sudo sh cuda_xxx_linux.run,注意不要安装驱动(因为板子驱动已经由JetPack管理了)。
  3. 配置环境变量,在 ~/.bashrc 里添加 export PATH=/usr/local/cuda/bin:$PATHexport LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

安装cuDNN:

cuDNN其实是一堆库文件。下载deb包或者tar包,解压后复制到CUDA目录下就行。我记得有一次,我复制完忘记给权限,结果程序运行时一直报「找不到libcudnn.so.8」。嗯,这里要注意,复制完一定要执行 sudo ldconfig 刷新一下。

小技巧: 安装完成后,可以用 nvcc -V 查看CUDA版本,用 dpkg -l | grep cudnn 查看cuDNN版本。如果版本对不上,多半是环境变量没配好。

3.3 安装TensorRT:推理的「加速器」

TensorRT是英伟达的王牌推理优化引擎。它能将训练好的模型(比如ONNX、TensorFlow)进行量化、层融合、内存优化,让推理速度翻几倍甚至十几倍。你想想看,同样的模型,在Orin上跑,用TensorRT优化后,延迟能从50ms降到5ms,这就是差距。

安装步骤:

  • JetPack自带的TensorRT通常位于 /opt/nvidia/tensorrt 目录下。
  • 如果你需要手动安装,下载对应JetPack版本的TensorRT deb包,执行 sudo dpkg -i *.deb
  • 安装Python接口:pip install tensorrt 或者进入 /opt/nvidia/tensorrt/python 目录下安装whl文件。

避坑指南: 我曾经在安装TensorRT时,直接用了pip install,结果装的是x86_64版本,在arm板子上根本跑不起来。所以一定要确认你下载的是 aarch64 架构的包。另外,TensorRT的版本必须和CUDA版本严格对应,否则会报「CUBLAS_STATUS_NOT_INITIALIZED」之类的错误。

验证TensorRT是否安装成功,可以运行一下自带的sample:cd /opt/nvidia/tensorrt/bin/ && ./trtexec --help。如果能正常打印帮助信息,说明环境没问题。

3.4 配置Docker开发环境:隔离与复用

做多传感器融合,经常要切换不同的算法环境。比如今天跑激光雷达的模型,明天跑视觉的模型,依赖库可能冲突。Docker就是解决这个问题的利器。我建议你直接在板子上装Docker,然后把所有开发环境都容器化。

安装Docker:

# 更新包管理器
sudo apt update
# 安装依赖
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加仓库
sudo add-apt-repository "deb [arch=arm64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装Docker
sudo apt install docker-ce
# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

拉取英伟达官方镜像:

英伟达提供了NGC(NVIDIA GPU Cloud)镜像,里面已经预装了CUDA、cuDNN、TensorRT。你只需要一条命令:

sudo docker pull nvcr.io/nvidia/l4t-tensorrt:r8.5.2-runtime

这个镜像基于JetPack 5.1,包含了TensorRT 8.5.2。你可以在此基础上安装自己的算法库。

个人经验: 我习惯在Docker里挂载宿主机的一个目录,比如 /data,这样模型文件和数据集可以共享,不用每次重新拷贝。命令示例:sudo docker run -it --rm --runtime nvidia -v /data:/data nvcr.io/nvidia/l4t-tensorrt:r8.5.2-runtime。注意加上 --runtime nvidia 才能调用GPU。

3.5 验证硬件编解码能力:看看你的板子「硬不硬」

多传感器融合里,摄像头数据流是海量的。如果全靠CPU软解码,CPU占用率直接飙到100%,其他算法就别想跑了。所以,一定要用硬件编解码器(VIC、NVENC/NVDEC)。

验证方法:

  1. 查看编解码器支持列表: 在终端输入 cat /proc/device-tree/host1x@50000000/nvcsi@15a00000/status,如果返回 okay,说明CSI摄像头接口是使能的。
  2. 使用gstreamer测试: 英伟达平台对gstreamer支持很好。你可以用以下命令测试硬件解码:
gst-launch-1.0 filesrc location=test.h264 ! h264parse ! nvv4l2decoder ! nv3dsink

如果能看到视频画面,说明硬件解码器正常工作。如果报错,多半是gstreamer插件没装全,或者编解码器固件没更新。

避坑指南: 我曾经在调试时,发现硬件解码器一直报「资源忙」。查了半天,原来是另一个进程占用了VIC引擎。所以,多传感器融合时,要合理分配编解码器资源,别让多个摄像头同时抢占同一个硬件单元。建议用 nvpmodel 工具查看当前硬件负载。

性能基准测试:

你可以用 trtexec 工具跑一下编解码的吞吐量。比如:

trtexec --loadEngine=my_engine.trt --duration=60 --useSpinWait

观察FPS和延迟。如果FPS能达到理论值的80%以上,说明硬件编解码能力完全释放了。

小结

这一章的内容,说白了就是「磨刀不误砍柴工」。JetPack是地基,CUDA/cuDNN是钢筋,TensorRT是混凝土,Docker是脚手架。把这些搭好了,后面的算法开发才能又快又稳。嗯,我建议你每装完一个组件,都做一次验证测试,别等到最后才发现问题。下一章,我们会正式开始多传感器数据流的接入,到时候这些环境就派上用场了。