DeepSeek-R1-70B调优实操

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 内存无法支持

关键说明:

  1. 内存需求计算逻辑

    • 全参数微调:权重(FP8)+ 优化器状态(BF16,2 个矩)+ 激活 / 中间变量,例如 70B 模型优化器状态占比约 70%(56GB/80GB)。
    • LoRA 微调:仅更新 1% 参数(如 70B 模型约 700M 参数),优化器状态内存同比减少,最低可至全参数的 10%。
  2. 硬件适配边界

    • 110GB 内存临界值:仅能支持 70B 及以下版本 的全参数微调,或 110B 版本的 LoRA 微调(需严格优化配置)。
    • 显存扩展技术:得一微电子 AI-MemoryX 可扩展显存至 10TB,但系统内存(RAM)需求仍需匹配优化器状态规模。
  3. 优化策略对比

    技术方案 内存节省比例 性能影响 适用场景
    标准 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

环境准备

  1. 基本环境安装
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
  1. 准备脚本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,
)
  1. 启动微调

使用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保持一致
  1. 作业命令
  • squeue 查看作业列表

  • scontrol show job [JOBID] 查看指定ID作业详情

  • scancel [JOBID] 取消指定ID作业

  • sinfo 查看队列列表

  • scontrol show partition [QUEUENAME] 查看指定队列详情