代码
鹏城实验室发布基于昇思框架、昇腾硬件的强化学习训练框架GRPO-Training-Suite

鹏城实验室发布基于昇思框架、昇腾硬件的强化学习训练框架GRPO-Training-Suite

鹏城实验室发布基于昇思框架、昇腾硬件的强化学习训练框架GRPO-Training-Suite

本次发布基于Qwen2.5-7B、32B打通GRPO强化学习训练全流程,为强化学习开发者提供了训练接口,支持算法快速开发,提供多种训练优化技术,并内置GRPO强化学习训练流程。

当前代码已在启智社区和昇思社区开源,根据本教程,用户可以快速上手体验,探索强化学习的奥秘!

开源代码仓:

https://openi.pcl.ac.cn/PCL-Reasoner/GRPO-Training-Suite

https://gitee.com/mindspore/mindrlhf

鹏城实验室基于昇思MindSpore AI框架及昇腾AI硬件,率先突破大模型强化学习技术全栈壁垒。通过自主创新硬件、框架及超大规模集群的深度协同,成功构建从硬件算力、算法优化到集群调度的完整技术链条,实现GRPO强化学习训练在Qwen2.5(7B,32B)上的全流程部署,发布并开源GRPO强化学习训练流程和代码。

与我们以往开发的单模型训练代码相比,GRPO强化学习训练流程涉及策略模型与参考模型,通过策略模型生成数据,利用参考模型和奖励函数计算Loss,然后进行策略模型的训练。这个过程需要模型在推理和训练状态间的频繁切换,并涉及参考模型和策略模型推理、训练三份权重,对训练性能和显存管理提出了更高的要求,对于强化学习开发者来说,快速完成算法开发和模型训练是个不小的挑战。昇思MindSpore框架为GRPO强化学习训练流程提供了优化技术:

  • 组件化解耦训练流程与模型定义,支持用户自定义修改模型结构、奖励函数、训练超参等。
  • 训推共部署,实现训练和推理权重在线快速自动重排,避免权重文件落盘操作,节省离线转换保存权重文件的时间开销。
  • 通过异构内存Swap技术,按需加载模型至显存,避免训练和推理的权重同时存在,支持更大规模模型的训练任务。

下一步,鹏城实验室将基于昇思MindSpore及昇腾AI硬件,在代码自动生成优化、科学计算等下游任务上孵化自主创新大模型,并且提供对接多种模型的强化学习流程。

GRPO(Group Relative Policy Optimization,组相对策略优化)是针对数学等逻辑推理任务提出的强化学习训练的算法。强化学习的训练过程是学习一个策略模型,通过不断试错,策略模型与奖励函数的不断交互,策略模型会逐渐倾向于选择能获得更高奖励的行为,自主探索出最佳学习路径。通过GRPO算法的大规模后训练得到的DeepSeek R1模型在逻辑推理能力上得到了显著提升,涌现出了长思维链和反思等深度思考能力,其在数学和编程任务上的表现已超越或媲美OpenAI o1系列模型。

GRPO创新性地引入“组内相对比较”机制,这样的设计直接利用同一批次样本中不同策略输出的相对优势评估,既降低了显存占用,又显著提升了训练稳定性‌。同时,GRPO强化学习训练流程采用‌基于规则的显式奖励函数‌,而非奖励模型‌。这种方法减少了奖励函数被对抗性样本“欺骗”(reward hacking)的风险,使奖励信号更透明、可解释且与任务目标强对齐‌。

一、环境搭建

01 版本匹配关系

02 镜像安装

为了方便复现,我们也提供了镜像。

2.1下载Docker镜像

