环境准备:GPU服务器选型与Docker容器化搭建

各位同学,咱们直接进入正题。做模型微调,第一件事不是写代码,而是把环境搭好。我见过太多人卡在环境配置上,一卡就是两三天。说白了,环境搞不定,后面全是白搭。

这一章,我带你走一遍完整的流程:从选GPU到装驱动,再到用Docker把环境固化下来。每一步我都会告诉你哪些坑我踩过,哪些地方可以偷懒。

GPU服务器选型:A100还是4090?

先聊硬件选型。很多人一上来就问:「老师,我该买A100还是4090?」我的回答是:看你的钱包和任务规模。

我个人的习惯是这么分的:

  • 个人学习、小规模微调(7B以下模型):RTX 4090完全够用。24GB显存,跑个LoRA微调,7B模型绰绰有余。价格一万出头,性价比很高。
  • 企业级、大规模微调(13B-70B模型):必须上A100(80GB)或H100。显存是硬门槛,模型参数和梯度都要占地方。我曾在项目里用4090硬跑13B模型,结果OOM(显存溢出)了十几次,最后老老实实租了A100。
  • 中间地带(7B-13B):可以考虑RTX 6000 Ada(48GB)或A6000。不过说实话,性价比不如租云GPU。

核心结论:显存是第一优先级。模型参数量 × 2(FP16)就是最低显存需求。比如7B模型,至少需要14GB显存。加上优化器状态和梯度,实际需要20GB以上。

为什么会这样?因为微调时,除了模型参数,你还要存梯度、优化器状态(AdamW要存两份)、以及中间激活值。我刚开始做微调时,以为7B模型14GB显存就够了,结果一跑就炸。后来才知道,激活值才是真正的显存大户。

GPU型号 显存 适合场景 参考价格
RTX 4090 24GB 7B以下模型微调、个人学习 约1.2万
A100 (80GB) 80GB 13B-70B模型微调、企业级 约8万(二手)
H100 80GB 70B+模型、大规模训练 约25万
RTX 6000 Ada 48GB 13B模型、专业工作站 约4万

我的建议:如果你刚开始学,先租云GPU。阿里云、腾讯云、AutoDL都有按小时计费的A100和4090。等确定方向了再买硬件。我当年就是先租了三个月,才决定买4090的。

CUDA与CuDNN安装:别自己折腾

好,硬件选好了,接下来装驱动。这里我要说一句:千万别手动装CUDA和CuDNN。为什么?因为版本匹配问题能让你崩溃一整天。

我曾经在Ubuntu 20.04上手动装CUDA 11.8,结果和系统自带的NVIDIA驱动冲突,黑屏了三次。后来我学乖了,直接用NVIDIA官方提供的nvidia-docker镜像,里面CUDA、CuDNN、TensorRT全给你配好了。

但如果你非要手动装,记住这个流程:

  1. 先装NVIDIA驱动:去NVIDIA官网下载对应显卡的驱动。用nvidia-smi验证。
  2. 再装CUDA Toolkit:版本要和驱动匹配。比如驱动版本≥525,才能装CUDA 12.0。
  3. 最后装CuDNN:下载对应CUDA版本的CuDNN,解压后复制到CUDA目录。
# 检查驱动版本
nvidia-smi

# 安装CUDA 12.1(以Ubuntu为例)
wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run
sudo sh cuda_12.1.0_530.30.02_linux.run

# 配置环境变量
echo 'export PATH=/usr/local/cuda-12.1/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

# 验证CUDA
nvcc --version

# 安装CuDNN(需要先下载)
tar -xzvf cudnn-linux-x86_64-8.9.0.131_cuda12-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-12.1/include
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-12.1/lib64
sudo chmod a+r /usr/local/cuda-12.1/include/cudnn*.h /usr/local/cuda-12.1/lib64/libcudnn*

注意:CUDA版本和PyTorch版本必须匹配。比如PyTorch 2.0需要CUDA 11.7或11.8。你装个CUDA 12.0,PyTorch可能认不出来。我建议直接用PyTorch官方推荐的CUDA版本。

Docker容器化环境搭建:一劳永逸

好了,重点来了。为什么我强烈推荐Docker?因为环境一致性。你想想看,你在本地配好的环境,换台机器就崩了。用Docker,一个镜像到处跑。

我个人的工作流是这样的:

  1. 拉取NVIDIA官方PyTorch镜像
  2. 在镜像基础上安装自己需要的库
  3. 把镜像保存下来,团队共享

具体操作如下:

# 1. 安装Docker和nvidia-docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo apt-get install -y nvidia-container-toolkit

# 2. 拉取PyTorch镜像(含CUDA 12.1)
docker pull pytorch/pytorch:2.1.0-cuda12.1-cudnn8-devel

# 3. 运行容器,挂载代码目录
docker run --gpus all -it --rm \
  -v /home/user/project:/workspace \
  -p 8888:8888 \
  pytorch/pytorch:2.1.0-cuda12.1-cudnn8-devel \
  bash

# 4. 在容器内安装额外依赖
pip install transformers datasets accelerate peft

关键点--gpus all让容器能访问所有GPU。-v挂载本地目录,这样代码修改后容器内立即可见。我习惯把数据集和模型权重也挂载进去,避免重复下载。

嗯,这里要注意一个细节:如果你用--rm参数,容器退出后会自动删除。适合测试环境。生产环境建议用docker commit保存镜像,或者写Dockerfile。

我给你们一个现成的Dockerfile,直接拿去用:

FROM pytorch/pytorch:2.1.0-cuda12.1-cudnn8-devel

RUN pip install --upgrade pip && \
    pip install transformers==4.36.0 \
                datasets==2.15.0 \
                accelerate==0.25.0 \
                peft==0.7.0 \
                bitsandbytes==0.41.0 \
                wandb==0.16.0

WORKDIR /workspace
CMD ["bash"]

构建镜像:docker build -t my-llm-env:latest .

避坑指南:我曾经在Docker里装bitsandbytes时,发现它需要系统级的CUDA库。后来发现用pip install bitsandbytes就行,它会自动检测容器内的CUDA版本。但如果你的镜像CUDA版本太老,可能会报错。建议用最新的PyTorch官方镜像。

验证环境是否可用

环境搭好了,怎么验证?写个简单的Python脚本跑一下:

import torch
import transformers

print(f"PyTorch版本: {torch.__version__}")
print(f"CUDA是否可用: {torch.cuda.is_available()}")
print(f"GPU数量: {torch.cuda.device_count()}")
print(f"当前GPU: {torch.cuda.get_device_name(0)}")

# 测试一个小模型
from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name).to("cuda")

inputs = tokenizer("Hello, I am", return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_length=50)
print(tokenizer.decode(outputs[0]))

如果输出显示CUDA可用,并且模型能正常推理,恭喜你,环境搞定了。

最后说一句:环境配置这件事,一次搞定,后面就省心了。我建议你把配好的Docker镜像push到私有仓库,以后换机器直接pull,十分钟就能开始干活。

下一章,咱们开始聊数据准备。数据质量决定了微调效果的上限,这个坑更大。