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分钟
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设置,适配产线不同节拍
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
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 (模型权重)
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"]
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 环境搭建全景图
下面这张图,把整个环境搭建的脉络串起来了。从模型训练到边缘部署,每一步用什么工具,一目了然。
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的时候,光刷机就刷了十几次,后来总结出经验:刷机前先备份,出问题直接恢复,省时间。