Jetson Nano离线/弱网环境部署指南:如何手动搞定jetson-inference的所有依赖(JetPack 4.6)
Jetson Nano离线部署实战:手动构建jetson-inference全生态指南
在边缘计算领域,Jetson Nano凭借其出色的AI推理性能和能效比,成为众多嵌入式开发者的首选平台。然而,当我们将目光投向实际部署场景时,网络环境的不确定性往往成为阻碍项目落地的"最后一公里"问题。特别是在科研实验室、保密项目或网络管制严格的企业内网中,传统的在线安装方式常常遭遇GitHub连接超时、模型下载中断、依赖包获取失败等一系列挑战。
1. 离线部署环境准备
1.1 硬件与基础软件配置
确保Jetson Nano已正确安装JetPack 4.6基础环境,包含以下关键组件:
- L4T 32.6.1
- CUDA 10.2
- cuDNN 8.2.1
- TensorRT 8.0.1
- OpenCV 4.1.1
提示:可通过
dpkg-query --showformat='${Version}' --show nvidia-l4t-core命令验证L4T版本
离线环境下,建议提前下载以下必备工具链:
# 基础编译工具链 sudo apt-get install -y \ git \ cmake \ libpython3-dev \ python3-numpy1.2 离线资源获取策略
针对jetson-inference项目,需要预先准备的离线资源包括:
- 主仓库代码:完整克隆jetson-inference仓库(含子模块)
- 预训练模型:分类/检测/分割等模型文件
- PyTorch wheel包:与JetPack 4.6兼容的特定版本
- 第三方依赖库:protobuf、onnx等
推荐使用以下方法获取完整代码库:
# 在有网络环境的主机执行完整克隆 git clone --recursive https://github.com/dusty-nv/jetson-inference tar -czvf jetson-inference-offline.tar.gz jetson-inference2. 子模块与依赖处理实战
2.1 子模块离线解决方案
当遇到子模块下载失败时,可采用以下三种方法:
方法一:手动补全子模块
- 查看
.gitmodules文件确认缺失子模块 - 单独下载每个子模块仓库
- 按原路径放置到项目目录中
方法二:修改.gitmodules协议
[submodule "submodule-name"] path = relative/path url = git://github.com/original/repo.git # 将https改为git方法三:镜像仓库同步
- 将主仓库fork到可访问的代码平台(如Gitee)
- 批量替换子模块URL为镜像地址
- 从镜像仓库执行克隆
2.2 依赖包离线管理
创建本地apt仓库解决系统依赖:
# 在联网机器上缓存依赖包 apt-get download $(apt-cache depends --recurse --no-recommends \ --no-suggests --no-conflicts --no-breaks --no-replaces \ --no-enhances libpython3-dev python3-numpy | grep "^\w")对于Python包,建议使用pip离线安装:
pip download torch==1.6.0 -f https://nvidia.box.com/shared/static/yr6sjswn25z7o6w99qras...3. 模型与PyTorch离线部署
3.1 预训练模型处理流程
jetson-inference依赖的模型包括:
| 模型类型 | 典型模型 | 所需文件 |
|---|---|---|
| 图像分类 | GoogleNet | ONNX+模型权重 |
| 目标检测 | SSD-Mobilenet | prototxt+caffemodel |
| 语义分割 | FCN-ResNet18 | ONNX+标签文件 |
手动下载模型后,按以下目录结构放置:
data/ └── networks/ ├── GoogleNet/ │ ├── googlenet.onnx │ └── labels.txt └── SSD-Mobilenet-v2/ ├── deploy.prototxt └── mobilenet_iter_73000.caffemodel3.2 PyTorch定制安装
针对JetPack 4.6 (L4T 32.6.1)环境,需安装特定版本的PyTorch:
- 获取预编译wheel包:
wget https://nvidia.box.com/shared/static/yr6sjswn25z7o6w99qras...- 离线安装命令:
sudo pip3 install torch-1.6.0-cp36-cp36m-linux_aarch64.whl- 验证安装:
import torch print(torch.__version__) # 应输出1.6.0 print(torch.cuda.is_available()) # 应返回True4. 编译配置与优化技巧
4.1 CMake脚本改造
修改CMakePreBuild.sh避免在线下载:
# 注释掉模型下载行 # ./download-models.sh $BUILD_INTERACTIVE调整CMakeLists.txt关键参数:
set(DISABLE_PYTHON OFF) # 启用Python支持 set(BUILD_INTERACTIVE OFF) # 非交互模式 set(CMAKE_BUILD_TYPE Release) # 发布模式编译4.2 编译加速与问题排查
使用多核编译加速:
make -j$(nproc) # 使用所有CPU核心常见编译问题解决方案:
- protobuf版本冲突:指定系统路径
-D PROTOBUF_LIBRARY=/usr/lib/aarch64-linux-gnu/libprotobuf.so - CUDA架构不匹配:添加
-D CUDA_ARCH_BIN="5.3" - OpenCV链接错误:设置
-D OpenCV_DIR=/usr/share/OpenCV
5. 部署验证与性能调优
5.1 基础功能测试
图像分类测试命令:
./imagenet-console --model=data/networks/GoogleNet/googlenet.onnx \ --labels=data/networks/GoogleNet/labels.txt \ --input-blob=input_0 \ --output-blob=output_0 \ images/orange_0.jpg output.jpg实时摄像头检测:
./detectnet-camera --model=models/SSD-Mobilenet-v2/ssd_mobilenet.onnx \ --labels=models/SSD-Mobilenet-v2/labels.txt \ --input-blob=input_0 \ --output-cvg=scores \ --output-bbox=boxes5.2 性能优化参数
关键环境变量设置:
export CUDA_CACHE_MAXSIZE=4294967296 # 增加CUDA缓存 export CUDA_CACHE_PATH="/tmp/.nv" # 指定缓存位置 export TF_CPP_MIN_LOG_LEVEL=2 # 减少TensorFlow日志输出内存优化配置:
sudo nvpmodel -m 0 # 设置为最大性能模式 sudo jetson_clocks # 锁定最高频率在完成所有部署后,建议创建系统镜像备份。使用NVIDIA提供的flash工具可以轻松实现整个系统的克隆,这在需要批量部署多台Jetson Nano设备的场景下尤其有用。
