这一页讲的是使用环境。要自己写一个——manifest、任务、四种协议——
见编写环境。
作业收到什么
三个由控制平面注入的环境变量:split 不是你能选的
STARFORGE_ENVIRONMENT_SPLIT 由操作类型决定:训练作业拿到 train,评测拿到 eval。
没有任何参数可以覆盖它。
这是整个安全属性所在,而它为什么是一个状态而不是一个设置,值得说白。
留出数据在「选它变得方便」的那一刻就不再是留出数据了。
跑分最好的那次 run 会变成「在自己的训练任务上做了评测」的那一次——
而下游没有任何东西能看出它做了这件事。数字很漂亮,模型并不,
而这个错误在那次 run 产出的每一件产物里都是隐形的。
让操作类型来决定,意味着这个泄漏不是某人可能配错的一项设置,而是系统根本到不了的一个状态。
评测去要一个环境从未声明过的 split 会被拒绝,而不是悄悄给它训练任务。
三条路径,从 trainer 的视角
- 服务式(openenv)
- 物化式(nemo-gym)
- 远程(openenv-remote)
平台运行环境 server。你的 trainer 通过 openenv-core 的客户端驱动 episode——
reset、step、state——打到 STARFORGE_ENVIRONMENT_URL。TRL、SkyRL、Unsloth 和 Axolotl 原生支持这条,不需要额外写东西。奖励来自 verifier
你不需要为环境写奖励函数——环境自己声明什么决定任务完成,而且那永远是一个引用:
答不出来的 verifier 会抛异常,不会报零分。
这个区别为什么比听起来重要,见 verifier。
沙箱
harness 会运行模型生成代码的环境,会声明sandbox.required。
在没有配置沙箱提供方的部署上,这类作业会在准入时被拒——
它不会退化成在训练容器里跑那段代码。
需要沙箱却被拒的话,让管理员配 FORGE_SANDBOX_IMAGE。
默认没有值是有意的:运行模型生成的代码,不该在无意中被开启。
确认成功
下一步
编写环境
manifest、taskset,以及四种协议。
Rubric
rubric 类 verifier 据以打分的那份标准。