Skip to content

Mini RL Training 源码级讲解

源码路径:CubeSandbox/examples/mini-rl-training/

概述

本例是一个 SWE-bench 批量训练框架,用于在多个 CubeSandbox 实例上并发执行代码修复任务,支持环境注入、并发控制、结果收集。

脚本体系

并发执行引擎 — run-concurrent.py

核心是一个基于 asyncio 的并发任务调度器:

python
async def run_task(task, sandbox):
    """单个任务执行"""
    # 1. 写入代码
    await sandbox.files.write(task.code_path, task.code)

    # 2. 执行
    result = await sandbox.process.start_and_wait(task.command)

    # 3. 收集结果
    return {
        "task_id": task.id,
        "exit_code": result.exit_code,
        "stdout": result.stdout,
        "stderr": result.stderr,
    }

async def main():
    tasks = load_tasks("tasks.jsonl")
    semaphore = asyncio.Semaphore(MAX_CONCURRENT)  # 并发限制

    async def limited_run(task):
        async with semaphore:
            sandbox = await Sandbox.create(template="swe-bench")
            try:
                return await run_task(task, sandbox)
            finally:
                await sandbox.kill()

    results = await asyncio.gather(*[limited_run(t) for t in tasks])
    save_results(results, "results.jsonl")

envd 注入机制

bash
# inject-envd.sh
# 将 envd 二进制注入到运行中的沙箱实例
for instance_id in $(cat instances.txt); do
    # 通过 CubeAPI 写入 envd
    curl -X POST "http://localhost:3000/sandboxes/${instance_id}/files" \
        -F "path=/usr/local/bin/envd" \
        -F "file=@./envd"

    # 重启 envd
    curl -X POST "http://localhost:3000/sandboxes/${instance_id}/exec" \
        -d '{"command": "pkill envd && /usr/local/bin/envd &"}'
done

环境准备 — setup-env.sh

bash
# 安装 Python 依赖
pip install e2b e2b-code-interpreter

# 配置 TokenHub API
export TOKENHUB_API_KEY="..."
export TOKENHUB_BASE_URL="http://127.0.0.1:4000/v1"

# 下载 SWE-bench 任务集
curl -O https://datasets.example.com/swe-bench/tasks.jsonl

# 预热沙箱模板
python -c "from e2b import Sandbox; Sandbox('swe-bench').kill()"

执行流程

推荐阅读

  1. run-concurrent.py — 并发执行引擎核心
  2. inject-envd.sh — envd 注入机制
  3. setup-env.sh — 环境准备流程

源码参考:run-concurrent.py