DeepSeek-R1-70B调优实操
要求说明
DeepSeek模型微调内存需求与硬件适配表
模型参数规模 | 全参数微调内存需求 | LoRA 微调内存需求 | 推荐 GPU 配置 | 推荐 CPU 配置 | 关键技术 / 备注 |
---|---|---|---|---|---|
1.5B - 14B | 32GB - 64GB | 10GB - 20GB | 单卡 A100 40GB | 64 核 CPU | FP8 权重存储,激活量化优化,支持单机训练 |
70B | 80GB - 100GB | 50GB 以下 | 单卡 H100 80GB 或 双卡 A100 40GB(NVLink) | 96 核 CPU | 混合精度(FP8 权重 + BF16 优化器),LoRA 可降低 99% 可训练参数 |
110B - 175B | 150GB - 200GB | 80GB - 120GB | 双卡 H100 80GB(NVLink) | 128 核 CPU | 需启用梯度检查点 + CPU offload,训练速度下降约 20% |
340B - 671B | >300GB | 200GB - 300GB | 4 卡 H100 80GB(NVLink) | 256 核 CPU | 依赖分布式训练(数据并行 + 模型并行),单机 110GB 内存无法支持 |
关键说明:
-
内存需求计算逻辑:
- 全参数微调:权重(FP8)+ 优化器状态(BF16,2 个矩)+ 激活 / 中间变量,例如 70B 模型优化器状态占比约 70%(56GB/80GB)。
- LoRA 微调:仅更新 1% 参数(如 70B 模型约 700M 参数),优化器状态内存同比减少,最低可至全参数的 10%。
-
硬件适配边界:
- 110GB 内存临界值:仅能支持 70B 及以下版本 的全参数微调,或 110B 版本的 LoRA 微调(需严格优化配置)。
- 显存扩展技术:得一微电子 AI-MemoryX 可扩展显存至 10TB,但系统内存(RAM)需求仍需匹配优化器状态规模。
-
优化策略对比:
技术方案 内存节省比例 性能影响 适用场景 标准 FP8 训练 - 原生速度 14B 及以下模型 LoRA(rank=64) ~90% 精度损失 < 1% 70B 及以上模型 蒸馏版模型 ~60% 性能损失 < 5% 资源有限场景
设备条件
-
CPU 110G/7核心
-
显存 异构加速卡64G(难以调用)
-
模型 DeepSeek-R1-Distill-Llama-70B
/public/home/scno0z94vb/SothisAI/model/Aihub/DeepSeek-R1-Distill-Llama-70B/main/DeepSeek-R1-Distill-Llama-70B
-
训练数据
/public/home/scno0z94vb/SothisAI/dataset/Console/data/main/data/训练数据.csv
环境准备
- 基本环境安装
conda create -n py3.10 python=3.10 -y
pip install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
##安装PyTorch CPU版本 注意python需要3.0以上
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
## 若版本冲突需卸载指定版本 pip index versions <package_name>
pip install torch==2.5.1+cpu torchvision==0.20.1+cpu torchaudio==2.5.1+cpu \
--index-url https://download.pytorch.org/whl/cpu
# 国内源安装命令
# pip install torch torchvision torchaudio -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
# 执行验证安装结果
python -c "
import torch,torchvision,torchaudio;
print(f'\n\033[1mPyTorch Environment Diagnostics\033[0m');
print(f'PyTorch Version: \033[1m{torch.__version__}\033[0m');
print(f'torchvision: \033[1m{torchvision.__version__}\033[0m');
print(f'torchaudio: \033[1m{torchaudio.__version__}\033[0m');
print(f'CPU: \033[1m{torch.cpu.is_available()}\033[0m');
print(f'GPU: \033[1m{torch.cuda.is_available()}\033[0m');
"
# 安装Colossal-AI及其依赖
pip install colossalai deepspeed transformers datasets peft accelerate bitsandbytes
# 可能缺失coati,提示缺失再执行即可
# pip install git+ssh://git@github.com/hpcaitech/Coati.git
# 拉取ColossalAI工具
git clone https://github.com/hpcaitech/ColossalAI.git
# or
git clone https://mirrcator.ghproxy.com/https://github.com/hpcaitech/ColossalAI.git
# 安装依赖
# pip install -r /home/ColossalAI/requirements/requirements-test.txt
pip install -r /home/ColossalAI/requirements/requirements.txt
## 手动移除 flash-attn
cd /work/home/ac5ixifol4/soft/ColossalAI/applications/ColossalChat
pip install -e .
# 验证 coati
python -c "from coati.dataset.loader import RawConversationDataset; print('Success')"
# 切换脚本目录-或变更后续脚本文件地址examples/training_scripts/lora_finetune.py
# 主机gcc版本低时
conda install -c conda-forge gxx_linux-64=9.5.0
conda install -c conda-forge libaio
conda install cmake make gcc_linux-64 gxx_linux-64 -y
## CPU
pip install --ignore-installed --upgrade tensorflow
## GPU
# pip install --ignore-installed --upgrade tensorflow-gpu
# 禁用 CUDA 检测(确保只安装 CPU 版本)
export DISABLE_CUDA=1
pip install tensornvme --no-binary :all
conda install six=1.16.0
conda install packaging=1.16.0
- 准备脚本finetune_deepseek_R1.py
from colossalai.nn.lr_scheduler import CosineAnnealingLR
import torch
# CPU专属优化
torch.set_num_threads(3) # 根据CPU核心数调整(如16核设为8)
# 模型配置(适配DeepSeek-R1架构)
model = dict(
type="llama", # 若Colossal-AI支持,可改为"deepseek_llama"
pretrained_path="/work/home/ac5ixifol4/SothisAI/model/Aihub/DeepSeek-R1-Distill-Llama-70B",
trust_remote_code=True, # 启用远程代码信任(关键)
lora_rank=8,
lora_alpha=32,
lora_dropout=0.1,
lora_target_modules=["query_key_value"], # 替换为实际参数名 在 Llama 中可能是 q_proj、k_proj、v_proj
bias="none",
task_type="CAUSAL_LM",
)
# Tokenizer配置
tokenizer = dict(
name_or_path="/work/home/ac5ixifol4/SothisAI/model/Aihub/DeepSeek-R1-Distill-Llama-70B", # 与模型同路径
truncation_side="left", # DeepSeek-R1默认截断左侧(保留右侧关键信息)
padding_side="right", # 右填充(兼容大多数训练框架)
)
# 数据配置(适配DeepSeek-R1输入格式)
data = dict(
train=dict(
type="csv", # 推荐JSONL格式
path="/work/home/ac5ixifol4/SothisAI/dataset/Console/data/main/data/simple_data.csv",
text_field="input", # 输入字段名
target_field="target", # 目标字段名
max_length=4096, # 模型支持的最大上下文
pad_to_max_length=False, # 不强制填充到最大长度,采用动态填充策略(减少冗余计算)
),
val=dict(
type="jsonl",
path="/path/to/val.jsonl",
max_length=4096,
pad_to_max_length=False,
),
)
# 训练配置(CPU优化)
train = dict(
optimizer=dict(
type="AdamW",
lr=2e-5, # 降低学习率(适配大模型)
weight_decay=0.01,
betas=(0.9, 0.95),
),
lr_scheduler=dict(
type=CosineAnnealingLR,
total_steps="${(len(train_dataset) // (train.dataloader.batch_size * distributed.dp_size)) * train.max_epochs * train.gradient_accumulation_steps}",
warmup_steps=0.05, # 延长预热阶段
),
max_epochs=3,
dataloader=dict(
batch_size=2, # CPU下降低批次大小
num_workers=2, # 减少工作线程
pin_memory=False, # CPU关闭pin_memory
),
gradient_accumulation_steps=4,
clip_grad_norm=1.0,
)
# 分布式配置(CPU限制)
distributed = dict(
tp_size=1,
pp_size=1,
dp_size=2, # 降低数据并行度
zero_stage=0,
cpu_offload=False,
)
- 启动微调
使用Colossal-AI提供的启动脚本进行微调:
# 单节点多GPU微调 nproc_per_node设置为CPU核数的一半,且和脚本中dp_size保持一致
torchrun --standalone --nproc_per_node=2 /work/home/ac5ixifol4/soft/ColossalAI/applications/ColossalChat/examples/training_scripts/lora_finetune.py \
--config /work/home/ac5ixifol4/task/finetune_deepseek_R1.py \
--output_dir /work/home/ac5ixifol4/task/model/test/
参数说明:
--config
: 指定配置文件路径--output_dir
: 微调后模型的保存路径--nproc_per_node
: 指定使用的GPU数量,若为CPU,则设置为CPU核数的一半,且和脚本中dp_size保持一致
- 作业命令
-
squeue 查看作业列表
-
scontrol show job [JOBID] 查看指定ID作业详情
-
scancel [JOBID] 取消指定ID作业
-
sinfo 查看队列列表
- scontrol show partition [QUEUENAME] 查看指定队列详情