CANN/cann-recipes-train:基于verl框架和代码沙盒环境的代码强化学习实践
基于verl框架和代码沙盒环境的代码强化学习实践
【免费下载链接】cann-recipes-train本项目针对LLM与多模态模型训练业务中的典型模型、加速算法,提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-train
概述
本项目基于 1.5B 深思考模型,采用 verl,实现了高效且稳定的长上下文 Code RL训练。我们的贡献主要有:
- 开发了一个可扩展的分布式代码执行沙盒 ScaleBox,支持大规模多机部署、主流 RL 框架兼容训练及多种模型与基准的高效统一评估;
- 提供了融合 verl 与 ScaleBox 的统一部署镜像,支持在单一节点中同时运行 ScaleBox 服务与 verl 训练任务,同时支持零成本迁移至华为云平台 ModelArts;
- 在昇腾环境中验证了基于 verl 框架与 ScaleBox 沙盒的 Code RL 训练效果。
ScaleBox 是一个可扩展的分布式代码执行沙盒,其核心特性包括:
可扩展的分布式代码沙盒体系
- 支持多机分布式沙盒部署与请求负载均衡
- 支持单元测试并行与实例级并行
面向 Code RL 的统一训练接口和评估套件
- 提供高效的批量评估接口
common_evaluate_batch,相较于run_code,通过单次请求处理多个测试用例,显著提升训练效率 - 内置对 LiveCodeBench、HumanEval、MBPP 等主流代码评测基准的支持,实现一键式快速评估
- 提供高效的批量评估接口
灵活的 Special Judge 判题机制
- 支持自定义判题逻辑,能够灵活适应具有多种正确答案的复杂编程题目
下面提供了相关模型的训练参数和性能测试结果(详细的评测细节见 模型评测 章节):
| Model | Machine | GBS | n_samples | training_step | max_prompt_length | max_response_length | LiveCodeBench (pass@1) | |-|-|-|-|-|-|-|-| | DeepSeek-R1-Distill-Qwen-1.5B | Atlas A2 8卡 | 128 | 8 | 500 | 2048 | 8192 | 19.80 | | Qwen3-4B-Instruct-2507 | Atlas A3 16卡 | 128 | 8 | 450 | 2048 | 8192 | 44.18 | | Qwen3-30B-A3B-Instruct-2507 | Atlas A3 32卡 | 128 | 8 | 450 | 2048 | 8192 | 56.27 |
硬件要求
Atlas A2/A3 系列产品,单机八卡
软件要求
- verl: commit c651b7b4207e408875f132c4226969ef3495d408 (based on v0.7.0.dev)
- vllm==0.11.0
- vllm_ascend==v0.11.0rc1
文件说明
├── patches │ └── verl # 修改补丁总目录 │ └── 0001-verl-feature-improve_rl_usability.patch # verl支持Code RL的补充性修改 ├── figures # 图表目录 │ ├── reward.png # 训练奖励值折线图 │ └── training_progress.png # 训练进度折线图 ├── verl.Dockerfile # 环境部署文件 ├── verl_sandbox.Dockerfile # 环境部署文件 ├── build_dataset.py # 示例训练数据集构建脚本 ├── scalebox.py # verl适配ScaleBox的自定义奖励函数文件 ├── run_code_rl_qwen2_5_1_5b.sh # Qwen2.5示例训练脚本 ├── run_code_rl_qwen3_4b.sh # Qwen3示例训练脚本 ├── run_code_rl_qwen3_30b.sh # Qwen3示例训练脚本 └── README.md # 说明文档环境准备
构建 Docker 镜像
- 构建支持 Code RL 的 verl 镜像
docker build --network=host -f verl.Dockerfile -t verl:main-c651b7b-py311-cann8.3.RC1 .- 在 verl 镜像基础上,构建支持 ScaleBox 的镜像,实现 ScaleBox 和 verl 的融合部署
首先拉取 ScaleBox 代码,以获得配置环境需要的脚本和数据:
git clone https://link.gitcode.com/i/956cbc85858f3e30456ef77668a56f0c然后在 ScaleBox 项目下,执行:
docker build --network=host -f verl_sandbox.Dockerfile -t verl_sandbox:main-c651b7b-py311-cann8.3.RC1 .构建适配 ScaleBox 的 verl 框架
- 拉取 verl 代码并切换到指定版本
git clone https://github.com/volcengine/verl cd verl git checkout c651b7b4207e408875f132c4226969ef3495d408 cd ..- 应用指定 patch
为了更好地执行 Code RL 训练任务,verl 框架需应用以下 patch。该 patch 主要包含以下修改:
- 在
prime reward manager中,增加对code_contests数据源的支持; - 调整
prime reward manager的并发进程数,从 64 降至 32,以避免沙盒资源竞争; - 延长
prime reward manager的任务超时时间,从 300s 延长至 3000s,以支持更大批量数据下的代码执行; - 增强训练过程中的日志打印,便于调试。
遵循下面的指令应用对应 patch:
git apply patches/verl/0001-verl-feature-improve_rl_usability.patch部署 ScaleBox 服务
- 启动 verl_sandbox 融合镜像
docker run -it --privileged --name=start_verl_sandbox --user root --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/dcmi:/usr/local/dcmi \ -v /usr/bin/hccn_tool:/usr/bin/hccn_tool \ -v /usr/local/sbin:/usr/local/sbin \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \ -v /etc/ascend_install.info:/etc/ascend_install.info \ -v /etc/hccn.conf:/etc/hccn.conf \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ verl_sandbox:main-c651b7b-py311-cann8.3.RC1 /bin/bash- 激活 ScaleBox 服务必备环境
source /home/ma-user/miniconda3/bin/activate sandbox-base- 部署 ScaleBox 服务
以下提供针对 Code RL 单节点训练的部署命令,更多分布式部署功能见 ScaleBox 仓库
export HOST=0.0.0.0 # 服务器主机地址 export PORT=8080 # 服务端口 export WORKERS=32 # Uvicorn 服务并行 Worker 数量 export MAX_MEM=unlimited # 单进程最大内存占用 cd ScaleBox make run-online > deploy_${HOST}:${PORT}.log 2>&1 &执行上述命令后,服务成功部署至http://0.0.0.0:8080。基于下面的命令可验证服务是否部署成功:
curl 'http://0.0.0.0:8080/run_code' \ -H 'Content-Type: application/json' \ --data-raw '{"code": "print(\"Hello, world!\")", "language": "python"}'预期返回:
{"status":"Success","message":"","compile_result":null,"run_result":{"status":"Finished","execution_time":0.02984905242919922,"return_code":0,"stdout":"Hello, world!\n","stderr":""}数据集准备
基于 PrimeIntellect/verifiable-coding-problems 数据,过滤其中较高质量的 Python 代码数据部分,作为训练数据(verifiable-coding-problems-python-only)。具体数据处理脚本为:
python build_dataset.py强化学习训练
示例脚本run_code_rl_qwen2_5_1_5b.sh中涉及:
- 模型:DeepSeek-R1-Distill-Qwen-1.5B
- 数据:verifiable-coding-problems-python-only
- 最大输出长度:8k
根据需求配置脚本对应参数,运行下述指令即可启动训练:
source /home/ma-user/miniconda3/bin/activate base # 激活训练环境 bash run_code_rl_qwen2_5_1_5b.sh模型评测
本实验基于 LiveCodeBench 数据集评测模型的代码生成能力,推理参数遵循 DeepSeek-R1 相关实验设置。
实验设置
LiveCodeBench 评测数据相关参数:
- release_version: v5
- start_date: 2024-08-01
- code_execution: ScaleBox
推理相关参数:
- n: 4
- temperature: 0.6
- top_p: 0.95
- max_tokens: 32768
实验结果
以下是本项目的实验结果,包括训练过程中的奖励变化和在 LiveCodeBench 评测集上的性能提升情况。
DeepSeek-R1-Distill-Qwen-1.5B
具体性能结果:
| Steps | LiveCodeBench (Pass@1) |
|---|---|
| 0 | 15.41 |
| 50 | 15.77 |
| 100 | 15.95 |
| 150 | 16.67 |
| 200 | 16.31 |
| 250 | 16.49 |
| 300 | 17.83 |
| 350 | 18.91 |
| 400 | 18.37 |
| 450 | 18.46 |
| 500 | 19.80 |
Qwen3-4B-Instruct-2507
具体性能结果:
| Steps | LiveCodeBench (Pass@1) |
|---|---|
| 0 | 33.60 |
| 50 | 34.86 |
| 100 | 37.63 |
| 150 | 38.26 |
| 200 | 38.71 |
| 250 | 39.96 |
| 300 | 40.23 |
| 350 | 41.67 |
| 400 | 40.50 |
| 450 | 44.18 |
Qwen3-30B-A3B-Instruct-2507
具体性能结果:
| Steps | LiveCodeBench (Pass@1) |
|---|---|
| 0 | 46.59 |
| 50 | 47.85 |
| 100 | 50.45 |
| 150 | 51.34 |
| 200 | 51.88 |
| 250 | 51.52 |
| 300 | 54.12 |
| 350 | 53.94 |
| 400 | 54.21 |
| 450 | 56.27 |
【免费下载链接】cann-recipes-train本项目针对LLM与多模态模型训练业务中的典型模型、加速算法,提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-train
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
