共计 2972 个字符,预计需要花费 8 分钟才能阅读完成。
核心痛点
- CUDA/cuDNN 版本冲突问题
-
本地部署时最常见的 ”Hell World” 场景:PyTorch 要求 CUDA 11.3 而 TensorRT 需要 CUDA 11.6。建议通过
nvidia-smi查看驱动支持的最高 CUDA 版本,再使用 Docker 的--gpus all参数隔离环境。
-
显存爆炸现象
-
生成 1080P 视频时,未经优化的模型显存占用可能超过 24GB。实测发现:
- 原生 PyTorch 推理:1920×1080 帧占用 18.2GB
- 经过 TensorRT-FP16 优化后:同分辨率仅需 9.8GB
-
Python 依赖冲突
- 典型报错
ImportError: cannot import name 'COMMON_SAFE_ASCII_CHARACTERS'往往源于:- pip 版本过旧(需≥21.3)
- 多个 requirements.txt 中存在版本范围重叠(如 numpy>=1.19 又要求 numpy<1.21)
技术选型
-
推理引擎对比
| 方案 | 1080P FPS | 显存占用 | 首次加载耗时 |
|—————-|———-|———-|————–|
| PyTorch 原生 | 3.2 | 18.2GB | 2.1s |
| TensorRT-FP32 | 8.7 | 12.4GB | 6.8s |
| TensorRT-FP16 | 14.5 | 9.8GB | 7.2s |
| ONNX Runtime | 5.1 | 15.7GB | 3.5s | -
部署方案选择
- Conda 环境适合快速实验,但存在以下问题:
- 无法隔离系统级依赖(如 libgl1)
- 环境迁移时经常出现
UnsatisfiableError
- Docker 方案优势:
- 通过多阶段构建可压缩镜像体积(实测从 8.4GB→1.2GB)
- 支持指定精确的 CUDA 基础镜像(如
nvidia/cuda:11.6.2-cudnn8-devel-ubuntu20.04)
实战代码
Dockerfile 示例
# 阶段 1:构建环境
FROM nvidia/cuda:11.6.2-cudnn8-devel-ubuntu20.04 AS builder
RUN apt-get update && apt-get install -y \
python3.8 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
# 使用 pipenv 锁定依赖版本
COPY Pipfile Pipfile.lock /app/
WORKDIR /app
RUN pip install pipenv && \
pipenv install --system --deploy
# 阶段 2:生产镜像
FROM nvidia/cuda:11.6.2-cudnn8-runtime-ubuntu20.04
COPY --from=builder /usr/local/lib/python3.8/dist-packages /usr/local/lib/python3.8/dist-packages
COPY --from=builder /usr/local/bin /usr/local/bin
COPY . /app
# 启用 NVIDIA 运行时
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility
TensorRT 量化代码
import tensorrt as trt
# 创建 builder 配置
builder = trt.Builder(TRT_LOGGER)
config = builder.create_builder_config()
config.set_flag(trt.BuilderFlag.FP16) # 启用 FP16 量化
config.max_workspace_size = 1 << 30 # 预分配 1GB 显存
# 转换 ONNX 模型
explicit_batch = 1 << (int)(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)
network = builder.create_network(explicit_batch)
parser = trt.OnnxParser(network, TRT_LOGGER)
with open("model.onnx", "rb") as f:
parser.parse(f.read())
# 构建引擎
serialized_engine = builder.build_serialized_network(network, config)
with open("engine.trt", "wb") as f:
f.write(serialized_engine)
生产级考量
-
分块推理策略
def tile_inference(model, frame, tile_size=512): height, width = frame.shape[:2] output = np.zeros_like(frame) for y in range(0, height, tile_size): for x in range(0, width, tile_size): tile = frame[y:y+tile_size, x:x+tile_size] output[y:y+tile_size, x:x+tile_size] = model(tile) return output -
监控方案配置
# prometheus.yml 片段 scrape_configs: - job_name: 'video_inference' static_configs: - targets: ['localhost:8000'] metrics_path: '/metrics'
# Grafana 监控指标示例
from prometheus_client import Gauge
gpu_mem_usage = Gauge('gpu_memory_usage', 'GPU memory in MB')
gpu_mem_usage.set(torch.cuda.memory_allocated() / 1e6)
避坑指南
- 驱动版本组合
-
实测稳定组合:
- Ubuntu 20.04 LTS
- NVIDIA Driver 510.47.03
- CUDA 11.6 Update 1
- cuDNN 8.4.0
-
ffmpeg 色偏问题
-
添加硬件加速参数时务必指定像素格式:
ffmpeg -hwaccel cuda -pix_fmt yuv420p -i input.mp4 output.mp4 -
多进程显存死锁
- 错误做法:直接使用
multiprocessing模块 - 正确方案:
import torch.multiprocessing as mp if __name__ == '__main__': mp.set_start_method('spawn') # 必须放在主程序 ctx = mp.get_context('spawn') pool = ctx.Pool(processes=4)
资源链接
实践感悟
经过三个月的生产环境迭代,最大的教训是:不要盲目追求最新版本。曾因强制升级到 CUDA 11.7 导致整个流水线崩溃,最后回退到 11.6 才稳定运行。建议所有关键依赖都通过 pip freeze > requirements.txt 锁定版本,并在 Dockerfile 中使用 --no-cache-dir 避免隐式升级。

