You need to enable JavaScript to run this app.
文档中心
GPU云服务器

GPU云服务器

复制全文
下载 pdf
AIGC实践
HPC-VeRL Code Sandbox最佳实践
复制全文
下载 pdf
HPC-VeRL Code Sandbox最佳实践
本文介绍VeRL Code Sandbox在构建高效且安全的代码生成强化学习环境方面的最佳实践方法。​
背景信息​
在Deepseek-R1模型之后,基于强化学习的代码生成取得了显著进步,模型能通过与代码执行环境互动实现学习和改进。但直接运行大语言模型(LLM)生成的代码存在安全隐患,因为这些代码可能包含恶意或不稳定指令,会威胁宿主系统。为解决此问题,Coding Sandbox技术应运而生,它为代码执行营造安全、隔离的环境,避免潜在危害,保证实验的可控性和可重复性。该技术不仅保障了底层系统安全,还为评估和提升模型的代码生成能力提供了可靠平台,例如在经典的Livecodebench/HumanEval这类代码能力测试基准场景中发挥作用。​
在强化学习(RL)训练流程中的Rollout阶段,为收集经验,需大规模并行执行生成的代码片段。veFaaS Coding Sandbox的设计充分考虑了高并发需求,具备支持百万核超低延迟(150毫秒)的弹性伸缩能力,实现了高效的Rollout并发。这种弹性能力使得系统可以根据训练负载状况,动态地调整沙箱数量,对于加速RL训练进程、提升GPU利用率和整体训练的吞吐量有较大价值。​
本文使用的训练框架是veRL(Volcano Engine Reinforcement Learning for LLMs),是云平台针对大语言模型(LLMs)的强化学习框架。它不仅具备灵活、高效且可扩展的强化学习训练,还提供了名为“HybridEngine”的框架,该框架将控制流(在单进程中运行)与计算流(在分布式多进程中运行)分离,并且可以支持多种计算后端、训练与推理并行策略和性能优化技术。 ​
步骤一:在veFaaS上创建SandboxFusion沙箱服务​
SandboxFusion是一款开源的基于HTTP协议的代码沙盒服务,支持运行23种编程语言,拥有namespace&cgroup轻隔离能力,支持部署在多样化设备上。​
  1. 参考创建Web应用,在函数服务控制台创建函数。具体配置如下:​
  • 业务所在地域:华北2(北京)​
  • 创建函数的方式:创建「Web应用」​
  • 函数代码:​
  • 运行时:Native​
  • 部署方式:容器镜像 -> 公共镜像 -> sandbox-fusion​
  • 启动命令:bash /root/sandbox/scripts/run.sh​
  • 监听端口:8080​
  • 高级配置:​
  • 实例规格:1vCPU 2GiB​
  • 执行超时:60sec​
  • 单实例多并发:不启用(为了一次请求独占一个Sandbox,防止雪崩)​
  • 环境变量:使用表单编辑 -> HOME:/home/tiger ​
  • ​​​
  1. 发布函数。单击“发布”按钮,为提升并发水平,可选择256-500个实例数量(这里的实例数量可根据后续VeRL训练设置进行灵活适配调整),确认发布。​
  • ​​​
  1. 创建API网关实例,具体配置如下:​
  • 地域:选择华北2(北京)​
  • 网关类型:选择Serverless网关​
  • Prometheus 工作区:可作监控,选择自己的工作区即可,不需要的话可以不开启服务​
  • ​​​
  1. 创建API网关服务(域名),关联第3步中创建的API网关实例。​
  • ​​​
  • 网关实例:选择已创建的API网关实例​
  • 网关服务:选择已创建的API网关服务​
  • 跨域开关:开启​
  • ​​​
  1. API网关触发器创建成功后,获取触发器的 公网访问 地址,以备后续使用。​
  • ​​​
  • 直接单击访问链接即可进入Playground Sandbox,开启Code Sandbox的前端代码编辑界面。​
  • ​​​
