在三台GPU服务器上部署分布式deepseek
通过以上步骤,即可在三台 GPU 服务器上实现 DeepSeek 的分布式部署,支持 7B/33B 模型的训练与推理,后续可根据需求调整节点数、GPU 数量及分布式策略(如增加节点扩展至更多 GPU)。分布式训练需主节点(Master)通过 SSH 无密码访问从节点(Worker),需配置三台服务器的 SSH 免密登录。避免多节点重复下载,建议在 Master 节点下载模型,通过 NFS 挂载或。
一、部署前准备(关键前提)
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 torch
def 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 example
dataset = 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)。
更多推荐



所有评论(0)