二、产品入口
·镜像中心 已上架平台预置镜像 taco-agentic-rl-v1.0.0,如下所示:
·任务式建模 和 开发机 模块可选中该预置镜像。
四、概述
本最佳实践以 Qwen2.5-7B-Instruct 模型为基础,演示如何在 TI-ONE 平台上使用 taco-agentic-rl 框架完成智能体强化学习训练的完整流程。整体流程如下:
| 操作步骤 | 说明 |
| 步骤1:准备环境 | 在 TI-ONE 平台启动开发机(HCCPNV6 × 8 卡),配置镜像、CFS 存储及网络端口,下载基座模型。 |
| 步骤2:启动 Agent 服务 | 根据业务场景选择 Agent 实现(如 zeroclaw),部署独立的 Agent 在线服务并完成配置对接。 |
| 步骤3:开发机启动训练 | 在开发机上依次启动 Redis 任务队列、LLM Proxy、训练脚本和 Agent Server 四个组件,协同完成 Agentic RL 训练循环。 |
| 步骤4:查看轨迹 | 使用 Perfetto UI 可视化查看训练过程中的 Agent 交互轨迹,辅助分析和调试。 |
| 步骤5:训练后推理 | 合并 FSDP 格式的 Checkpoint 为 HuggingFace 格式,使用 vLLM 部署训练后模型,通过 Agent 对话验证训练效果。 |
六、启动开发机
本次实践采用 HCCPNV6 × 8 卡,启动开发机作为训练平台。
·镜像选择:内置镜像-taco-agentic-rl-v1.0.0
·机器资源:8卡 / 256C 2000G
·CFS 资源:请把你的 CFS 挂载到 /home/tione/notebook
·添加端口:推荐使用 CLB,映射 8001 端口,避免服务重启导致 IP 变更需要重新配置。
注意:后续非特别标注,所有命令以及操作均在此开发机执行。
七、模型下载
·下载地址
·请把模型下载到 /home/tione/notebook/models/Qwen2.5-7B-Instruct,如果路径不一样后续需要修改配置文件以及训练脚本。
九、1. 创建在线服务
这部分为一个独立的在线服务,非“准备环境”步骤中启动的开发机。请新建一个在线服务,或者复用你已有的 zeroclaw 服务。
如果你选择新建在线服务,配置如下:
| 配置项 | 说明 |
| 镜像 | ccr.ccs.tencentyun.com/ti-public/notebook-conda-gpu:zeroclaw-ti-dev20260603(可以直接填写该自定义镜像地址拉起 agent 服务) |
| 端口 | 42617 |
| CFS 挂载 | 将修改好的配置文件目录挂载到 /opt/ml/conf |
| 启动命令 | 需要覆盖原有的启动命令(见下方) |
十、2. 配置文件
配置文件为 config.toml,需要手动修改以下内容(如果你已有 zeroclaw 服务,则无需使用默认配置文件,直接修改下列内容即可):
# 根据你的配置修改配置文件下列内容 # 1. 调用地址:改为 taco-agentic-rl 开发机的 IP 地址default_provider = "custom:http://172.17.64.13:8001/v1" # 2. 模型名:改为你配置的模型default_model = "/home/tione/notebook/models/Qwen2.5-7B-Instruct"
十一、3. 启动命令
cp /opt/ml/conf/config.toml /zeroclaw-data/.zeroclaw/ && zeroclaw daemon
启动结果:
十二、4. 配对获取 Token
这部分可以用“服务调用” tab 的调用地址访问,也可以直接用在线服务对应的 pod ip + 端口访问。示例:
# IP 修改为你 zeroclaw 在线服务的 pod id# Pairing Code 可以从服务日志中看到curl -X POST http://172.17.x.x:42617/pair -H 'X-Pairing-Code: 045162'
调用结果如下:
Tips:上面的 Pairing Code 是一次性的,请及时保存你获取到的 token,同一个服务无法再次使用同一个 Pairing Code 获取新的 token。
十四、训练代码
此示例的代码路径位于镜像内:/workspace/youtu-agentic-rl/examples/zeroclaw,后续所有脚本均在此目录下执行。
.├── agent_client.py├── agent_handler.py # 包含 agent 调用及奖励函数实现├── agent_server.py├── checkpoint/ # ckpt 默认保存目录├── config.yaml # 配置文件├── run_proxy.sh # 启动 LLM Proxy 的脚本├── run_queue.sh # 启动 redis 任务队列的脚本├── run_server.sh # 启动 agent server 的脚本├── train.sh # 训练脚本└── wandb/
十五、训练过程
按以下顺序分别在新的 shell 中启动各组件:
1. 启动 Redis 任务队列
cd /workspace/youtu-agentic-rl/examples/zeroclawbash run_queue.sh
2. 启动 LLM Proxy
cd /workspace/youtu-agentic-rl/examples/zeroclawbash run_proxy.sh
3. 启动训练脚本
cd /workspace/youtu-agentic-rl/examples/zeroclaw# 配置环境变量export ZEROCLAW_GATEWAY_URL=http://172.17.X.X/ms-XXXexport ZEROCLAW_BEARER_TOKEN=zc_XXXbash train.sh
4. 启动 Agent Server
cd /workspace/youtu-agentic-rl/examples/zeroclawbash run_server.sh
十六、运行日志
·zeroclaw:
·proxy:
·训练进程:
·agent_server:
十七、步骤4:查看轨迹
使用 Perfetto UI 打开 trace.json 文件查看训练轨迹。
训练轨迹如下:
十八、生成轨迹文件
训练脚本 train.sh 默认会生成 trace.json,默认导出所有 batch 的轨迹。如果你需要手动 dump,请确保 Redis 服务存在,然后执行:
python -m tilearn.agentic_rl –config $CONFIG_PATH \\ trace dump \\ –batch 1 $total_training_steps \\ -o $default_local_dir/trace.json
20、1. 合并 Checkpoint 文件
训练后需要将 FSDP 格式的 ckpt 合并为 HuggingFace 格式才能使用 vLLM 等框架一键部署。在开发机执行:
cd /workspace/youtu-agentic-rl/examples/zeroclaw/checkpoint/youtu-agentic-rl/calc_x_claw_testpython -m verl.model_merger merge –backend fsdp \\ –local_dir global_step_10/actor/ –target_dir ./merged_model
21、2. 部署原版模型(对照组)
使用 vLLM 启动原版 Qwen2.5-7B-Instruct:
vllm serve /home/tione/notebook/models/Qwen2.5-7B-Instruct/ \\ –enable-auto-tool-choice –tool-call-parser hermes \\ –served-model-name models/Qwen2.5-7B-Instruct –port 8001
然后在 zeroclaw 服务中进入 CLI 模式交互:zeroclaw agent
对话效果如下:
22、3. 部署训练后模型
使用 vLLM 启动训练后的模型:
cd /workspace/…/calc_x_claw_testvllm serve ./merged_model/ \\ –enable-auto-tool-choice –tool-call-parser hermes \\ –served-model-name models/Qwen2.5-7B-Instruct –port 8001
对话效果如下:
23、已知问题
问题描述:异常退出后显存残留
处理方法:目前训练脚本 train.sh 异常退出后,可能存在显存残留,通过 nvidia-smi 命令可确认。遇到此问题时执行以下命令清理:
pkill -9 -f ray::WorkerDict
25、对比背景
以论文 ReTool: Reinforcement Learning for Strategic Tool Use in LLMs 作为示例 Agent 场景,对比 TACO 和 VERL 两个框架在 Agentic RL 场景下的适配改造成本。
26、VERL 的 Agent 接入方式
项目地址:verl/recipe/retool at release/v0.6.1 · verl-project/verl · GitHub
为了接入 retool,verl 除了 recipe/retool 下的代码外,还在框架内部实现了 tool_agent,用来给 retool 注册:
data = { "data_source": data_source.split("/")[1].lower(), # aime_2024, aime_2025 "prompt": [{"role": "user", "content": prompt}], "ability": "MATH", "reward_model": {"ground_truth": str(answer)}, "agent_name": "tool_agent", }
tool_agent 实现在 verl/experimental/tool_agent_loop.py 下:
@register("tool_agent")class ToolAgentLoop(AgentLoopBase): @classmethod def init_class(cls, config, tokenizer, processor, **kwargs): …
VERL 把"agent"做成了框架内部的一等公民——必须实现一个继承自 AgentLoopBase 的类,注册到 agent_loop 里,框架来调度这个类的 rollout / generate / call_tool 等方法。所以 VERL 的 retool 例子里需要:
·一个 ToolAgentLoop(AgentLoopBase) 类
·一组 OpenAIFunctionToolSchema 描述的工具(位于 tool_parser.py 中)
·agent_name="tool_agent" 在 dataset 里做路由
·tool_config_path 指定工具配置 YAML
ReTool 启动方式:
| 硬件 | HCCPNV6 单机 8 卡 |
| Docker 镜像 | mirror.ccs.tencentyun.com/verlai/verl:app-verl0.5-vllm0.9.1-mcore0.12.2-te2.2 |
| 模型 | Qwen2.5-7B-Instruct |
| 数据集 | DAPO-Math-17k、AIME_2024、AIME_2025 |
| 启动方式 | bash retool/run_qwen2_7b_dapo.sh |
27、TACO 的 Agent 接入方式
在 TACO 中,框架要求的“agent”只是一个签名为 (ctx, config) -> dict 的回调函数:
class Server: def __init__(self, …, process_task: Callable[[TaskContext], str] = None, …)
Server 启动 worker 进程后,每来一个任务就调一次这个函数(server.py:484):
result = await process_task(ctx, self.config)
qapython/agent_handler.py 里就是一个普通函数(没有任何继承):
async def process_task_async(ctx: TaskContext, config) -> Dict[str, Any]: # 1. 从 utu 加载现成的 agent agent_config = ConfigLoader.load_agent_config("examples/rl_train/qa_python_sandbox") qapython_agent = get_agent(config=agent_config) await qapython_agent.build() # 2. 跑多轮 result = await qapython_agent.run(input=prompt) # 3. 算 reward 返回 return {"answer": …, "reward": …, "metadata": …}
然后在 agent_server.py:41 把它注入框架:
server = Server(config=config, process_task=process_task_async)
没有一个新类被定义,agent 与框架完全解耦。
qapython 启动方式:
| 硬件 | HCCPNV6 单机 8 卡 |
| Docker 镜像 | ccr.ccs.tencentyun.com/ti-platform/ytrl-env:v1 |
| 模型 | 7B-coldstart |
| 数据集 | DAPO-Math-17k、AIME_2024、AIME_2025 |
| 启动方式 | run_queue.sh → run_proxy.sh → run_server.sh → train.sh |
28、附录
参考资源
·ZeroClaw 文档
·ReTool 论文
·VERL ReTool 实现