环境准备: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全给你配好了。
但如果你非要手动装,记住这个流程:
- 先装NVIDIA驱动:去NVIDIA官网下载对应显卡的驱动。用
nvidia-smi验证。 - 再装CUDA Toolkit:版本要和驱动匹配。比如驱动版本≥525,才能装CUDA 12.0。
- 最后装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,一个镜像到处跑。
我个人的工作流是这样的:
- 拉取NVIDIA官方PyTorch镜像
- 在镜像基础上安装自己需要的库
- 把镜像保存下来,团队共享
具体操作如下:
# 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,十分钟就能开始干活。
下一章,咱们开始聊数据准备。数据质量决定了微调效果的上限,这个坑更大。