CANN Qwen3 RL训练优化样例
Qwen3系列模型 RL训练优化实践样例【免费下载链接】cann-recipes-train本项目针对LLM与多模态模型训练业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-train概述本样例针对Qwen3-235B-A22B和Qwen3-32B模型基于veRL开源框架以及veRL原生支持的MindSpeed和vLLM-Ascend框架完成了多项强化学习实践。针对Qwen3-235B-A22B RL训练全流程的优化适配参见Qwen3-235B 32K长序列RL训练优化实践。针对Qwen3-32B上的SAM投机推理实践参见SAM投机推理长序列强化学习训练加速利器。注在当前版本由于使用npugraph_ex替代了GE图模式235B长序列优化实践文档中部分特性的patch已经失效若想查看实践中完整的优化实现请参考v0.1.0版本的代码。Qwen3-235B-A22BGRPO算法RL训练基于Atlas A3 64卡集群加载真实权重使用deepscaler数据集Prefill/Decode阶段长度分别为2K与32K最优系统吞吐可达到120TPS/卡性能测试结果如下基础模型机器型号GBSn_samplesstepmax_prompt_length(最大输入长度)max_response_length(最大输出长度)perf/throughput(端到端TPS)Qwen3-235B-A22BAtlas A3 64卡512161204832768120DAPO算法RL训练基于Atlas A3 64卡集群加载真实权重使用dapo-math-17k数据集Prefill/Decode阶段长度分别为2K与34K性能测试结果如下基础模型机器型号GBSn_samplesstepmax_prompt_length(最大输入长度)max_response_length(最大输出长度)perf/time_per_step(首步总时间)最大重试batch数(num_gen_batches)Qwen3-235B-A22BAtlas A3 64卡1281612048348166620s2Qwen3-32BGRPO算法RL训练针对Qwen3-32B模型本样例基于Atlas A3 16卡集群加载真实权重使用deepscaler数据集Prefill/Decode阶段长度分别为2K与34K开启/关闭SAM投机推理特性同时开启/关闭npugraph_ex特性性能测试结果如下基础模型机器型号GBSn_samplesstepmax_prompt_length(最大输入长度)max_response_length(最大输出长度)SAM投机推理npugraph_extiming_s/generate_sequences(首步推理时间)提升Qwen3-32BAtlas A3 16卡128161204834816关闭关闭2444Qwen3-32BAtlas A3 16卡128161204834816开启关闭210613%Qwen3-32BAtlas A3 16卡128161204834816开启开启162133%DAPO算法RL训练针对Qwen3-32B模型本样例基于Atlas A3 16卡集群加载真实权重使用dapo-math-17k数据集Prefill/Decode阶段长度分别为2K与34K开启/关闭SAM投机推理特性同时开启/关闭npugraph_ex特性性能测试结果如下基础模型机器型号GBSn_samplesstepmax_prompt_length(最大输入长度)max_response_length(最大输出长度)SAM投机推理npugraph_extiming_s/generate_sequences(首步推理时间)提升Qwen3-32BAtlas A3 16卡128161204834816关闭关闭4562Qwen3-32BAtlas A3 16卡128161204834816开启关闭410910%Qwen3-32BAtlas A3 16卡128161204834816开启开启326129%硬件要求产品型号Atlas A3 系列操作系统Linux ARM镜像版本cann:8.5.0-a3-openeuler24.03-py3.11驱动版本Ascend HDK 25.3.X 及其它兼容版本见昇腾社区 CANN版本兼容性文档。不同模型所需的最小卡数不同基础模型最少卡数Qwen3-235B-A22B64Qwen3-32B16基于Dockerfile构建环境环境搭建可以基于Dockerfile快速实现我们已经在Dockerfile里配置了必要的昇腾软件和其他第三方软件的依赖。如果遇到网络不通等问题也可以参考附录中的手动准备环境章节。基于Dockerfile创建镜像。# 请预先下载本样例提供的Dockerfile文件Dockerfile.vllm_ascend.mindspeed.qwen3 # 随后基于该Dockerfile创建docker image。请传入镜像名称例如 your_image_name docker build -t your_image_name -f Dockerfile.vllm_ascend.mindspeed.qwen3 . # 请设置容器名称例如 your_docker_name镜像名称同上一步 container_nameyour_docker_name image_nameyour_image_name:latest # 执行docker run命令创建容器可通过-v按需挂载宿主机目录至容器 docker run -itd \ --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/davinci8 --device/dev/davinci9 --device/dev/davinci10 --device/dev/davinci11 --device/dev/davinci12 --device/dev/davinci13 --device/dev/davinci14 --device/dev/davinci15 --device/dev/davinci_manager --device/dev/devmm_svm --device/dev/hisi_hdc \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /var/log/npu/slog/slogd:/var/log/npu/slog/slogd \ -v /usr/local/sbin/:/usr/local/sbin/ \ -v /data/:/data/ \ -v /home/:/home/ \ -v /etc/localtime:/etc/localtime \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /dev/shm:/dev/shm \ --nethost \ --name ${container_name} \ --privileged ${image_name} /bin/bash # 执行docker exec命令进入容器 docker exec -it -u root ${container_name} bash也可通过当前目录run_container.sh构建镜像bash run_container.sh your_docker_name your_image_name:version源码准备及安装所需的python依赖。# 下载本样例所在代码仓以master分支为例 git clone https://gitcode.com/cann/cann-recipes-train.git cd ./cann-recipes-train/llm_rl/qwen3/ # 添加镜像中已经准备好的依赖文件 bash build_project.sh # 安装依赖的python库 pip install -r requirements.txt使能patch修改 可通过apply_all_patches.sh一键执行在当前目录下cann-recipes-train/llm_rl/qwen3运行bash apply_all_patches.sh数据集准备本样例中GRPO使用的deepscaler数据集准备方法与DeepSeek示例相同可参考数据集准备将处理后的训练数据放在data/deepscaler目录下。DAPO使用的dapo-math-17k数据集验证集使用AIME可参考DAPO数据准备将训练数据放在data/dapo_math目录下。gsm8k等其他数据集准备方法可参考verl官方文档。模型权重准备本样例使用的模型权重准备方法如下Qwen3-235B-A22B# 从魔塔社区下载模型的基础文件存放至样例的./Qwen3-235B-A22B-hf目录下不加载权重实验也需要执行这步操作 mkdir ./Qwen3-235B-A22B-hf pip install modelscope modelscope download --model Qwen/Qwen3-235B-A22B config.json tokenizer.json tokenizer_config.json generation_config.json vocab.json --local_dir ./Qwen3-235B-A22B-hf # 下载Qwen3-235B-A22B完整权重至指定目录例如 your_hf_weights此步骤需要目录所在磁盘有440GB以上空间 modelscope download --model Qwen/Qwen3-235B-A22B --local_dir your_hf_weights # source环境变量根据实际CANN安装目录调整 source /usr/local/Ascend/ascend-toolkit/set_env.sh # 配置环境变量 使能all_to_all_overlap export USE_ALLTOALL_OVERLAP1 # 单机执行权重切分切分后权重保存至指定目录修改hf_model_path为huggingface权重下载路径output_path为切分权重保存路径 torchrun --nproc_per_node 16 converter_hf_to_mcore.py \ --hf_model_path your_hf_weights \ --output_path your_sharded_weights \ --trust_remote_code \ --use_cpu_initializationQwen3-32B# 下载Qwen3-32B及完整权重至样例的./Qwen3-32B目录下此步骤需要目录所在磁盘有65GB以上空间。 mkdir ./Qwen3-32B pip install modelscope modelscope download --model Qwen/Qwen3-32B --local_dir ./Qwen3-32BRL后训练执行在本样例代码根目录下按照如下方式启动RL后训练样例。# 请注意以下bash启动脚本中的内容需要手动配置 # -------- ray_start_npu.sh -------- # source脚本路径 根据实际CANN安装目录调整 # MASTER_ADDR ray集群主节点的IP地址每个节点的脚本配置一致 # SOCKET_IFNAME 集群中各节点自己的网卡名可通过ifconfig命令查看 # -------- internal/qwen3_235b_env.sh -------- # VLLM_DP_SIZE: 推理阶段DP配置按推理模型切分和总卡数计算 bash ray_start_npu.sh TRAIN_SCRIPT ENV_SCRIPT # 示例 bash ray_start_npu.sh ./internal/train_grpo_qwen3_235b_128die_random_init.sh ./internal/qwen3_235b_env.sh注如果更换环境CANN包版本建议在运行前手动清除以下缓存目录避免缓存数据干扰rm -rf kernel_meta # 算子编译生成的二进制*.so文件或*.o文件及算子描述文件*.json rm -rf .torchair_cache # 图编译缓存 rm -rf .cache # 当前用户目录下的通用缓存目录 rm -rf /root/.cache # root用户的通用缓存目录 rm -rf /root/atc_data/ # ATC编译的核心磁盘缓存可在ray_start_npu.sh启动训练时添加参数实现随机权重训练GRPO算法、真实权重训练GRPO算法、真实权重训练DAPO算法对应修改如下 | 基础模型 | 训练 | 训练启动脚本| 训练配置脚本| 环境变量配置脚本 | |------|----------|----------|----------|----------| | Qwen3-235B-A22B | 随机权重训练 GRPO算法 |ray_start_npu.sh|./internal/train_grpo_qwen3_235b_128die_random_init.sh|./internal/qwen3_235b_env.sh| | Qwen3-235B-A22B | 真实权重训练 GRPO算法 |ray_start_npu.sh|./internal/train_grpo_qwen3_235b_128die_true_weight.sh|./internal/qwen3_235b_env.sh| | Qwen3-235B-A22B | 真实权重训练 DAPO算法 |ray_start_npu.sh|./internal/train_dapo_qwen3_235b_128die_true_weight.sh|./internal/qwen3_235b_env.sh| | Qwen3-32B | 真实权重训练 GRPO算法 |ray_start_npu.sh|./internal/train_grpo_qwen3_32b_32die_true_weight.sh|./internal/qwen3_32b_env.sh| | Qwen3-32B | 真实权重训练 DAPO算法 |ray_start_npu.sh|./internal/train_dapo_qwen3_32b_32die_true_weight.sh|./internal/qwen3_32b_env.sh|附录文件说明上级目录文件路径说明megatron0001-megatron-bugfix-state_ten_verification.patch在处理优化器状态时新增空值判断避免因空值导致的运行异常megatron0002-megatron-feature-enable_hdp.patch在ROPE中增加HDP相关处理逻辑USE_HDP开启时使能HDP功能megatron0003-megatron-bugfix-fix_hf_converter.patch通过修复参数修复调用converter_hf_to_mcore时参数报错的问题mindspeed0001-mindspeed-bugfix-builder.patch兼容openeuler24.03版本下编译头文件缺失mindspeed0002-mindspeed-feature-enable_hdp.patch在Ring Attention中增加HDP相关处理逻辑USE_HDP开启时使能HDP功能r1_ascend0001-r1_ascend-bugfix-correct_DP_initialization.patch正确初始化DP通信域适配vllm-v0.14.0verl0001-verl-feature-enable_alltoall_overlap.patch根据USE_ALLTOALL_OVERLAP环境变量调整权重加载逻辑verl0002-verl-feature-set_use_tqdm_true.patch开启tqdm进度条便于实时观测推理进度verl0003-verl-feature-recompute_old_log_prob.patch对于GRPO on-policy算法可以使用log_prob.detach()代替old_log_prob减少一次前向计算添加控制参数配置和开启免计算时ppo_epochs1校验verl0004-verl-feature-data_rebalance.patch为缓解多卡推理时长尾负载不均新增data rebalance通过配置项控制启用启用时执行固定重排序确保多卡之间推理prompt尽可能均衡verl0005-verl-feature-moe_alltoallv.patch支持EP使用ALLToALLV做无通信冗余的reshard通过专家参数定向路由方案优化内存使用和通信性能verl0006-verl-feature-weight_converter_alltoall_overlap.patch完善Mcore到HF模型参数名转换逻辑verl0007-verl-bugfix-moe_update_weights.patch修复训推转换时权重shape不一致的问题verl0008-verl-bugfix-enable_compile.patchNPU上MindSpeed训练框架会无效化torch.compile规避训练侧的compile失败在推理时开启compileverl0009-verl-feature-support_EPLB.patchVLLM_ENABLE_EPLB开启时使能推理的EPLBverl0010-verl-feature-enable_hdp.patchUSE_HDP开启时使能HDP功能verl0011-verl-feature-enable_rollout_rebalance.patchROLLOUT_REBALANCE_ENABLE开启时使能Rollout Rebalance功能详细说明可参考RL On-Policy 推理场景的序列级均衡调度引擎verl0012-verl-feature-npugraph_ex_for_spec_decode.patch允许通过脚本配置项配置投机推理以及npugraph_ex相关参数verl0013-verl-bugfix-dataProto_concat.patch合并DataProto数据时避免因不同节点的data[timing][generate_sequences]存在细微差异导致报错verl0014-verl-feature-dapo_data_rebalance.patchdata_rebalanceDAPO算法适配verl0015-verl-feature-hdp_binpack_optimization.patchHDP binpack 优化提升推理/rollout 场景下的打包与负载均衡效率HDP 相关优化verl0016-verl-bugfix-hot_swap_expandable_segments.patch在sleep mode下使能虚拟内存特性热切换verl0017-verl-bugfix-adapt_new_vllm_version.patch修复切换到vllm0.13.0版本引入的import errorverl0018-verl-bugfix-ignore_redundant_logs.patch去除多余的警告日志vllm0001-vllm-feature-disable_gc.patch在decode step前关闭gc避免因内存管理导致host bound影响推理性能vllm0002-vllm-feature-enable_sam_decoding.patchSAM投机推理适配vllm框架在投机推理的配置中支持method为sam的选项vllm0003-vllm-bugfix-rope_registry.patch修复ROPE注册时import flash_attn的bugvllm_ascend0001-vllm_ascend-feature-bs_threshold_for_spec_decode.patch增加投机推理特性自动开关解决投机推理特性在batch_size过高时性能劣化的问题vllm_ascend0002-vllm_ascend-feature-enable_sam_decoding.patchSAM投机推理适配vllm_ascend框架vllm-ascend0003-vllm_ascend-bugfix-set_hccl_op_expansion_mode.patch手动修改TP通信域的hccl_op_extension_mode修复all-gather超时的问题vllm-ascend0004-vllm_ascend-bugfix-npugraph_ex_static_kernel_typo.patch修复npugraph_ex启用static_kernel时的bugvllm-ascend0005-vllm_ascend-bugfix-align_FIA_input_for_TND_layout.patch修复CANN 8.5.0版本FIA算子在TND格式下的入参padding问题vllm-ascend0006-vllm_ascend-feature-chunk_moe.patch针对MoE计算场景分块处理优化解决prefill阶段可能引起的峰值内存过高问题vllm_ascendspec_decode/sam_proposer.pySAM投机推理适配vllm_ascend框架实现SAMProposer类作为vllm调用SAM投机推理能力的接口patches0001-feature-model_converter.patch新增USE_ALLTOALL_OVERLAP开启时hf2mcore权重转换逻辑手动准备环境创建CANN 8.5.0镜像。# 镜像下载 docker pull quay.io/ascend/cann:8.5.0-a3-openeuler24.03-py3.11 # 执行以下脚本创建容器请传入容器名称如 your_docker_name docker run -itd \ --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/davinci8 --device/dev/davinci9 --device/dev/davinci10 --device/dev/davinci11 --device/dev/davinci12 --device/dev/davinci13 --device/dev/davinci14 --device/dev/davinci15 --device/dev/davinci_manager --device/dev/devmm_svm --device/dev/hisi_hdc \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /var/log/npu/slog/slogd:/var/log/npu/slog/slogd \ -v /usr/local/sbin/:/usr/local/sbin/ \ -v /data/:/data/ \ -v /home/:/home/ \ -v /etc/localtime:/etc/localtime \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /dev/shm:/dev/shm \ --nethost \ --name your_docker_name \ --privileged quay.io/ascend/cann:8.5.0-a3-openeuler24.03-py3.11 /bin/bash # 执行docker exec命令进入容器 docker exec -it -u root your_docker_name bash # 安装依赖软件 yum install -y net-tools # openEuler系统 apt install -y net-tools # Ubuntu系统下载依赖的开源框架代码。为了让使用者和开发者直观了解我们基于开源代码做的修改本样例中只包含patch代码其他框架代码需要拉取。在当前目录cann-recipes-train/llm_rl/qwen3执行如下脚本。请注意确保当前环境能够访问互联网。bash download_frameworks_source_code.sh源码编译安装vLLM和vLLM-Ascend。vLLM:VLLM_TARGET_DEVICEempty python3 -m pip install -e /workspace/vllm/[audio] --extra-index https://download.pytorch.org/whl/cpu/ \ python3 -m pip uninstall -y triton \ python3 -m pip cache purgevLLM-Ascend:export PIP_EXTRA_INDEX_URLhttps://mirrors.huaweicloud.com/ascend/repos/pypi \ source /usr/local/Ascend/ascend-toolkit/set_env.sh \ source /usr/local/Ascend/nnal/atb/set_env.sh \ export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/usr/local/Ascend/ascend-toolkit/latest/uname -i-linux/devlib \ export CPLUS_INCLUDE_PATH$CPLUS_INCLUDE_PATH:/usr/include/c/12:/usr/include/c/12/uname -i-openEuler-linux \ python3 -m pip install -v -e /workspace/vllm-ascend/ --exists-actioni --extra-index https://download.pytorch.org/whl/cpu/后续步骤可参考基于Dockerfile构建环境2. 源码准备及安装所需的python依赖和3. 使能patch修改。【免费下载链接】cann-recipes-train本项目针对LLM与多模态模型训练业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-train创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考