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不兼容。不关掉它,后面装驱动会报错。
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,一看就知道是干嘛的。
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
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 挂载本地代码目录,这样代码修改不用重新构建镜像。
2.5 本章知识体系
下面这张图,把整个环境搭建的流程串起来了:
从Ubuntu系统开始,一层层往上搭。每一层都依赖下一层,所以顺序不能乱。我见过有人先装CUDA再装系统,结果驱动死活认不到显卡。
2.6 避坑总结
- 版本对齐:装之前先查好CUDA、cuDNN、TensorRT、PyTorch的兼容性。NVIDIA官网有对照表。
- 环境隔离:每个项目一个conda环境,别偷懒。
- 容器化:环境搭好后,第一时间打包成Docker镜像。这样换机器、换人都不怕。
- 备份:Dockerfile和conda的yaml文件都放到代码仓库里。这样团队其他人也能一键复现。