在三台GPU服务器上部署分布式deepseek
一、部署前准备(关键前提)
1. 硬件与网络要求
- GPU 配置:单台服务器建议至少 1 张 GPU(如 RTX 4090/ A100,显存≥24GB,7B 模型单卡显存占用约 10-15GB,33B 需结合模型并行),三台服务器 GPU 型号建议一致(避免算力不匹配)。
- 网络要求:三台服务器需处于 同一局域网(如内网 IP 段 192.168.1.0/24),建议使用万兆网卡 + 交换机(减少节点间通信延迟,分布式训练对网络带宽敏感)。
- 存储要求:预留足够空间存放 DeepSeek 模型文件(7B 约 13GB,33B 约 60GB,建议使用 NAS 或共享存储挂载,避免多节点重复下载)。
2. 环境一致性配置(所有节点需同步)
分布式部署的核心痛点是 “环境不一致导致通信失败”,需确保三台服务器的 Python、PyTorch、DeepSpeed 等版本完全一致。
步骤 1:安装系统依赖(所有节点执行)
# 更新系统并安装基础依赖
sudo apt update && sudo apt install -y ssh python3-pip git gcc g++
# 安装CUDA(以CUDA 12.1为例,需匹配GPU驱动版本,驱动≥530.30.02)
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 --silent --toolkit
# 配置CUDA环境变量(添加到~/.bashrc)
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
步骤 2:创建虚拟环境并安装依赖(所有节点执行)
# 安装conda(可选,推荐用conda管理环境,避免依赖冲突)
wget https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-x86_64.sh
bash Miniconda3-py310_23.10.0-1-Linux-x86_64.sh -b -p ~/miniconda3
source ~/miniconda3/bin/activate# 创建并激活虚拟环境
conda create -n deepseek-dist python=3.10 -y
conda activate deepseek-dist# 安装核心依赖(版本需严格一致)
pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 --index-url https://download.pytorch.org/whl/cu121
pip install deepspeed==0.12.6 transformers==4.35.2 datasets==2.14.6 accelerate==0.24.1 tokenizers==0.14.1
步骤 3:验证环境(所有节点执行)
# 验证CUDA是否可用
python -c "import torch; print(torch.cuda.is_available())" # 输出True
# 验证DeepSpeed是否正常
deepspeed --version # 输出DeepSpeed 0.12.6及以上
3. 节点间 SSH 免密互通(关键!)
分布式训练需主节点(Master)通过 SSH 无密码访问从节点(Worker),需配置三台服务器的 SSH 免密登录。
步骤 1:选择主节点并配置(以 “节点 1” 为 Master,IP:192.168.1.100 为例)
# 在Master节点生成SSH密钥(一路回车,不设密码)
ssh-keygen -t rsa
# 将公钥分发到自身及另外两台Worker节点(节点2:192.168.1.101,节点3:192.168.1.102)
ssh-copy-id root@192.168.1.100 # 自身免密(避免本地调用报错)
ssh-copy-id root@192.168.1.101 # 分发到Worker1
ssh-copy-id root@192.168.1.102 # 分发到Worker2
步骤 2:验证免密登录(Master 节点执行)
ssh root@192.168.1.101 # 无需输入密码即可登录Worker1
ssh root@192.168.1.102 # 无需输入密码即可登录Worker2
4. 下载 DeepSeek 模型(推荐 Master 节点下载后共享)
避免多节点重复下载,建议在 Master 节点下载模型,通过 NFS 挂载或scp
同步到 Worker 节点。
# 方法1:从Hugging Face下载(需注册账号并获取访问令牌)
git lfs install
git clone https://huggingface.co/deepseek-ai/deepseek-7b-chat # 7B对话模型
# 若下载33B模型:git clone https://huggingface.co/deepseek-ai/deepseek-33b-chat# 方法2:同步到Worker节点(Master执行)
scp -r ./deepseek-7b-chat root@192.168.1.101:/root/
scp -r ./deepseek-7b-chat root@192.168.1.102:/root/
二、分布式部署核心配置(以 DeepSpeed 为例)
DeepSpeed 支持 数据并行、模型并行、ZeRO 优化,可根据模型规模选择策略:
- 7B 模型:三台服务器(假设每台 2 张 GPU,共 6 卡),优先用 数据并行 + ZeRO Stage 2(显存占用低,训练效率高)。
- 33B 模型:需结合 模型并行(TP=2)+ ZeRO Stage 3(拆分模型层到不同 GPU,突破单卡显存限制)。
1. 编写 DeepSpeed 配置文件(ds_config.json
,Master 节点创建)
配置文件定义分布式策略、显存优化、训练参数,所有节点需同步此文件。
{"train_batch_size": 48, // 总批次大小(3节点×2卡×8=48,需根据GPU显存调整)"gradient_accumulation_steps": 4, // 梯度累积步数(减少通信频率)"optimizer": {"type": "AdamW","params": {"lr": 2e-5,"weight_decay": 0.01}},"fp16": { "enabled": true }, // 启用FP16混合精度(降低显存占用)"zero_optimization": {"stage": 2, // ZeRO Stage 2(优化梯度和 optimizer 状态)"contiguous_gradients": true, // 连续梯度(减少内存碎片)"overlap_comm": true, // 通信与计算重叠(提升效率)"reduce_scatter": true},"communication_data_type": "float16", // 通信数据类型(减少带宽占用)"wall_clock_breakdown": false
}
- 若部署 33B 模型,需在
zero_optimization
中添加"stage": 3
,并在启动命令中指定模型并行(--tp=2
)。
2. 编写分布式训练脚本(train.py
,Master 节点创建)
基于transformers
和DeepSpeed
封装训练逻辑,核心是加载模型、处理数据、启动分布式训练。
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, DataCollatorForLanguageModeling
from datasets import load_dataset
from trl import SFTTrainer # 可选,用于指令微调,需安装:pip install trl==0.7.4
import deepspeed
import torchdef main():# 1. 加载模型和分词器model_path = "./deepseek-7b-chat"tokenizer = AutoTokenizer.from_pretrained(model_path)tokenizer.pad_token = tokenizer.eos_token # DeepSeek默认无pad_token,需指定tokenizer.padding_side = "right" # 右padding,避免生成时注意力偏差model = AutoModelForCausalLM.from_pretrained(model_path,torch_dtype=torch.float16, # 匹配FP16配置device_map="auto", # 自动分配设备(DeepSpeed会接管)trust_remote_code=True)model.config.use_cache = False # 训练时禁用缓存# 2. 加载数据集(以中文指令数据集为例,可替换为自定义数据)dataset = load_dataset("json", data_files="./custom_data.json") # 数据格式:[{"prompt":"xxx","response":"xxx"}]def format_data(example):# 按DeepSeek对话格式拼接example["text"] = f"### User: {example['prompt']}\n### Assistant: {example['response']}"return exampledataset = dataset.map(format_data).select_columns(["text"])# 3. 配置训练参数training_args = TrainingArguments(output_dir="./deepseek-dist-output", # 输出目录(所有节点需可访问,建议共享存储)per_device_train_batch_size=8, # 单卡批次大小(3节点×2卡×8=48,匹配ds_config)num_train_epochs=3,logging_steps=10,save_steps=100,fp16=True,deepspeed="./ds_config.json", # 关联DeepSpeed配置report_to="none")# 4. 启动训练trainer = SFTTrainer(model=model,args=training_args,train_dataset=dataset["train"],tokenizer=tokenizer,max_seq_length=2048, # 最大序列长度(DeepSeek支持16k,需根据显存调整)data_collator=DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False))trainer.train()# 保存最终模型trainer.save_model("./deepseek-7b-dist-trained")if __name__ == "__main__":main()
自定义数据集格式:需为 JSON 文件,每行包含prompt
(用户输入)和response
(模型输出),示例:
{"prompt":"介绍人工智能","response":"人工智能是..."}
{"prompt":"解释区块链","response":"区块链是..."}
三、启动分布式训练(Master 节点执行)
DeepSpeed 通过deepspeed
命令自动管理多节点通信,需指定 主节点 IP、端口、节点数、GPU 数。
1. 编写节点列表文件(hostfile
,Master 节点创建)
列出所有节点的 IP 和每张节点的 GPU 数量(假设每台服务器 2 张 GPU):
192.168.1.100 slots=2 # Master节点,2张GPU
192.168.1.101 slots=2 # Worker1节点,2张GPU
192.168.1.102 slots=2 # Worker2节点,2张GPU
2. 启动命令(Master 节点执行)
# 激活虚拟环境
source ~/miniconda3/bin/activate && conda activate deepseek-dist# 启动分布式训练(通过hostfile指定节点)
deepspeed --hostfile ./hostfile \--master_addr 192.168.1.100 \ # 主节点IP--master_port 29500 \ # 主节点通信端口(需未被占用)train.py
- 关键参数说明:
--hostfile
:指定所有节点及 GPU 数量,DeepSpeed 自动分配node_rank
。--master_port
:主节点监听端口,建议用 29500-29510(避免冲突)。- 若部署 33B 模型,需添加
--tp=2
(模型并行度 = 2,拆分模型到 2 张 GPU)。
四、部署后验证与使用
1. 训练过程验证
- 启动后,Master 节点会打印 “DeepSpeed info”,显示节点数、GPU 数、ZeRO 配置等信息。
- 查看各节点 GPU 占用:在 Worker 节点执行
nvidia-smi
,若 GPU 显存占用稳定(如 7B 模型单卡约 12GB),说明分布式通信正常。 - 日志查看:训练日志会输出到
./deepseek-dist-output
,可通过tail -f ./deepseek-dist-output/trainer_log.jsonl
实时查看损失变化。
2. 推理使用(加载训练后的模型)
训练完成后,可在任意节点加载模型进行推理,示例代码:
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch# 加载分布式训练后的模型
model_path = "./deepseek-7b-dist-trained"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path,torch_dtype=torch.float16,device_map="auto",trust_remote_code=True
)# 推理
prompt = "### User: 解释什么是分布式训练?### Assistant:"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs,max_new_tokens=512,temperature=0.7,do_sample=True,eos_token_id=tokenizer.eos_token_id
)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)
五、常见问题排查
节点间通信失败:
- 检查
hostfile
中 IP 是否正确,执行ping 192.168.1.101
验证网络连通性。 - 关闭防火墙:
sudo ufw disable
(或开放 29500 端口:sudo ufw allow 29500
)。
- 检查
GPU 显存不足:
- 降低
per_device_train_batch_size
(如从 8 改为 4),或启用ZeRO Stage 3
(修改ds_config.json
中stage: 3
)。 - 减少
max_seq_length
(如从 2048 改为 1024)。
- 降低
环境版本不匹配:
- 所有节点执行
pip list | grep torch
,确保torch
、deepspeed
版本完全一致。
- 所有节点执行
通过以上步骤,即可在三台 GPU 服务器上实现 DeepSeek 的分布式部署,支持 7B/33B 模型的训练与推理,后续可根据需求调整节点数、GPU 数量及分布式策略(如增加节点扩展至更多 GPU)。