3. 开发环境搭建:NVIDIA Jetson/TensorRT环境配置、ONNX Runtime与OpenVINO安装、Docker容器化部署环境

环境搭建这事儿,说难不难,说简单也真能卡你三天。我见过太多团队,模型在PC上跑得飞起,一到边缘设备就各种报错。说白了,就是环境没整利索。这一章,我把几个主流推理后端的环境搭建流程捋一遍,都是我自己踩过坑之后沉淀下来的步骤。

3.1 NVIDIA Jetson + TensorRT:边缘端的性能之王

Jetson系列,从Nano到Orin,是工业缺陷检测最常用的边缘平台。TensorRT是NVIDIA的推理优化引擎,能把模型压到极致。

3.1.1 JetPack SDK安装

别自己去官网一个个下载包,直接用NVIDIA SDK Manager。它会帮你把系统、驱动、CUDA、cuDNN、TensorRT一股脑装好。

# 下载SDK Manager(在x86主机上运行)
# 选择对应Jetson型号和JetPack版本(我建议用LTS版本,稳定)
# 连接Jetson设备(通过Micro-USB或以太网)
# 勾选:Jetson OS + Jetson SDK Components
# 开始安装,大约需要30-60分钟
注意: 我曾经因为用了最新的JetPack 6.0,结果某个工业相机驱动不兼容,折腾了两天。建议新项目先用JetPack 5.1.2 LTS,生态最成熟。

3.1.2 TensorRT环境验证

装好后,先跑个官方样例,确认环境没问题。

# 进入TensorRT目录
cd /usr/src/tensorrt/samples/trtexec
make
# 运行一个简单的ResNet-50推理
./trtexec --onnx=resnet50.onnx --fp16 --workspace=1024

看到输出里有 [I] TensorRT: 8.5.3.1 和 [I] Average inference time: 12.3456 ms 就对了。如果报错,八成是CUDA版本没对齐。

3.1.3 模型转换:ONNX → TensorRT

工业缺陷检测模型,我一般先用ONNX导出,再转成TensorRT的engine文件。

# 使用trtexec命令行转换
trtexec --onnx=defect_detection.onnx \
        --saveEngine=defect_detection.engine \
        --fp16 \
        --workspace=2048 \
        --minShapes=input:1x3x640x640 \
        --optShapes=input:4x3x640x640 \
        --maxShapes=input:8x3x640x640

# 动态batch设置,适配产线不同节拍
我的习惯: 先用FP16精度,如果精度损失超过0.5%,再试INT8量化。INT8需要校准数据集,别偷懒。

3.2 ONNX Runtime:跨平台的瑞士军刀

ONNX Runtime的好处是,你写一套代码,能在Windows、Linux、ARM上跑。对于需要快速验证模型效果的场景,我经常用它。

3.2.1 安装方式

分CPU和GPU版本,别搞混了。

# CPU版本(通用)
pip install onnxruntime

# GPU版本(需要CUDA)
pip install onnxruntime-gpu

# 验证安装
python -c "import onnxruntime; print(onnxruntime.get_device())"
# 输出:GPU 或 CPU

3.2.2 在Jetson上编译安装

Jetson的ARM架构,直接pip可能装不上GPU版本。我建议源码编译。

# 安装依赖
sudo apt-get install -y build-essential cmake git

# 克隆源码
git clone --recursive https://github.com/microsoft/onnxruntime
cd onnxruntime

# 编译(指定CUDA和TensorRT)
./build.sh --config Release \
           --build_shared_lib \
           --use_cuda \
           --use_tensorrt \
           --cuda_home /usr/local/cuda \
           --cudnn_home /usr/lib/aarch64-linux-gnu \
           --tensorrt_home /usr/lib/aarch64-linux-gnu

# 安装Python包
pip install build/Linux/Release/dist/onnxruntime-*.whl
避坑指南: 我曾经在Jetson Nano上编译,内存不够直接卡死。解决办法:增加swap空间,或者用交叉编译。

3.3 OpenVINO:Intel平台的优化利器

如果你的边缘设备用的是Intel的CPU或集成显卡(比如NUC),OpenVINO是首选。它能把模型压到CPU上跑出接近GPU的速度。

3.3.1 安装OpenVINO Toolkit

# 下载并安装(以2023.3 LTS为例)
wget https://storage.openvinotoolkit.org/repositories/openvino/packages/2023.3/linux/l_openvino_toolkit_ubuntu22_2023.3.0.14076_4c6e7c9e5c9_x86_64.tgz
tar -xf l_openvino_toolkit_*.tgz
cd l_openvino_toolkit_*

