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()"执行流程
推荐阅读
run-concurrent.py— 并发执行引擎核心inject-envd.sh— envd 注入机制setup-env.sh— 环境准备流程
源码参考:run-concurrent.py