2025-03-31 19:52:34 中华网
DeepSeek开启全新的后训练范式,带来AI模型技术平权时代,行业纷纷构建自己的高质量高性能的行业RL模型。然而,训练高性能的大尺寸模型通常需要庞大的计算资源和海量数据,这对研究社区的可复现性和进一步探索提出了挑战。为了降低研究门槛并促进开源生态的发展,昇腾MindSpeed RL强化学习开源套件支持大尺寸模型的强化学习高效训练,提供用户方便易用的复现指导,目前已完成在Qwen25-7B/32B基座模型为例复现R1-Zero的实践,模型数学能力大大提升。
R1-Zero复现面临的挑战
目前,针对大规模集群强化学习RL复现R1-Zero,在效率、易用性和训练效果上存在诸多挑战。业界开源RL框架在大尺寸模型RL训练中有权重更新时延高、硬件利用率低、并行策略转换OOM等问题,业界开源RL仓的readme太简单无法支撑用户快速上手,同时,RL训练过程依赖人工经验,较好的规则奖励定义、训练超参调整尤为重要。
基于MindSpeed RL套件
复现R1-Zero
数学能力大幅提升
MindSpeed RL提供了从环境安装、程序运行、训练效果的详细指导,并提供典型配置文件和脚本供用户一键启动,同时采用训推共卡、异步流水、分布式打分器等核心技术进行训练加速。
基于以上能力,分别使用Qwen25-7B和Qwen25-32B作为base模型为例,使用昇腾MindSpeed RL套件复现DeepSeek-R1-Zero范式在Math领域的工作效果,在数学等逻辑推理评测集上,MATH500的分数提升幅度15分左右,达到70.6和83.2,32B模型下的AIME24的提升幅度高达26分。
01MindSpeed RL以Qwen2.5-7B为基座模型为例复现R1-Zero的效果
训练输入:使用Qwen2.5-7B base模型在orz数据集上训练,使用标准的格式奖励和准确性奖励,训练超参如下
训练过程监控:训练过程用Tensorboard可视化工具监控,可以看到模型的回复长度Response length呈现典型的先下降后上升趋势,准确性奖励Accuracy持续上升并逐渐稳定在0.4~0.5之间。
模型效果评估:使用开源榜单评测系统OpenCompass进行模型评估,分数如下:
对于MATH500,Qwen-2.5-7B原模型的得分是54.4,开源社区Open-R1获得69分,而Qwen-2.5-7B+MindSpeed RL得分高达70.6,超越了开源社区;对于AIME24和GPQA,Qwen-2.5-7B+MindSpeed RL的效果也提升了近10分,分别达到16.2和37.3分。
MindSpeed RL以Qwen25-7B为例
复现R1-Zero的模型在数学能力效果超越开源社区
02MindSpeed RL以Qwen2.5-32B为基座模型为例复现R1-Zero的效果
训练输入:使用Qwen2.5-32B模型在deepscaler数据集上使用标准的格式奖励和准确性奖励训练,训练超参如下:
训练过程监控:训练过程用Tensorboard可视化工具监控,可以看到模型的回复长度Response length呈现典型的先下降后上升的趋势,准确性奖励Accuracy保持持续上升;格式奖励Format很快上升到较高的水平。
模型效果评估:使用开源榜单评测系统OpenCompass进行模型评估,分数如下:
对于MATH500,Qwen-2.5-7B原模型的得分是68.6,开源社区SimpleRL-Zoo复现R1-Zero效果获得82.4分,而MindSpeed RL复现R1-Zero得分83.2,超越开源社区;对于AIME24,开源社区SimpleRL-Zoo复现R1-Zero效果获得27.2分,MindSpeed RL复现R1得分30.4,超越开源社区;而对于GPQA,MindSpeed RL复现R1得分41.1,相比基座模型也有9分提升。
MindSpeed RL以Qwen25-32B为例
复现R1-Zero的模型在数学能力效果超越开源社区
03训练后模型出现Aha-moment的自我反思现象
训练前,通过prompt可以引导模型部分遵从的格式,但回答的思考过程较短没有自我反思,样例如下:
训练后,我们观察到经过几十个iterations后模型就有一定概率出现Aha-Moment,从“But wait”上看模型在进行自我反思,出现了R1范式中的模型产生CoT思维链现象,样例如下:
R1-Zero
(以Qwen2.5-32B为例)
复现指南
环境配置
配置MindSpeed RL基础环境以及准备代码,参考安装指南
https://gitee.com/ascend/MindSpeed-RL/blob/master/docs/install_guide.md
模型选择
Qwen2.5-32B下载:
https://gitee.com/link?target=https%3A%2F%2Fhuggingface.co%2FQwen%2FQwen2.5-32B%2Ftree%2Fmain
权重转换
在进行RL训练之前,模型需要从HuggingFace权重转换为megatron权重,可参考权重转换部分:https://gitee.com/ascend/MindSpeed-RL/blob/master/docs/algorithms/grpo.md
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# 设置需要的权重转换参数
# actor使用TP8PP2,将脚本里改成TP8PP2配置
# reference使用TP8PP1,将脚本里改成TP8PP2配置
bash examples/ckpt/ckpt_convert_qwen25_hf2mcore.sh
# 训练完后如需要转回HF格式
bash examples/ckpt/ckpt_convert_qwen25_mcore2hf.sh
模板构造
R1-Zero复现需要在数据处理时加上prompt模板激发......$\boxed{}
<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n<|im_start|>user\nA conversation between User and Assistant. The user asks a question, and the Assistant solves it. The assistant first thinks about the reasoning process in the mind and then provides the user with the answer. The reasoning process and answer are enclosed withinandtags, respectively, i.e.,reasoning process hereanswer herePut your final answer within \\boxed{}.\n{你真正的问题}<|im_end|>\n<|im_start|>assistant\n{模型真正的回答}
数据集
对于32B模型应使用更高难度的数据集,所以我们使用DeepScale 40K来训练。
数据集地址:https://gitee.com/link?target=https%3A%2F%2Fhuggingface.co%2Fdatasets%2Fagentica-org%2FDeepScaleR-Preview-Dataset%2Ftree%2Fmain
数据预处理
需要先配置数据处理的yaml文件(examples\datasets\r1_zero_qwen25_32b.yaml) 自定义数据集需要设置--map-keys映射,或重写自定义handler;具体参考数据集处理部分
Qwen2.5-32B
处理的时候默认使用qwen_r1的模板
# 启动转换
bash examples/data/preprocess_data.sh r1_zero_qwen25_32b
训练配置准备
模型结构的配置文件位于configs/model下,训练配置文件位于configs/目录下,我们以qwen2.5-32b为例[r1_zero_qwen25_32b.yaml],该配置用到了32卡,为了进一步加速可以不断增加推理DP的数量。以下为参数配置:
defaults:
- model:
-qwen25-32b <--网络结构需要定义在model目录的yaml文件下
megatron_training:
global_batch_size:128 <--每个迭代的总样本数
...
dataset_additional_keys:['labels',] <--使用打分器时需要的额外字段
actor_config:
model:qwen25-32b
micro_batch_size:1 <--训练的mbs
...
lr:1e-6
lr_decay_style:constant <--学习率衰减方式
weight_decay:0.0 <--正则化强度系数
lr_warmup_fraction:0.0 <--控制学习率预热
...
no_load_optim: false <--续训加载优化器状态
no_load_rng: false <--续训加载数据随机数生成器
no_save_optim: false <--保存权重时同时保存优化器状态
no_save_rng: false <--保存权重时同时保存数据随机数生成器
ref_config:
model:qwen25-32b
...
rl_config:
blocking: false <--开启异步流水
...
adv_estimator:group_norm <--优势计算方法
mini_batch_size:2048 <--训练更新梯度的bs,一般为gbs*n_samples_per_prompt
...
max_prompt_length:1024 <--最大的prompt长度
clip_ratio:0.2 <--策略裁剪比例
shuffle_minibatch: false <--minibatch里的数据是否打乱
n_samples_per_prompt:16 <--GRPO中一个group内生成的response条数
colocate_actor_ref: false
colocate_all_models: false
rule_reward: true <--开启规则奖励
verifier_function:["acc","strict_format"] <--规则奖励模型方法
verifier_weight:[1.0,1.0] <--规则奖励模型权重
use_tensorboard: true <--开启tensorboard日志功能
actor_resource: <--actorworker资源分配
num_npus:16
reference_resource: <--refworker资源分配
num_npus:16
generate_config:
trust_remote_code: true <--tokenizer相关配置
infer_tensor_parallel_size:4 <--推理时的并行配置
infer_pipeline_parallel_size:1
infer_expert_parallel_size:1
max_num_seqs:128 <--vllm推理并发最大样本限制
max_num_batched_tokens:128000 <--vllm推理并发最大token限制
max_model_len:4096
dtype:"bfloat16"
gpu_memory_utilization:0.9
offload_train_optimizer: true <--卸载训练节点优化器
offload_train_grad: true <--卸载训练节点梯度
offload_train_param: true <--卸载模型权重
sampling_config: <--vllm采样配置
max_tokens:3072 <--单条response最大生成token数量
logprobs:1 <--是否生成logprobs
max_tokens:3072
top_p:0.9
top_k:50
min_p:0.01
temperature:0.9
detokenize: false
...
手动启动训练
与基于ray的其他强化训练一样,我们多机需要先在主节点初始化ray:
# 创建一个集群,端口6344,dashboard端口8260
ray start --head --port 6344 --dashboard-host=0.0.0.0 --dashboard-port=8260
随后,在其他节点加入主节点的集群:
# IP_ADDRESS 处填写主节点 IP 地址
ray start --address="IP_ADDRESS:6344"
最后,在主节点上启动训练:
export HCCL_CONNECT_TIMEOUT=1800
export CUDA_DEVICE_MAX_CONNECTIONS=1
python cli/train_grpo.py --config-name r1_zero_qwen25_32b | tee logs/r1_zero_qwen25_32b_full.log
脚本启动训练
注意:所有节点的代码、权重、数据等路径的层级要保持一致,且启动ray的时候都位于MindSpeed RL目录下
更多详细复现指导见MindSpeed RL开源readme文件
Qwen25-7B R1-Zero复现
https://gitee.com/ascend/MindSpeed-RL/blob/master/docs/solutions/r1_zero_qwen25_7b.md
Qwen25-32B R1-Zero复现
https://gitee.com/ascend/MindSpeed-RL/blob/master/docs/solutions/r1_zero_qwen25_32b.md