SuperAPI AI 工具集

DeepSeek-671B-SFT-Guide

DeepSeek-671B-SFT-Guide 是由中国科学院自动化研究所与北京文歌科技有限公司联合推出的开源解决方案,专注于 DeepSeek-V3/R1 671B 满血版模型的全参数微调。项目提供了从训练到推理的完整代码和脚本,并总结了实践中的经验与结论。其核心亮点包括:实现了包含 DeepSeek-V3/R1 训练逻辑的建模文件;基于数据并行(DeepSpeed ZeRO)与序列并行(SP)实现了 671B 模型的全参数微调;梳理了模型训练与部署的全流程,涵盖常见问题与解决方案。该指南面向需要大规模模型微调的研究人员与工程师,提供了详细的硬件配置、环境搭建、数据准备、训练启动、权重转换及推理部署步骤,并附有实验结论与训练截图,帮助用户高效完成 DeepSeek-V3/R1 的定制化训练。

访问官网

工具介绍

项目概述

DeepSeek-671B-SFT-Guide 是一个开源解决方案,用于 DeepSeek-V3/R1 671B 模型的全参数微调。该项目由中国科学院自动化研究所与北京文歌科技有限公司联合推出,包含从训练到推理的完整代码和脚本,以及实践中积累的经验和结论。

主要能力

  • 实现了包含 DeepSeek-V3/R1 训练逻辑的建模文件(位于 ./model 目录,代码逻辑基于 DeepSeek-V3 论文和 DeepSeek-V2 建模文件完成)。
  • 基于数据并行(DeepSpeed ZeRO)与序列并行(SP)实现了 DeepSeek-V3/R1 671B 的全参数微调。
  • 总结了模型训练与部署的全流程,包括遇到的坑、问题及解决方案。

使用方式

硬件配置

单台服务器配置见项目表格,集群中有 32 台相同配置的机器,共享 100TB 存储空间,挂载在 /nfs。操作系统为 Ubuntu 22.04,机器间使用 IB 网络通信,GPU 间使用 NVLink 通信,CUDA 版本为 12.6。

环境搭建

项目扩展并改进了 xtuner 框架,以支持 DeepSeek V3/R1 的全参数微调(即 DeepseekV3ForCausalLM 模型架构),支持数据并行(基于 DeepSpeed ZeRO 的 DP)和序列并行(SP)。需安装 Python 环境,根据项目中的 requirements.txt 安装依赖,并将 ./code/xtuner 中与 DeepseekV3ForCausalLM 训练相关的核心代码覆盖到原始 xtuner 包中的对应代码。

数据准备

项目扩展了 OpenAI 标准数据格式以兼容推理数据。每条原始训练数据格式如下:如果存在推理过程,assistant 角色的 reasoning_content 字段不为空。为简化处理逻辑,按照 DeepSeek 训练格式将 reasoning_content 和 content 合并到 content 字段。此外,为兼容多轮对话训练逻辑,为每轮 assistant 角色添加了 loss 字段,仅对 loss 值为 true 的 content 计算损失。项目提供了转换后数据的示例文件 ./data/train_example.json 供参考。实际训练时,程序会根据 DeepSeek V3/R1 训练模板自动转换为特定格式(此处仅展示)。

启动训练

项目提供了训练代码和启动脚本:

  • ./code/scripts/sft_deepseek.py:sft 训练配置文件,包括超参数设置、模型和 tokenizer 配置、训练策略等。在此文件中修改模型训练相关配置。
  • ./code/scripts/sft_deepseek.sh:sft 训练启动脚本,是单节点的执行文件,需要通过 slurm 或 pdsh 在每台机器上执行。对于每台机器,训练启动命令的唯一区别是 NODE_RANK 值。如果有 32 台机器,范围从 0 到 31。

以 pdsh 为例,启动训练步骤如下:

  1. 将项目 ./model 目录中提供的 modeling_deepseek.py 文件覆盖到从 huggingface 等平台下载的对应原始文件;
  2. 使用 pdsh 启动训练,在第 0 台机器上执行命令 pdsh -R ssh -w node[0-31] 'bash ./code/scripts/sft_deepseek.sh' 以在 32 台机器上启动模型的全参数微调任务。根据机器主机名或 IP 地址修改 node[0-31]。训练期间,可以通过 tensorboard 可视化训练过程(损失变化等)。

项目提供了若干实验结论,包括不同并行策略和配置下模型训练的可行性。训练数据约 100k,训练上下文长度为 32k。表格报告了使用的机器数量(nodes)、序列并行(sp)、数据并行方法(dp)、单卡批次大小(bs)、迭代次数(epoch)、学习率(lr)、单卡内存(mem)、实验记录和备注。训练截图显示,在构建的推理数据上全量微调 DeepSeek V3 时,初始损失通常在 3.5 左右,训练 1 个 epoch 后损失收敛到 1.2 左右。

模型权重转换

训练期间,建议使用至少 100TB 的 SSD 大容量存储,因为单个 pth 中间结果占用约 7.4TB 磁盘空间。训练后,需要将 pth 转换为更好兼容主流推理框架(如 vllm)的 huggingface 格式。在单台机器节点上执行 bash ./code/scripts/convert_pth_to_hf.sh 完成模型权重格式转换。可以根据实际情况修改脚本中的 pth 路径和权重保存路径。注意,此过程需要大量 CPU 内存,可以通过虚拟内存扩展以防止内存不足。Swap(交换分区)是 Linux 的虚拟内存,用于在物理内存(RAM)不足时将部分数据存储到磁盘,释放 RAM。

模型推理部署

根据 DeepSeek V3 Github 介绍,有多种方式在本地部署模型。项目使用 vLLM 对全量微调后的模型进行了简单的部署测试。假设已根据 vLLM 官方文档创建了名为 vllm 的环境。 如果使用 slurm 集群,参考提供的脚本并执行 sbatch 命令 sbatch ./code/scripts/vllm_deploy_slurm.sh 提交作业。半精度(bf16/fp16)模型建议使用 4 台机器 32 张卡部署。如果需要配置 ray 或 api server 的端口号,可以自行修改 sh 文件。 如果需要通过 pdsh 启动部署(假设使用 node0~node3 四台机器),参考以下步骤:

  1. 设置环境变量(node0~node3)。
  2. 启动 Ray Head(node0)。
  3. 启动 Ray Worker(node1~node3)。
  4. 启动 vLLM(node0)。 启动后,可以通过 curl 命令测试接口是否正常启动。一段时间后,如果终端输出预期响应,说明从训练到部署的整个流程已成功完成。

适用场景

适用于需要对 DeepSeek-V3/R1 671B 模型进行全参数微调的研究人员、工程师和团队,特别是在大规模集群环境下进行训练和部署的场景。

限制

项目未明确说明模型微调的具体效果、收费情况、价格、平台兼容性等细节,这些信息暂未提供。用户需根据自身硬件条件和需求评估可行性。

致谢

项目致谢了 DeepSeek-V2/V3/R1、Huggingface transformers、DeepSpeed、Xtuner、vLLM 等开源项目。本项目采用 Apache-2.0 许可证。