
先说结论:我们把 ACK 官方文档方案在ACK上使用verl框架进行Agentic强化学习训练做成了计算巢一键部署服务,部署完成后下载模型和数据集、跑预置冒烟脚本,5~7 分钟第一个 Agentic RL 训练端到端跑通。这篇文章讲我们主要做了什么。
背景锚点:Agentic RL 很热,环境搭建是第一道坎
Agentic RL 一句话讲清楚:让模型在真实环境里多轮交互(写代码、跑命令、看结果),再用 GRPO 按任务完成情况更新权重——这是当前提升模型「自主解题能力」的主流路径,SWE-bench 这类「解真实 GitHub issue」是最典型的训练场景。它和传统 RLHF 的差异是结构性的:交互从单轮生成变成多轮的「思考、行动、观察」,轨迹从一次响应拉长到数十轮,奖励信号也从每轮打分变成任务结束时的稀疏反馈——这意味着采样和训练的工程量都大了一个量级,对执行环境的要求也从「文本输入输出」变成了能跑不可信代码的真实沙箱。
但手动跑通一遍并不轻松。照着官方方案,你要自己备齐 ACK 集群与 GPU 节点、KubeRay Operator、sandbox 控制器、BuildKit、ACR、RBAC、持久卷等近十个组件,再处理它们之间的版本对齐、网络打通与权限配置。
端到端训练按官方方案走五个阶段:加载 SWE-bench Verified(500 个真实 issue,按 400/100 划分训练/验证集)、Rollout 采样(agent 在沙箱里读 issue、生成 Patch、跑测试)、奖励计算(测试通过 +1.0,Patch 精简、解得快还有小幅附加分)、GRPO 策略更新,每 100 步在验证集上评估 issue 解决率。
我们这边在计算巢做的,就是把这类「方案在文档里、搭起来疼」的链路变成可部署的服务。
关键动作:「一键」到底整合了什么

ROS 模板按三层创建资源:基础设施层(VPC、ACK 托管集群、默认 1 台 2×L20 的 GPU 节点、ACR 企业版实例并自动创建 swe-bench 私有命名空间、打通内网端点);控制面层(KubeRay Operator、OpenKruise Agents sandbox 控制器 v0.3.0);工作负载层(配好 RBAC 的 ServiceAccount、ACR 镜像 Secret、BuildKit、模型/数据集两块 PVC、只读挂载的冒烟脚本 ConfigMap、单 head 的 RayCluster)。
其中几个处理方式值得单独说明:
冒烟脚本的镜像仓库地址是部署时自动注入的。 手动跑最容易踩的坑是 sandbox 镜像要先构建推送到自己的 ACR,脚本里的 REGISTRY 必须和实例一致。我们在部署时注入、并以只读方式挂载脚本——改不坏,正式训练时拷出来改副本。
HF_HOME 指向持久卷。 模型和 HF 缓存落在 PVC 上,Pod 重启不用重新下载。
RBAC 按训练链路最小集配齐。 pods 增删查改/exec、logs、secrets 读取(BuildKit 推镜像取 ACR 凭证)、sandbox 系列 CRD,刚好够链路跑通,不多给。
还有一个架构层面的选择:VeRL 内置的 AgentLoop 不支持分布式运行、token 级数据捕获和沙箱隔离,官方方案用 RemoteAgentLoop + Harbor-framework 补上这块——agent 在隔离沙箱里执行不受信任的代码,LLM 请求经 ProxyServer 转发到 vLLM 推理服务时,透明记录 token_ids 和 logprobs 供 RL 训练使用,集群内可并行拉起大量 trial 加速收敛。这套能力我们同样原样整合进了服务。
跑出来的结果:部署完成到训练跑通三步

- 进 head Pod 终端:ACK 控制台 →
agentic-rl命名空间的容器组 →raycluster-verl-head-xxxxx→ 终端; - 下载模型与数据集:
huggingface-cli download Qwen/Qwen2.5-3B-Instruct到/var/model,harbor dataset download swe-bench/swe-bench-verified到/home/verl; nohup bash /opt/agentic/run-2gpu.sh > /tmp/train.log 2>&1 &,然后tail -f /tmp/train.log。
双卡 L20 训 Qwen2.5-3B、跑 1 个 SWE-bench 任务,全程 5~7 分钟——这个时间是脚本启动到打印 Training Progress: 100% 的实测值,省掉的是上面那串环境检查项的逐项排查。验证成功的标志对照日志看:
- Pod 全程
RESTARTS 0; val-aux/num_turns/mean大于 0——agent 真的在 sandbox 里多轮交互了;timing_s/update_actor、actor/pg_loss、actor/grad_norm有值——GRPO 更新链路通了;- checkpoint 落盘到
/var/model-dataset/checkpoint/,结束打印Training Progress: 100%。
需要说明的是:小样本下 val-core/harbor/reward/mean@1 为 0.0 属正常,3B 模型解不出 SWE-bench 的题。冒烟验证的是链路,不是效果。
边界:我们没做什么
不预置模型和数据集。 两块持久卷初始为空,部署后自行下载。这是刻意选择:模型版本和数据集来源应该由使用者决定,服务不该把数 TB 的资产和授权问题绑进模板。
只支持单机多卡。 RayCluster 只有 head,trainer.nnodes=1;多机多卡属结构性改动,当前不支持。
换大模型 / 换 GPU 规格需自行验证。 核心约束只有一条:ECS 规格物理卡数 == GpuPerNode(部署参数)== trainer.n_gpus_per_node(脚本) 三者必须完全相等,否则 head Pod 调度不出来。冒烟脚本里的 param_offload、optimizer_offload、tensor_model_parallel_size=2 是 3B 在双卡 L20 不 OOM 的关键,同规格不要动。
地域选择要留意。 训练过程需要从 GitHub 拉取代码仓库构建 sandbox 镜像、从 HuggingFace 下载模型,官方文档提示中国内地地域可能出现访问失败或构建超时,遇到下载问题可优先排查 VPC 的 NAT/SNAT 配置或改用中国香港、海外地域。
总结
服务入口:计算巢 Agentic RL 训练服务详情页,点「开始部署」选地域即可;服务实例的部署后使用文档里有完整组件清单和正式训练(全量任务、更大 batch)的参数对照表,冒烟脚本拷出来按表改即可。底层原理与手工搭建步骤见官方方案文档。