共计 2171 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
在自动驾驶开发中,Autoware 预训练模型的部署常遇到以下问题:

- 依赖项冲突 :不同模型对 CUDA、cuDNN 等底层库的版本要求各异,手动安装易导致环境污染
- GPU 资源占用高 :传统部署方式难以隔离进程,多个模型运行时易引发显存溢出
- 镜像体积过大 :包含完整开发工具的镜像常超过 15GB,导致传输和存储成本飙升
容器化方案对比优势:
- 依赖隔离:每个容器拥有独立库环境
- 资源限额:可通过 cgroup 限制 GPU 显存使用
- 快速部署:镜像一次构建多处运行
技术实现
镜像构建四步法
- 基础镜像选择
# 阶段一:构建环境
ARG CUDA_VERSION=11.7
FROM nvidia/cuda:${CUDA_VERSION}-cudnn8-runtime-ubuntu20.04 AS builder
# 设置时区避免 apt 卡顿
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime
- 分层安装 ROS2
# 安装 ROS2 Humble(逐层减少缓存)RUN apt-get update && apt-get install -y \
curl \
gnupg2 \
lsb-release \
&& curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg \
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2.list
# 单独安装核心包
RUN apt-get update && apt-get install -y \
ros-humble-desktop \
&& rm -rf /var/lib/apt/lists/*
- 模型权重处理
# 阶段二:运行时镜像
FROM nvidia/cuda:11.7-cudnn8-runtime-ubuntu20.04
# 仅复制预编译内容
COPY --from=builder /opt/ros /opt/ros
# 模型权重单独层(便于更新)WORKDIR /models
COPY autoware_model.pth /models/weights/
- 多阶段构建优化
# 构建时添加压缩参数
docker build --squash -t autoware:prod .
性能调优
CUDA 版本对比测试
| CUDA 版本 | 推理延迟 (ms) | 显存占用 (MB) |
|---|---|---|
| 11.4 | 42.3 | 1832 |
| 11.7 | 38.1 | 1765 |
| 12.1 | 39.7 | 1894 |
关键调优参数
# 启动容器时限制资源
docker run -it \
--gpus all \
--shm-size=2gb \
--ulimit memlock=-1 \
-e NVIDIA_DRIVER_CAPABILITIES=compute,utility \
autoware:prod
避坑指南
常见错误解决方案
- libtorch 版本不匹配
- 现象:
undefined symbol: _ZN3c1017RegisterOperatorsD1Ev -
解决:在 Dockerfile 中固定版本
RUN pip install torch==1.12.1+cu116 -f https://download.pytorch.org/whl/torch_stable.html -
ROS2 节点权限问题
- 现象:
Permission deniedwhen launching nodes -
解决:构建时设置用户组
RUN groupadd -g 1000 autoware && \ useradd -u 1000 -g autoware -ms /bin/bash autoware USER autoware -
共享内存不足
- 现象:
bus errorduring IPC - 解决:启动时调整参数
docker run --ipc=host ...
延伸思考
Kubernetes 部署策略
# deployment.yaml 片段
resources:
limits:
nvidia.com/gpu: 2
memory: 8Gi
requests:
nvidia.com/gpu: 1
memory: 4Gi
ONNX 转换建议
# 转换示例
import torch
model = torch.load('autoware_model.pth')
torch.onnx.export(
model,
dummy_input,
"model.onnx",
opset_version=13,
input_names=["lidar"],
output_names=["trajectory"])
验证命令
# 检查模型加载
docker exec -it container_name \
python3 -c "import torch; print(torch.load('/models/weights/autoware_model.pth').keys())"
# 测试推理延迟
ros2 launch autoware_launch planning_simulator.launch.xml
正文完
