第四章:软件环境搭建

好,到了真正动手的环节了。前面我们聊了硬件选型、网络规划,那些都是准备工作。这一章,咱们要把地基打牢——把Linux系统、容器环境、Python和CUDA全家桶都装好。

说实话,我见过太多项目栽在环境搭建这一步。不是Python版本冲突,就是CUDA驱动没对上。嗯,咱们一步步来,别急。

4.1 Linux操作系统配置

我个人习惯用Ubuntu 20.04 LTS或22.04 LTS。为什么?因为NVIDIA的驱动和CUDA对这两个版本支持最好。你非要用CentOS也不是不行,但踩坑概率会高不少。

4.1.1 基础系统安装

装系统我就不细说了,重点说几个关键配置:

  • 磁盘分区:建议把/var和/opt单独分区。Docker默认把数据存在/var/lib/docker,模型文件动辄几十G,分区不够就麻烦了。
  • 关闭swap:大模型推理时,swap一开,性能直接崩。我遇到过客户现场推理慢得像蜗牛,查了半天发现swap没关。
  • 内核参数调优:主要是网络和内存相关的参数。

关键配置命令:

# 关闭swap
sudo swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 内核参数优化
cat >> /etc/sysctl.conf <<EOF
net.core.somaxconn = 65535
vm.max_map_count = 262144
kernel.shmmax = 68719476736
EOF
sysctl -p

4.1.2 用户与权限管理

千万别用root跑大模型服务。我曾经有个项目,测试环境一切正常,上了生产就报权限错误——就是因为root用户下Docker的socket权限没处理好。

我建议创建一个专用用户:

sudo useradd -m -s /bin/bash llmuser
sudo usermod -aG docker llmuser
sudo usermod -aG sudo llmuser

4.2 Docker与Kubernetes安装

容器化部署是大模型私有化的标配。为什么?因为环境隔离、快速扩缩容、版本管理都靠它。

4.2.1 Docker安装

Docker的安装其实很简单,但要注意版本。我个人推荐Docker CE 24.0以上版本,对GPU支持更好。

我的经验:别用系统自带的包管理器装Docker,版本太老。用官方脚本最稳。

# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

# 添加Docker官方GPG密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 添加仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 验证安装
sudo docker run hello-world

4.2.2 NVIDIA Container Toolkit

要让Docker用上GPU,必须装这个。说白了,它就是个桥梁,让容器里的程序能调用宿主机的GPU。

# 添加NVIDIA仓库
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-get update
sudo apt-get install -y nvidia-container-toolkit

# 重启Docker
sudo systemctl restart docker

# 测试GPU是否可用
sudo docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi

注意:如果nvidia-smi报错,八成是驱动版本和CUDA镜像不匹配。我踩过这个坑,折腾了两天才发现是驱动太老。

4.2.3 Kubernetes安装(可选)

如果你的模型服务需要高可用、自动扩缩容,那K8s是必须的。但说实话,单机部署大模型的话,Docker Compose就够了。

我建议用kubeadm安装,版本选1.28或1.29:

# 安装kubeadm、kubelet、kubectl
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

4.3 Python环境与CUDA/cuDNN安装

大模型的训练和推理,Python是绕不开的。而CUDA和cuDNN,就是让GPU干活的关键。

4.3.1 Python环境配置

我个人强烈推荐用Miniconda管理Python环境。为什么?因为项目之间Python版本和依赖包经常打架,conda能完美隔离。

# 下载Miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

# 安装
bash Miniconda3-latest-Linux-x86_64.sh

# 创建专用环境
conda create -n llm python=3.10
conda activate llm

# 安装常用包
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install transformers accelerate sentencepiece

一个小技巧:我习惯把conda环境建在/opt/conda_envs下,这样多用户都能用,而且备份方便。

4.3.2 CUDA与cuDNN安装

这里有个关键点:CUDA版本要和你的显卡驱动匹配。怎么看?运行nvidia-smi,看右上角的CUDA Version。

我一般用runfile方式安装,因为可以指定安装路径,方便多版本共存:

# 下载CUDA 12.1
wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run

# 安装(注意不要装驱动,只装CUDA Toolkit)
sudo sh cuda_12.1.0_530.30.02_linux.run --toolkit --silent --override

# 配置环境变量
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

# 验证
nvcc --version

cuDNN的安装更简单,下载后解压到CUDA目录就行:

# 下载cuDNN(需要NVIDIA账号,从官网下载)
# 解压
tar -xzvf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz

# 复制文件到CUDA目录
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*

4.4 环境验证

装完别急着跑,先验证一下所有组件是否正常:

# 验证CUDA
python -c "import torch; print(torch.cuda.is_available())"
# 应该输出 True

# 验证cuDNN
python -c "from torch.backends import cudnn; print(cudnn.is_available())"
# 应该输出 True

# 验证Docker GPU
docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi

完整的环境结构图:

大模型私有化部署软件环境栈 大模型应用层 Transformers / vLLM / TensorRT-LLM Python运行时环境 Miniconda / Python 3.10 / PyTorch CUDA + cuDNN CUDA 12.1 / cuDNN 8.9 容器编排层 Docker / Kubernetes / NVIDIA Container Toolkit 操作系统层 Ubuntu 22.04 LTS / Linux内核优化 依赖关系方向

这张图很直观地展示了整个软件栈的层次关系。从上到下,每一层都依赖下一层。我见过有人跳过了容器层,直接在裸机上跑,结果换机器时环境配了三天。所以,别偷懒,该用的工具都用上。

好了,环境搭建就到这里。记住一个原则:版本匹配。驱动、CUDA、cuDNN、PyTorch,这四个东西的版本必须对齐。我建议你建一个版本对照表,贴在工位上。

避坑指南:我曾经在生产环境遇到过一个问题——Docker容器里跑模型,显存占用持续增长,最后OOM。排查了两天,发现是cuDNN版本和PyTorch不匹配。从那以后,我每次装环境都会先查官方兼容性矩阵。

下一章,我们会聊数据准备和模型下载。但在此之前,先把这章的内容动手实践一遍。环境搭好了,后面的事就顺了。


公众号:蓝海资料掘金营,微信deep3321