步骤二:使用创建的Sandbox连接VeRL训练​
  1. 参考通过向导购买实例,创建高性能计算GPU实例。具体配置如下:​
  • 计算规格:ecs.hpcpni3ln.45xlarge​
  • 镜像:Ubuntu 22.04 with GPU Driver 535.161.08 and doca 64 bit​
  1. 进行环境搭建和模型下载。包括镜像拉取,容器创建,下载数据集Eurus-2-RL-Data(这里仅使用其中的coding数据)与预训练模型Qwen2.5-7B-Instruct-1M 。​
  1. 执行vim install.sh命令,创建脚本文件。​
  1. 将以下代码复制到install.sh文件中。​
  • ​
    #!/bin/bash​
    ​
    # 颜色定义​
    RED='\033[0;31m'​
    GREEN='\033[0;32m'​
    YELLOW='\033[0;33m'​
    NC='\033[0m' # No Color​
    ​
    # 错误处理函数​
    handle_error() {​
    echo -e "${RED}错误: 步骤 $1 失败!${NC}"​
    exit 1​
    }​
    ​
    echo -e "${GREEN}===== 开始一键搭建 VeRL code Sandbox 环境&下载预训练模型和数据集 ====${NC}"​
    ​
    # 步骤1: 拉取镜像并创建容器​
    echo -e "${YELLOW}步骤1: 拉取镜像并创建容器...${NC}"​
    docker run -d -itd --entrypoint /bin/bash --memory="1000g" --shm-size="256g" --privileged --runtime=nvidia --gpus all --network host --name verl_code_sandbox --cap-add=SYS_ADMIN --user=root -v /var/run/nvidia-topologyd/:/var/run/nvidia-topologyd/ -e VLLM_HOST_IP=$(hostname -I | awk '{print $1}') -e NCCL_DEBUG=INFO -e GLOO_SOCKET_IFNAME=eth0 -e CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 -e NCCL_MIN_NCHANNELS=24 -e NCCL_IB_QPS_PER_CONNECTION=8 -e SWANLAB_API_KEY=<you_swanlab_api_key> iaas-gpu-cn-beijing.cr.volces.com/gpu-images/verl:torch2.6.0-cu129-vllm0.8.3-ray2.46-demo-v4 -c bash || handle_error "1"​
    echo -e "${GREEN}步骤1完成: 容器已创建${NC}"​
    ​
    # 步骤2: 在容器内创建数据目录​
    echo -e "${YELLOW}步骤2: 在容器内创建数据目录...${NC}"​
    docker exec -it verl_code_sandbox mkdir -p /data1/llm /data1/datasets || handle_error "2"​
    echo -e "${GREEN}步骤2完成: 数据目录已创建${NC}"​
    ​
    # 步骤3: 下载预训练模型和数据集​
    echo -e "${YELLOW}步骤3: 下载预训练模型和数据集(这可能需要一些时间)...${NC}"​
    docker exec -it verl_code_sandbox bash -c "export BUCKET=ai-infra && cd /data1/llm && oniond download model Qwen2.5-7B-Instruct-1M" || handle_error "4a"​
    docker exec -it verl_code_sandbox bash -c "export BUCKET=ai-infra && cd /data1/datasets && oniond download dataset Eurus-2-RL-Data" || handle_error "4b"​
    echo -e "${GREEN}步骤3完成: 模型和数据集下载完毕${NC}"​
    ​
    # 环境搭建完成​
    echo -e "${GREEN}===== VeRL code Sandbox 就绪 ====${NC}"​
    echo -e "${YELLOW}提示: 您可以使用 'docker exec -it verl_code_sandbox bash' 命令进入容器${NC}"​
    ​