# 安装依赖
sudo -E ./install_dependencies.sh

# 安装核心组件
sudo ./install.sh

# 设置环境变量
source /opt/intel/openvino_2023/setupvars.sh

3.3.2 模型优化器使用

OpenVINO有自己的模型格式IR(Intermediate Representation),需要用Model Optimizer转换。

# 将ONNX模型转为IR格式
mo --input_model defect_detection.onnx \
   --output_dir ./ir_model \
   --data_type FP16 \
   --input_shape [1,3,640,640]

# 转换后得到两个文件:
# defect_detection.xml  (模型结构)
# defect_detection.bin  (模型权重)
经验之谈: 工业场景中,OpenVINO在Intel i7-1265U上跑YOLOv5s,能做到5ms以内。比直接用ONNX Runtime快3倍左右。

3.4 Docker容器化:一次构建,到处运行

环境依赖的噩梦,Docker能解决。我现在的项目,全部用Docker部署,再也没出现过「在我电脑上能跑」的尴尬。

3.4.1 基础Dockerfile

以Jetson环境为例,写一个Dockerfile。

# 基础镜像(NVIDIA官方提供)
FROM nvcr.io/nvidia/l4t-tensorrt:r8.5.3-runtime

# 安装Python和依赖
RUN apt-get update && apt-get install -y \
    python3-pip \
    libgl1-mesa-glx \
    libglib2.0-0

# 安装ONNX Runtime
RUN pip3 install onnxruntime-gpu==1.15.0

# 复制模型和代码
COPY ./app /workspace/app
COPY ./models /workspace/models

# 设置工作目录
WORKDIR /workspace

# 启动命令
CMD ["python3", "app/inference.py"]

3.4.2 多阶段构建

为了减小镜像体积,我习惯用多阶段构建。

# 第一阶段:编译
FROM nvcr.io/nvidia/l4t-tensorrt:r8.5.3-devel AS builder
COPY ./src /workspace/src
RUN cd /workspace/src && make

# 第二阶段:运行
FROM nvcr.io/nvidia/l4t-tensorrt:r8.5.3-runtime
COPY --from=builder /workspace/src/build/inference /workspace/inference
COPY ./models /workspace/models
CMD ["/workspace/inference"]
注意: Jetson的Docker镜像需要指定架构。别在x86上build完直接扔到Jetson上跑,会报exec format error。

3.4.3 Docker Compose编排

如果项目涉及多个服务(比如推理服务+数据采集+Web界面),用docker-compose管理。

version: '3.8'
services:
  inference:
    build: ./inference
    runtime: nvidia
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    volumes:
      - ./models:/workspace/models
    ports:
      - "5000:5000"

  web:
    build: ./web
    ports:
      - "8080:80"
    depends_on:
      - inference

3.5 环境搭建全景图

下面这张图,把整个环境搭建的脉络串起来了。从模型训练到边缘部署,每一步用什么工具,一目了然。

工业缺陷检测环境搭建全景图 模型训练(PC/服务器) ONNX 模型导出 TensorRT (Jetson) ONNX Runtime (通用) OpenVINO (Intel) Docker 容器化部署 边缘设备(Jetson/NUC/工控机) 核心原则:训练环境与部署环境解耦,通过ONNX作为中间格式,Docker保证环境一致性

3.6 环境验证清单

每次搭建完环境,我都会按这个清单过一遍,确保万无一失。

检查项 命令/方法 预期结果
CUDA可用性 nvcc --version 显示CUDA版本号
TensorRT版本 dpkg -l | grep tensorrt 显示已安装的TensorRT包
ONNX Runtime设备 python -c "import onnxruntime; print(onnxruntime.get_device())" GPU 或 CPU
OpenVINO环境 python -c "from openvino.runtime import Core; print(Core().available_devices)" 列出可用设备(CPU, GPU等)
Docker GPU支持 docker run --rm --gpus all nvidia/cuda:11.8-runtime nvidia-smi 显示GPU信息
我的建议: 把这几个命令写成脚本,每次部署新设备,跑一遍就完事。别手动一个个敲,容易漏。

环境搭建这块,说白了就是「耐心」二字。别指望一次成功,也别怕报错。每个错误信息都是线索,顺着它查下去,总能解决。我刚开始搞Jetson的时候,光刷机就刷了十几次,后来总结出经验:刷机前先备份,出问题直接恢复,省时间。