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% 资源有限场景

设备条件A(无GPU模式)

  • 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] 查看指定队列详情

设备条件B(GPU模式)

  • 加速卡4090 * 1卡
  • 显存24GB
  • CPU型号2*Intel 8352 36C
  • CPU8核心
  • 内存110GB
  1. 基本环境

    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 install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1
    
    # 国内源安装命令
    # 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');
    "
    pip install colossalai deepspeed transformers datasets peft accelerate bitsandbytes
    pip install -r /public/home/scno0z94vb/task/ColossalAI/requirements/requirements.txt
    
    cd /public/home/scno0z94vb/task/ColossalAI/applications/ColossalChat
    pip install . -e
    
    sudo apt-get update
    sudo apt-get install cmake
    # PyTorch 的 OMP_NUM_THREADS 设置是预防性的,通常不需要担心
    # 如果你需要使用异步保存功能,可以安装 TensorNVMe
    pip install git+https://github.com/hpcaitech/TensorNVMe.git
    # 如果你需要优化 RMSNorm 性能,可以安装 NVIDIA apex
    git clone https://github.com/NVIDIA/apex
    cd apex
    pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
  2. 基本数据地址
  • 模型地址

​ /public/home/scno0z94vb/SothisAI/model/Aihub/DeepSeek-R1-Distill-Llama-70B

  • 数据地址

    /public/home/scno0z94vb/SothisAI/dataset/Console/data/main

  • task

    /public/home/scno0z94vb/task

  1. 训练脚本-GPU

    from colossalai.nn.lr_scheduler import CosineAnnealingLR
    import torch
    
    # === GPU性能优化设置 ===
    # 启用TensorFloat-32精度,大幅提升A100/H100等现代GPU的矩阵运算速度
    torch.backends.cuda.matmul.allow_tf32 = True
    # 启用cuDNN自动调优,为当前GPU选择最优卷积算法
    torch.backends.cudnn.benchmark = True
    
    # === 模型配置 ===
    model = dict(
       type="llama",  # 模型架构类型,可根据Colossal-AI支持情况调整
       pretrained_path="/public/home/scno0z94vb/SothisAI/model/Aihub/DeepSeek-R1-Distill-Llama-70B/main/DeepSeek-R1-Distill-Llama-70B",
       trust_remote_code=True,  # 允许加载远程代码,用于自定义模型架构
    
       # LoRA参数配置
       lora_rank=8,  # LoRA低秩矩阵的秩,值越小参数量越少
       lora_alpha=32,  # LoRA缩放因子,控制适应强度
       lora_dropout=0.1,  # LoRA层的dropout率
       lora_target_modules=["query_key_value"],  # 需要应用LoRA的模块名称
    
       bias="none",  # 不训练偏置参数
       task_type="CAUSAL_LM",  # 任务类型:因果语言模型
    
       # GPU优化参数
       device_map="auto",  # 自动将模型分布到多个GPU
       dtype="bf16",  # 使用BF16精度,比FP16更适合大模型训练,减少精度损失
    )
    
    # === Tokenizer配置 ===
    tokenizer = dict(
       name_or_path="/public/home/scno0z94vb/SothisAI/model/Aihub/DeepSeek-R1-Distill-Llama-70B/main/DeepSeek-R1-Distill-Llama-70B",
       truncation_side="left",  # 超长文本截断左侧(保留右侧关键信息)
       padding_side="right",   # 右填充,兼容大多数训练框架
    )
    
    # === 数据配置 ===
    data = dict(
       train=dict(
           type="csv",  # 训练数据格式
           path="/public/home/scno0z94vb/SothisAI/dataset/Console/data/main/data/simple_data.csv",
           text_field="input",  # 输入文本字段名
           target_field="target",  # 目标文本字段名
           max_length=4096,  # 模型支持的最大上下文长度
           pad_to_max_length=False,  # 动态填充(减少冗余计算)
    
           # GPU优化:使用高速内存(/dev/shm)缓存预处理数据
           dataset_cache_dir="/dev/shm/data_cache",
       ),
       val=dict(
           type="jsonl",
           path="/path/to/val.jsonl",
           max_length=4096,
           pad_to_max_length=False,
       ),
    )
    
    # === 训练配置 ===
    train = dict(
       optimizer=dict(
           type="AdamW",  # 优化器类型
           lr=2e-5,  # 学习率,大模型通常需要较小的学习率
           weight_decay=0.01,  # 权重衰减,防止过拟合
           betas=(0.9, 0.95),  # Adam优化器的指数移动平均参数
           eps=1e-8,  # 数值稳定性参数
           use_fused=True,  # 使用PyTorch的融合AdamW优化器,提升计算效率
       ),
    
       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=4,  # 每个GPU的批次大小,根据GPU内存调整
           num_workers=4,  # 数据加载工作线程数
           pin_memory=True,  # 固定内存页,加速CPU到GPU的数据传输
           prefetch_factor=4,  # 预取的批次数量,提高数据加载效率
       ),
    
       gradient_accumulation_steps=4,  # 梯度累积步数,模拟更大批次
       clip_grad_norm=1.0,  # 梯度裁剪范数,防止梯度爆炸
    
       # 混合精度训练配置
       fp16=dict(
           enabled=True,  # 启用混合精度训练
           loss_scaler="dynamic",  # 动态损失缩放,避免梯度下溢
       ),
    
       logging=dict(
           interval=10,  # 日志输出间隔(步数)
       ),
    )
    
    # === 分布式训练配置 ===
    distributed = dict(
       tp_size=1,  # 张量并行度(水平分割模型层)
       pp_size=1,  # 流水线并行度(垂直分割模型层)
       dp_size=4,  # 数据并行度(模型副本数)
    
       # ZeRO优化配置
       zero_stage=3,  # 使用ZeRO Stage 3优化,分片优化器状态、梯度和参数
       cpu_offload=False,  # 不启用CPU卸载(GPU内存充足时使用)
    
       # 内存优化技术
       gradient_checkpointing=True,  # 梯度检查点:以计算换内存
       activation_checkpointing=True,  # 激活值检查点:减少激活值内存占用
    )
  2. 启动脚本

    # 单节点多GPU微调  GPU数量一致
    torchrun --standalone --nproc_per_node=1 /public/home/scno0z94vb/task/ColossalAI/applications/ColossalChat/examples/training_scripts/lora_finetune.py \
    --config ./finetune_deepseek_R1_GPU.py \
    --save_dir ./out/model/ \
    --pretrained /public/home/scno0z94vb/SothisAI/model/Aihub/DeepSeek-R1-Distill-Llama-70B/main/DeepSeek-R1-Distill-Llama-70B \
    --dataset /public/home/scno0z94vb/SothisAI/dataset/Console/data/main/data/simple_data.csv
    # python lora_finetune.py -m /path/to/pretrained_model -d /path/to/dataset
    
    # 单机多卡训练    
    colossalai run --nproc_per_node=4 main.py --config config.py
    
    # 主机节点(IP: 192.168.1.1)
    colossalai run --nproc_per_node=4 --nnodes=2 --node_rank=0 --master_addr="192.168.1.1" --master_port=29500 main.py --config config.py
    
    # 从机节点(IP: 192.168.1.2)
    colossalai run --nproc_per_node=4 --nnodes=2 --node_rank=1 --master_addr="192.168.1.1" --master_port=29500 main.py --config config.py