其中:​
  • --name verl_code_sandbox 容器名称,请按需命名。​
  • SWANLAB_API_KEY请替换为自己的swanlab api key,方便后续观察训练过程的各种指标与log。如无账号可跟随SwanLab官网进行注册。​
  • CUDA_VISIBLE_DEVICES等和实例规格相关的参数,请根据实际的服务器情况进行配置。​
  1. 按Esc退出编辑模式,输入:wq并按Enter键,保存并退出文件。​
  1. 执行以下命令,赋予脚本可执行权限并运行脚本。​
  • ​
    chmod +x install.sh​
    ./install.sh​
    ​
  1. 执行以下命令,进入容器内的VeRL中。​
  • ​
    docker exec -it verl_code_sandbox /bin/bash​
    cd /root/verl​
    ​
  1. 测试Sandbox的连通性。执行两个小的连通性测试,用于测试VeRL和步骤一中部署的Sandbox连接是否成功。​
  1. 执行vim scripts/test_sandbox.sh命令,打开测试文件。​
  1. 按i进入编辑模式,更改SANDBOX_FUSION_URL为步骤一中获取到的触发器的 公网访问 地址+/run_code。​
  • ​
    #!/bin/bash​
    ​
    # 向环境变量中注入sandbox-url,来自于前面创建的 faas 的 Sandbox 触发器公网地址​
    echo "正在设置环境变量 SANDBOX_FUSION_URL..."​
    export SANDBOX_FUSION_URL="https://xxxxxxxxx.apigateway-cn-beijing.volceapi.com/run_code"​
    echo "环境变量设置完成: SANDBOX_FUSION_URL=$SANDBOX_FUSION_URL"​
    ​
    # 对连接进行测试​
    echo "开始执行第一个测试..."​
    pytest tests/sandbox/test_sandbox.py​
    test1_status=$?​
    echo "第一个测试执行完毕,状态码: $test1_status"​
    ​
    echo "开始执行第二个测试..."​
    pytest tests/reward_score/test_sandbox_fusion.py​
    test2_status=$?​
    echo "第二个测试执行完毕,状态码: $test2_status"​
    ​
    # 输出整体执行结果​
    echo "===== 执行结果 ====="​
    echo "环境变量设置: 成功"​
    echo "测试 1 状态: $([ $test1_status -eq 0 ] && echo "成功" || echo "失败")"​
    echo "测试 2 状态: $([ $test2_status -eq 0 ] && echo "成功" || echo "失败")"​
    ​
    # 返回总体状态码(如果任一测试失败,则返回非零状态码)​
    exit $((test1_status || test2_status))​
    ​
  1. 按Esc退出编辑模式,输入:wq并按Enter键,保存并退出文件。​
  1. 执行以下命令,赋予脚本可执行权限并运行脚本。​
  • ​
    chmod +x scripts/test_sandbox.sh​
    ./scripts/test_sandbox.sh​
    ​
  • 回显如下,表示连接通过。​
  • ​​​
  1. 基于已建立连接的Sandbox来启动训练流程。​
  1. 执行vim scripts/train_Qwen25-7B-In-1M_code_sandbox.sh命令,打开文件。​
  1. 按i进入编辑模式,按需修改文件内容。其中:​
  • reward_model.sandbox_fusion.url请替换为步骤一中获取到的触发器的 公网访问 地址+/run_code。​
  • actor_rollout_ref.model.path和critic.model.path替换为容器中存放Qwen2.5的路径。​
  • data.train_files和data.val_files替换为容器中存放数据集的路径。​
  • reward_model.reward_manager=prime表示每个prompt生成的多个response可并发执行。​
  • 其他参数,如reward_model.sandbox_fusion.max_concurrent表示sandbox的最大并发量,data.train_batch_size等等参数均可根据sandbox实例数进行设置,具体参数的含义可见VeRL参数配置说明。​
  • ​
    set -x​
    ​
    python3 -m verl.trainer.main_ppo \​
    reward_model.sandbox_fusion.url='https://xxxxxxxxx.apigateway-cn-beijing.volceapi.com/run_code' \​
    reward_model.sandbox_fusion.max_concurrent=256 \​
    reward_model.reward_manager=prime \​
    algorithm.adv_estimator=gae \​
    data.train_files=/data1/datasets/Eurus-2-RL-Data/train.parquet \​
    data.val_files=/data1/datasets/Eurus-2-RL-Data/validation.parquet \​
    data.train_batch_size=128 \​
    data.max_prompt_length=512 \​
    data.max_response_length=512 \​
    data.filter_overlong_prompts=True \​
    data.truncation='error' \​
    actor_rollout_ref.model.path=/data1/llm/Qwen2.5-7B-Instruct-1M \​
    actor_rollout_ref.actor.optim.lr=1e-6 \​
    actor_rollout_ref.model.use_remove_padding=True \​
    actor_rollout_ref.actor.ppo_mini_batch_size=128 \​
    actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=8 \​
    actor_rollout_ref.actor.fsdp_config.param_offload=False \​
    actor_rollout_ref.actor.fsdp_config.optimizer_offload=False \​
    actor_rollout_ref.actor.use_kl_loss=False \​
    actor_rollout_ref.model.enable_gradient_checkpointing=True \​
    actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=16 \​
    actor_rollout_ref.rollout.tensor_model_parallel_size=4 \​
    actor_rollout_ref.rollout.name=vllm \​
    actor_rollout_ref.rollout.gpu_memory_utilization=0.4 \​
    critic.optim.lr=1e-5 \​
    critic.model.use_remove_padding=True \​
    critic.model.path=/data1/llm/Qwen2.5-7B-Instruct-1M \​
    critic.model.enable_gradient_checkpointing=True \​
    critic.ppo_micro_batch_size_per_gpu=16 \​
    critic.model.fsdp_config.param_offload=False \​
    critic.model.fsdp_config.optimizer_offload=False \​
    algorithm.use_kl_in_reward=False \​
    trainer.critic_warmup=0 \​
    trainer.logger=['console','swanlab'] \​
    trainer.project_name='verl_sandbox_fusion_demo_usecase' \​
    trainer.experiment_name='qwen25instruct1m_demo_sandbox' \​
    trainer.n_gpus_per_node=8 \​
    trainer.nnodes=1 \​
    trainer.save_freq=10 \​
    trainer.test_freq=1 \​
    trainer.total_epochs=10 $@​
    ​
  1. 按Esc退出编辑模式,输入:wq并按Enter键,保存并退出文件。​
  1. 执行以下命令运行脚本,使训练过程能够并发地与步骤一创建的Sandbox建立连接并执行代码。​
  • ​
    chmod +x scripts/train_Qwen25-7B-In-1M_code_sandbox.sh​
    ./scripts/train_Qwen25-7B-In-1M_code_sandbox.sh​
    ​
  1. 在训练过程中,可以通过SwanLab平台查看训练的相关过程信息。​