从GRPO-Training-Container仓中下载镜像文件(https://openi.pcl.ac.cn/PCL-Reasoner/GRPO-Training-Container.git)

2.2基于镜像创建容器

docker run -itd  --privileged  --network=host \
   --shm-size 500g \
   --device=/dev/davinci0 \
   --device=/dev/davinci1 \
   --device=/dev/davinci2 \
   --device=/dev/davinci3 \
   --device=/dev/davinci4 \
   --device=/dev/davinci5 \
   --device=/dev/davinci6 \
   --device=/dev/davinci7 \
   --device=/dev/davinci_manager \
   --device=/dev/hisi_hdc \
   --device /dev/devmm_svm \
   -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
   -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
   -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
   -v /usr/local/sbin:/usr/local/sbin \
   -v /etc/hccn.conf:/etc/hccn.conf \

   CONTAINER_NAME:TAG \
   bash

2.3进入容器

docker exec -it CONTAINER_ID bash

二、使用指南

01 数据集及文件的获取

使用examples/qwen_grpo_tutorial/rlhf_data.py将GSM8k.json转换成mindrecord的形式,此数据路径为mind_dataset_dir的取值。此数据路径在启动训推作为mind_dataset_dir 的值。

python rlhf_data.py --vocab_path /path/to/vocab.json --merges_file_path /path/to/merges.txt --file_path /path/to/raw/data/ --output_path /path/to/mindrecord/

参数说明:

vocab_path:vocab.json路径
merges_file_path:merges.txt路径
file_path:原始数据文件路径
output_path:输出文件路径

其中vocab.json和merges.txt 都可以从Huggingface社区对应模型页面获取。

02 权重获取

由于训练是计算密集型,生成是内存密集型,所以为了最大限度的优化性能,推理与训练阶段采用的并行策略往往不同。因此需要针对推理和训练模型分别进行切分。

下面介绍了获得不同权重切分的方法。

2.1 MindSpore权重转换

完整权重转为MindSpore用的ckpt,进入MindSpore TransFormers路径下。

cd research/qwen2_5/

python convert_weight.py --torch_ckpt_dir /path/to/your/torch/ckpt/  \
--mindspore_ckpt_path /path/to/save/ms/ckpt --dtype bf16 --config_path \  research/qwen2_5/finetune_qwen2_5_7b.yaml

参数说明:

torch_ckpt_dir:torch权重文件
mindspore_ckpt_path:mindspore权重保存路径
config_path:模型权重配置文件

2.2 获得策略文件

cd /path/to/your/mindformers/research/qwen2_5

bash ../../scripts/msrun_launcher.sh "run_qwen2_5.py \
--config /path/to/your/desired/model/yaml \
--run_mode finetune \
--train_data /path/to/mindrecord " 8 PORT output/msrun_log False 2000

参数说明:

# run_qwen2_5.py 参数
config: 模型的配置文件
run_mode: 运行模式选微调
train_data: 训练用的数据文件
# msrun_launcher.sh 参数
单机上卡数8
PORT为节点PORT
join=False
timeout=2000

生成的策略文件在strategy下,在下一步切分ckpt时作为dst_strategy的值。

2.3 获得特定切分的ckpt

nohup python transform_checkpoint.py --src_checkpoint=/path/to/checkpoint.ckpt --dst_checkpoint=/path/to/desired/ckpt/ --dst_strategy=/path/to/strategy/ > output.log 2>&1 &

参数说明:

src_checkpoint:原始权重路径
dst_checkpoint:目标权重路径
dst_strategy:目标权重策略文件路径

03 训练/推理模型配置

3.1 训练模型配置

训练的模型的配置finetune_qwen2_5_7b.yaml:

并行配置:

parallel_config:
  data_parallel: 1 # 数据并行切分为 1
  model_parallel: 4 # 模型并行切分为 4
  pipeline_stage: 2 # 流水线并行切分为 2
  use_seq_parallel: True
  micro_batch_num: 2
  vocab_emb_dp: False
  gradient_aggregation_group: 4
  micro_batch_interleave_num: 2 # mp大于1时,设为1可提升训练效率

训练相关配置在mindrlhf/configs/grpo_configs.py有学习率和GRPO相关的超参。

optimizer: str = 'adamw' # 优化器类型
beta1: float = 0.9  # 优化器adamw超参,下同
beta2: float = 0.95 
eps: float = 1.0e-8 
weight_decay: float = 0.01

epochs: int = 100 # 训练轮数

3.2 推理模型配置

推理的模型的配置predict_qwen2_5_7b_instruct.yaml。

并行配置:


parallel_config:
  data_parallel: 2 # 数据并行切分为2
  model_parallel: 4 # 模型并行切分为4
  pipeline_stage: 1 # 流水线并行切分为1
  micro_batch_num: 1
  vocab_emb_dp: False
  gradient_aggregation_group: 4
  micro_batch_interleave_num: 1

三、启动单机8卡训练脚本

用bash run_grpo.sh启动GRPO强化学习流程。

注意:用户需要确认将MindSpore Transformers和MindSpore RLHF的路径加入PYTHONPATH。

msrun --worker_num=8 --local_worker_num=8 --master_addr=127.0.0.1 \
--master_port=9190 --join=False --log_dir=./qwen2_5_one_log \
examples/qwen_grpo_tutorial/grpo_one_stage.py \
--sft_path_infer ./model_configs/qwen_grpo/predict_qwen2_5_7b_instruct.yaml \
--sft_path_train ./model_configs/qwen_grpo/finetune_qwen2_5_7b.yaml \
--vocab_path /path/to/your/vocab.json \
--merges_file_path /path/to/your/merges.txt \
--mind_dataset_dir /path/to/gms8k.mindrecord \
--save_data_file /path/to/grpo.mindrecord \
--save_ckpt_dir /path/to/save/ckpt \
--use_parallel True \
--load_sft_checkpoint_infer /path/to/infer/ckpt \
--load_sft_checkpoint_train /path/to/train/ckpt \
--load_ref_checkpoint /path/to/ref/ckpt \
--enable_compile_cache False \
--only_save_strategy False

参数说明:

# msrun 参数
worker_num: 总卡数
local_worker_num: 单机的卡数
master_addr:主节点地址
master_port: 主节点端口
join:是否等待所有worker退出
log_dir: 日志路径
# grpo_one_stage.py 参数
sft_path_infer:推理用的模型配置
sft_path_train:训练用的模型配置
vocab_path: vocab.json的路径
merges_file_path:权重合并配置
mind_dataset_dir:训练数据文件的路径
save_data_file:中间推理结果的保存路径(可选)
save_ckpt_dir:训练ckpt的保存路径
use_parallel:是否并行
load_sft_checkpoint_infer: 推理ckpt路径
load_sft_checkpoint_train: 训练ckpt路径
load_ref_checkpoint: 参考模型ckpt路径
enable_compile_cache:是否编译缓存
only_save_strategy:是否保存策略文件

拉起任务后,通过以下指令查看运行日志。

tail -f qwen2_5_one_log/worker_0.log