2. 开发环境搭建:Ubuntu系统配置、Python虚拟环境、CUDA/cuDNN/TensorRT安装、Docker镜像封装

说实话,环境搭建这事儿,看着简单,但坑是真不少。我带过好几个新人,第一周全耗在配环境上了。你想想看,一个模型在服务器上跑得好好的,换到工控机上就报错,十有八九是环境不一致。

这一章,我就把我在几个产线项目里踩过的坑、总结出来的套路,一次性说清楚。咱们的目标很明确:搭出一套可复现、可迁移、不折腾的开发环境。

2.1 Ubuntu系统配置——别小看这一步

我个人习惯用Ubuntu 20.04 LTS。为什么?因为NVIDIA的驱动和CUDA对20.04的支持最成熟。18.04太老,22.04有些库还没跟上。

2.1.1 系统安装要点

  • 分区建议:/ 分区至少100GB,/home 分区留大点。模型文件、数据集动不动就几十GB。
  • 换源:装完系统第一件事,换国内源。我用的是清华源,速度稳定。
  • 禁用nouveau:这是NVIDIA显卡的开源驱动,跟CUDA不兼容。不关掉它,后面装驱动会报错。
我曾经在一台新机器上没禁用nouveau,直接装NVIDIA驱动,结果黑屏了。折腾了半天才发现是驱动冲突。所以,这一步千万别省。

2.1.2 必备工具安装

sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential cmake git vim htop
sudo apt install -y net-tools openssh-server

这些工具看着基础,但缺一个后面就卡住。尤其是build-essential,编译很多库都得靠它。

2.2 Python虚拟环境——隔离的艺术

做工业项目,最怕的就是依赖冲突。这个项目要TensorFlow 1.x,那个项目要PyTorch 2.0,全装在一起迟早出问题。

我推荐用Miniconda来管理虚拟环境。它比Anaconda轻量,够用就行。

2.2.1 安装Miniconda

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh

装完后,记得初始化:conda init。然后重启终端,就能看到(base)前缀了。

2.2.2 创建项目环境

conda create -n industrial_vision python=3.8
conda activate industrial_vision

我习惯给每个项目单独建一个环境。名字起得有意义,比如industrial_vision,一看就知道是干嘛的。

小技巧:把环境导出成yaml文件,方便别人复现。
conda env export > environment.yaml
别人只要 conda env create -f environment.yaml 就能一键复现你的环境。

2.3 CUDA/cuDNN/TensorRT安装——性能的关键

这部分是重头戏。很多人在这一步翻车,就是因为版本没对齐。

2.3.1 版本匹配原则

我整理了一个对照表,你照着选就行:

PyTorch版本 CUDA版本 cuDNN版本 TensorRT版本
1.10.x 11.3 8.2 8.4
1.13.x 11.7 8.5 8.5
2.0.x 11.8 8.7 8.6
2.1.x 12.1 8.9 8.6

为什么强调版本匹配? 我在一个项目中用了CUDA 11.8配PyTorch 1.10,结果训练时直接报CUDA error: no kernel image is available。查了半天,就是版本不兼容。

2.3.2 CUDA安装步骤

wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run

安装时注意:不要装驱动(Driver那项取消勾选),只装CUDA Toolkit。驱动我们已经单独装过了。

装完后配置环境变量:

export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH

验证:nvcc --version,看到版本号就对了。

2.3.3 cuDNN安装

cuDNN需要去NVIDIA官网下载,要注册账号。下载后解压,把文件拷到CUDA目录:

sudo cp cudnn-linux-x86_64-8.7.0.84_cuda11-archive/include/cudnn*.h /usr/local/cuda-11.8/include/
sudo cp cudnn-linux-x86_64-8.7.0.84_cuda11-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64/
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*

验证:cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

2.3.4 TensorRT安装

TensorRT是NVIDIA的推理优化库。对于边缘部署来说,它是神器。

# 下载TensorRT的tar包
tar -xzvf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz
sudo mv TensorRT-8.6.1.6 /usr/local/
export LD_LIBRARY_PATH=/usr/local/TensorRT-8.6.1.6/lib:$LD_LIBRARY_PATH

安装Python包:

cd /usr/local/TensorRT-8.6.1.6/python
pip install tensorrt-8.6.1.6-cp38-none-linux_x86_64.whl
核心思路:TensorRT能把模型从FP32量化到FP16甚至INT8,推理速度提升2-4倍。我在一个缺陷检测项目里,用TensorRT把推理时间从30ms降到了12ms,完全满足了产线节拍。

2.4 Docker镜像封装——一次构建,到处运行

环境搭好了,怎么保证换台机器也能跑?答案是Docker。

我习惯把整个开发环境打包成Docker镜像。这样不管是换电脑、还是部署到边缘设备,都能保证环境一致。

2.4.1 Docker安装

sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker

装完后,把当前用户加入docker组,避免每次都要sudo:

sudo usermod -aG docker $USER

然后退出重新登录。

2.4.2 编写Dockerfile

下面是我常用的Dockerfile模板:

FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04

# 换源
RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list

# 安装基础工具
RUN apt update && apt install -y python3.8 python3-pip git vim

# 安装Python依赖
RUN pip3 install torch==1.13.1 torchvision==0.14.1 --index-url https://download.pytorch.org/whl/cu118
RUN pip3 install opencv-python numpy matplotlib

# 安装TensorRT
COPY TensorRT-8.6.1.6 /usr/local/TensorRT-8.6.1.6
ENV LD_LIBRARY_PATH=/usr/local/TensorRT-8.6.1.6/lib:$LD_LIBRARY_PATH
RUN pip3 install /usr/local/TensorRT-8.6.1.6/python/tensorrt-8.6.1.6-cp38-none-linux_x86_64.whl

WORKDIR /workspace
CMD ["/bin/bash"]

2.4.3 构建与使用

docker build -t industrial_vision:1.0 .
docker run -it --gpus all -v /path/to/project:/workspace industrial_vision:1.0

--gpus all 让容器能访问GPU。-v 挂载本地代码目录,这样代码修改不用重新构建镜像。

注意:Docker镜像里不要放数据集。数据集太大,应该通过挂载卷的方式动态加载。我曾经把10GB的数据集打进镜像,结果镜像体积暴涨,传输和部署都成了噩梦。

2.5 本章知识体系

下面这张图,把整个环境搭建的流程串起来了:

开发环境搭建知识体系 开发环境搭建流程 Ubuntu 20.04 LTS Miniconda + Python 3.8 CUDA 11.8 + cuDNN 8.7 + TensorRT 8.6 Docker镜像封装 边缘设备部署(Jetson/工控机) 核心原则:版本对齐 → 环境隔离 → 容器化 → 可复现部署

从Ubuntu系统开始,一层层往上搭。每一层都依赖下一层,所以顺序不能乱。我见过有人先装CUDA再装系统,结果驱动死活认不到显卡。

2.6 避坑总结

  • 版本对齐:装之前先查好CUDA、cuDNN、TensorRT、PyTorch的兼容性。NVIDIA官网有对照表。
  • 环境隔离:每个项目一个conda环境,别偷懒。
  • 容器化:环境搭好后,第一时间打包成Docker镜像。这样换机器、换人都不怕。
  • 备份:Dockerfile和conda的yaml文件都放到代码仓库里。这样团队其他人也能一键复现。
我的习惯:每次搭建完环境,我都会写一个README.md,把安装步骤、版本号、踩过的坑都记下来。三个月后回头看,你会感谢当时的自己。