步骤三:使用本地环境进行VeRL训练 ​
基于本地环境启动训练,按需修改scripts/train_Qwen25-7B-In-1M_code_local.sh参数配置并执行,即可使用本机CPU代替Sandbox进行代码运行,随后通过SwanLab平台进行过程查看。​
  1. 执行vim scripts/train_Qwen25-7B-In-1M_code_local.sh命令,打开文件。​
  1. 按i进入编辑模式,按需修改文件内容。​
  • ​
    set -x​
    ​
    python3 -m verl.trainer.main_ppo \​
    algorithm.adv_estimator=gae \​
    data.train_files=/data1/datasets/Eurus-2-RL-Data/train.parquet \​
    data.val_files=/data1/datasets/Eurus-2-RL-Data/validation.parquet \​
    data.train_batch_size=128 \​
    data.max_prompt_length=512 \​
    data.max_response_length=512 \​
    data.filter_overlong_prompts=True \​
    data.truncation='error' \​
    actor_rollout_ref.model.path=/data1/llm/Qwen2.5-7B-Instruct-1M \​
    actor_rollout_ref.actor.optim.lr=1e-6 \​
    actor_rollout_ref.model.use_remove_padding=True \​
    actor_rollout_ref.actor.ppo_mini_batch_size=128 \​
    actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=8 \​
    actor_rollout_ref.actor.fsdp_config.param_offload=False \​
    actor_rollout_ref.actor.fsdp_config.optimizer_offload=False \​
    actor_rollout_ref.actor.use_kl_loss=False \​
    actor_rollout_ref.model.enable_gradient_checkpointing=True \​
    actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=16 \​
    actor_rollout_ref.rollout.tensor_model_parallel_size=4 \​
    actor_rollout_ref.rollout.name=vllm \​
    actor_rollout_ref.rollout.gpu_memory_utilization=0.4 \​
    critic.optim.lr=1e-5 \​
    critic.model.use_remove_padding=True \​
    critic.model.path=/data1/llm/Qwen2.5-7B-Instruct-1M \​
    critic.model.enable_gradient_checkpointing=True \​
    critic.ppo_micro_batch_size_per_gpu=16 \​
    critic.model.fsdp_config.param_offload=False \​
    critic.model.fsdp_config.optimizer_offload=False \​
    algorithm.use_kl_in_reward=False \​
    trainer.critic_warmup=0 \​
    trainer.logger=['console','swanlab'] \​
    trainer.project_name='verl_sandbox_fusion_demo_usecase' \​
    trainer.experiment_name='qwen25instruct1m_demo_local' \​
    trainer.n_gpus_per_node=8 \​
    trainer.nnodes=1 \​
    trainer.save_freq=10 \​
    trainer.test_freq=1 \​
    trainer.total_epochs=10 $@​
    ​
  1. 按Esc退出编辑模式,输入:wq并按Enter键,保存并退出文件。​
  1. 执行以下命令启动训练。​
  • ​
    chmod +x scripts/train_Qwen25-7B-In-1M_code_local.sh​
    ./scripts/train_Qwen25-7B-In-1M_code_local.sh​
    ​
