2. 测试环境搭建:GPU服务器配置、Docker容器化部署、Python虚拟环境与依赖管理
环境搭建这件事,说简单也简单,说复杂能让你折腾一整天。我见过太多团队在算法上花了几个月,结果环境配不好,模型跑不起来。说白了,测试环境就是你的实验台,台子不稳,啥都白搭。
这一章,咱们把GPU服务器、Docker容器、Python虚拟环境这三块彻底捋清楚。我按自己实际项目的经验来,你跟着走一遍,基本不会踩坑。
2.1 GPU服务器配置:别让显卡闲着
人脸识别训练和测试,GPU是核心。CPU也能跑,但一张1080Ti能顶几十个核的CPU。我建议你至少准备一张显存8GB以上的NVIDIA显卡,比如RTX 3070或更高。
2.1.1 驱动与CUDA安装
先装驱动,再装CUDA,顺序别搞反。我遇到过有人先装CUDA再装驱动,结果nvidia-smi死活不认卡。
# 查看显卡型号
lspci | grep -i nvidia
# 安装驱动(Ubuntu 20.04示例)
sudo apt update
sudo apt install nvidia-driver-470
# 重启后验证
nvidia-smi
驱动装好之后,装CUDA Toolkit。注意版本匹配——PyTorch 1.10对应CUDA 11.3,PyTorch 2.0对应CUDA 11.8或12.1。我习惯用runfile安装,干净利落。
# 下载CUDA 11.8 runfile
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
# 配置环境变量
echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
# 验证
nvcc --version
2.1.2 cuDNN安装
cuDNN是深度学习的加速库,人脸识别里的卷积操作全靠它提速。安装其实就三步:下载、解压、复制文件。
# 解压cuDNN
tar -xzvf cudnn-linux-x86_64-8.6.0.163_cuda11-archive.tar.xz
# 复制到CUDA目录
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-11.8/include/
sudo cp -P cudnn-*-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*
nvidia-smi看驱动版本,用nvcc --version看CUDA版本。两个命令输出不一致?说明环境变量没配好。
2.2 Docker容器化部署:一次构建,到处跑
Docker的好处不用多说——环境隔离、快速复现、团队协作。我参与过的项目,几乎都用Docker来统一测试环境。你想想看,算法工程师在本地跑得好好的,到测试服务器上就报错,这种问题用Docker直接根治。
2.2.1 Docker与NVIDIA Container Toolkit安装
先装Docker,再装nvidia-docker2,这样才能在容器里用GPU。
# 安装Docker
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
# 安装NVIDIA Container Toolkit
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt update
sudo apt install nvidia-docker2
sudo systemctl restart docker
# 验证GPU是否可用
docker run --rm --gpus all nvidia/cuda:11.8.0-base nvidia-smi
--gpus all参数让容器能访问宿主机所有GPU。如果只想用某张卡,写成--gpus '"device=0"'。
2.2.2 构建人脸识别测试镜像
我一般基于PyTorch官方镜像来构建,省去装CUDA和cuDNN的麻烦。下面这个Dockerfile是我实际项目里用的,精简过。
# Dockerfile
FROM pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime
# 安装系统依赖
RUN apt-get update && apt-get install -y \
libgl1-mesa-glx \
libglib2.0-0 \
libsm6 \
libxext6 \
libxrender-dev \
libgomp1 \
&& rm -rf /var/lib/apt/lists/*
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目代码
COPY . .
# 默认命令
CMD ["python", "test_face_recognition.py"]
构建和运行命令也很简单:
# 构建镜像
docker build -t face-recognition-test:1.0 .
# 运行容器(挂载数据卷)
docker run --gpus all -it --rm \
-v /data/face_dataset:/app/dataset \
-v /data/models:/app/models \
face-recognition-test:1.0
2.2.3 Docker Compose管理多服务
人脸识别测试往往不止一个服务——可能有API服务、数据库、消息队列。用Docker Compose统一管理,一键启动所有服务。
# docker-compose.yml
version: '3.8'
services:
face-api:
build: .
ports:
- "5000:5000"
volumes:
- ./models:/app/models
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
redis:
image: redis:7-alpine
ports:
- "6379:6379"
postgres:
image: postgres:15
environment:
POSTGRES_DB: face_test
POSTGRES_USER: test
POSTGRES_PASSWORD: test123
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
docker-compose.yml和Dockerfile放在项目根目录。这样新同事拉下代码,一条docker-compose up就能跑起来,省去一堆环境配置的沟通成本。
2.3 Python虚拟环境与依赖管理
Docker解决的是操作系统级别的环境隔离,Python虚拟环境解决的是包依赖级别的隔离。两者不冲突,我通常两个都用——Docker里再建虚拟环境,双重保险。
2.3.1 Conda vs venv:怎么选?
| 特性 | Conda | venv |
|---|---|---|
| 包管理范围 | Python + 系统库(如CUDA) | 仅Python包 |
| 环境隔离 | 强隔离,独立Python解释器 | 软隔离,共享系统Python |
| 安装速度 | 较慢(依赖解析复杂) | 快(pip直接安装) |
| 适用场景 | 需要非Python依赖(如OpenCV、FFmpeg) | 纯Python项目 |
我个人习惯:人脸识别项目用Conda,因为经常需要装dlib、opencv这些带C++扩展的库,Conda能自动处理系统依赖。纯Python的API服务用venv,轻量快速。
2.3.2 Conda环境搭建实战
# 创建环境(指定Python版本)
conda create -n face_recognition python=3.9
# 激活环境
conda activate face_recognition
# 安装核心依赖
conda install pytorch torchvision torchaudio cudatoolkit=11.6 -c pytorch -c conda-forge
conda install opencv dlib -c conda-forge
# 安装其他依赖
pip install -r requirements.txt
requirements.txt示例:
# 人脸识别相关
insightface==0.7.3
onnxruntime-gpu==1.15.1
scikit-learn==1.2.2
# 数据处理
numpy==1.24.3
pandas==2.0.3
Pillow==10.0.0
# 测试工具
pytest==7.4.0
pytest-cov==4.1.0
pytest-benchmark==4.0.0
# 工具库
tqdm==4.65.0
loguru==0.7.2
pyyaml==6.0
pip freeze > requirements.txt生成锁定版本。
2.3.3 依赖管理的坑与解法
依赖冲突是人脸识别项目里最常见的坑。比如insightface要求onnxruntime<=1.15,但另一个库要求onnxruntime>=1.16,这就冲突了。
我的解法是三步走:
- 先查兼容性表:去每个库的GitHub看Release Notes,确认版本对应关系。
- 用Conda解决:Conda的依赖解析比pip强,遇到冲突先试试
conda install。 - 实在不行就分环境:两个库实在不兼容,就建两个虚拟环境,分别跑不同的任务。
pip install。我见过有人把系统Python搞崩了,重装系统才解决。虚拟环境就是你的安,一定要用。
2.4 整体架构一览
下面这张图把整个测试环境的关系画清楚了。从硬件到应用层,每一层都有对应的工具和技术。
从下往上看,每一层都依赖下一层。硬件层提供算力,系统层提供驱动和CUDA支持,容器层做环境隔离,环境层管理Python依赖,最上面才是你的测试代码。哪一层出问题,测试都跑不起来。
nvidia-smi,装好Docker先跑docker run --gpus all nvidia/cuda:11.8.0-base nvidia-smi,建好虚拟环境先跑python -c "import torch; print(torch.cuda.is_available())"。每一步都验证通过,再往下走。
嗯,环境搭建这部分就这些。你按照这个流程走一遍,GPU服务器、Docker容器、Python虚拟环境应该都能搞定。记住,环境是基础,基础打牢了,后面的测试和上线才能顺风顺水。