这一页讲怎么用一个环境。怎么写一个 —— manifest、任务集、协议 —— 见
编写环境。
作业收到什么
三个环境变量,由控制面设置:split 不由你选
TUNEPLANE_JOB_ENVIRONMENT_SPLIT 由操作本身决定:训练作业拿 train,评测拿 eval。没有参数
能覆盖它。
这就是全部的安全属性,而它为什么是一个状态而不是一个设置,值得说白。留出的数据在”选它”变成一件
方便事的那一刻就不再是留出的了。分数最好的那次运行会变成在自己训练任务上评测的那次 —— 而下游没有
任何东西能看出这件事。数字看起来很好,模型并不好,而这个错误在那次运行产出的每个产物里都是隐形的。
让操作来决定,意味着泄漏不是一个有人会设错的设置。它是一个系统到不了的状态。
一次评测索要环境从未声明过的 split 会被拒绝,而不是被悄悄喂上训练任务。
作业能走的三条路
- 自服务(openenv)
- 物化(nemo-gym)
- 远端(openenv-remote)
平台运行环境服务端。你的训练器通过 openenv-core 的客户端 ——
reset、step、state —— 对着
TUNEPLANE_JOB_ENVIRONMENT_URL 驱动 episode。TRL、SkyRL、Unsloth 和 Axolotl 原生消费这种。没有额外要写的东西。openenv (deployment: container),即别人的 OpenEnv 容器。没有作业能到达它:托管另一方的
容器是执行器的活,而这个平台不做,所以这种引用会在准入时被拒绝,而不是在 launcher 里才发现。
奖励来自判定器
你不为环境写奖励函数 —— 环境声明由什么决定完成,而那永远是一个引用:
答不出来的判定器会抛异常,不会上报零。这个区别比听起来重要得多,原因见
判定器。
沙箱
harness 要跑模型生成代码的环境会声明sandbox.required。在没有配置沙箱提供方的部署上,这种作业
会在准入时被拒绝 —— 它不会退回到在训练容器里跑那些代码。
你需要沙箱却被拒绝时,让管理员设 TUNEPLANE_SANDBOX_IMAGE。这里有意没有默认值:跑模型生成的代码
不该是能被顺手打开的事。