步骤四:观察日志记录​
可以通过SwanLab工具观测训练过程中的日志,以此了解训练进展情况。同时该工具还能进行实验管理(w/wo vefaas-sandbox/local cpu),其中包括对使用veFaaS-Sandbox或本地CPU两种不同方式下的训练情况进行管理,包括查看性能对比、资源利用率监控等。在相同实验设置下,采用veFaaS部署的Sandbox Fusion每一个step的训练时长相较于使用本地CPU训练时长平均减少了30%,吞吐量相比本地CPU增加了30%,说明使用veFaaS部署的Sandbox Fusion在训练效率方面有显著提升。​
​​​
​​​
​​​
步骤五:模型评测​
  • 评测基准(Benchmark)如下表所示。​
  • ​
    评测基准​
    评测重点​
    题目类型​
    难度​
    题目数量​
    代码功能正确性测试,通过单元检验​
    Python编程题​
    中等​
    164题​
    动态代码评测平台,集成竞赛新题​
    编程题/自修复任务​
    多样化​
    272题(仅保留了2024-08-01到2025-01-01期间的272题)​
    ​
  • 评估指标(Metric):Pass@1,表示在单次尝试中模型给出的答案通过测试的比例。​
  • ​
    评测基准​
    原始 Qwen2.5-7B-Instruct-1M​
    RL后 Qwen2.5-7B-Instruct-1M​
    HumanEval​
    0.4939​
    0.5732​
    LiveCodeBench ​
    0.1324​
    0.1360​
    ​
  • 结论分析:​
  • 无论是在数据量相对较小的HumanEval测试基准场景下,还是在数据更为多样丰富的LiveCodeBench场景,模型编码能力均有提升。​
  • 当前基于强化学习(RL)的模型已经完成了100 steps的累计训练,且训练过程中仅采用了Eurus-2-RL-Data训练集中的1024条数据作为简单实验。理论上,如果增加模型的训练步数,并且使用全量的训练数据,该模型在性能等方面还有进一步提升的可能性。​
说明​
如需将训练得到的ckpt格式文件转换为hf格式,请参考VeRL检查点转换进行操作。​
附录:case展示​
下面以7道编程题为例,题目难度分布为2道简单题、2道中等题和3道困难题,且这些题目覆盖的考察点丰富多样。​
随着训练过程一步步推进,模型返回的代码评分逐渐变高,这一现象体现出所采用的训练策略是有效的,同时也表明模型在处理各类编程任务时具备较强的鲁棒性,即模型能够稳定、可靠地应对不同类型和难度的编程任务,不会因任务的变化而出现较大波动或失效。​
简单题 *2​
​
中等题 *2​
​
困难题 *3​
​
​
最近更新时间:2025.06.06 10:31:40
这个页面对您有帮助吗?
有用
有用
无用
无用