Skip to main content
对绝大多数人来说这就够了——Python SDK 已经替你讲了这份契约。 只有在给 catalog 之外的框架写适配器、或者要用别的语言写客户端时,才需要往下读。

平台注入了什么

每个训练容器里都会出现四个环境变量。你的代码读它们;它拿不到账号凭据、集群地址或对象存储密钥。 X-StarForge-Token: <token> 认证。这些路由同时也接受 Authorization: Bearer <token>, 已经有 bearer 封装的客户端可以直接复用。

接口

全部是 POST,全部收 JSON,全部要带 run_id
事件取值:startingrunningsucceededfailed在把控制权交给训练 entrypoint 之前的那一刻打 running。执行器自己报的 RUNNING 要早得多—— 它在建虚拟环境、拉权重之前就触发了,这两件事可能耗掉好几分钟——拿它当计量起点会系统性地多算。
返回 {"ok": true, "inserted": 2}。数据点必须已经摊平:一个 key 一个 step 对应一个标量。 嵌套字典和非标量值由调用方自己先归约。
是 upsert,再调一次补新 key 即可。嵌套配置请用点号摊平。
userassistantenvreward 是控制台渲染的骨架。算法特有的字段——DPO 的 rejected、 SFT 的参考答案——放进每条样本的 extra,平台不需要理解它们就能展示。验证轮次很大时可以分片:设置 total_chunks,每片带自己的 chunk_index 分别发送。
这是唯一一条要求调用方自己吞掉异常的通道。其他 ingest 接口都是失败即抛,因为丢一个指标或一个产物 是数据事故;丢几段日志不是,而控制台抖一下就把一次成功的训练判成失败,代价大得多。不要自己发 eof。作业进入终态时由平台统一补——容器被 SIGKILL 时,转发进程根本没有机会发。
kind 取值:checkpointhf_exporteval_reportmerged_modelformat 必填且不得为空。容器类执行器下,path 必须是对象存储 URI。容器一销毁本地路径就不存在了,平台不会去猜它去了哪。 先用 GET /api/ingest/artifact/upload-url 拿一个签名 URL 上传。
hardware 收采样点(GPU 利用率、显存、网络)。environment 收一次性的静态信息:包版本、CUDA 版本、 GPU 型号。environment/nodes 上报多节点作业的每节点硬件。除非你传了 monitor_hardware=False,否则这三样 SDK 都会替你采集和发送。
给在平台之外打分、再把结果报回来的 harness 用。围绕它的完整流程见评测

确认成功

在控制台打开这个作业。第一次调用 metrics 之后几秒内,Charts 页就会出现一个点。 如果日志在滚而曲线一直是空的,说明回传调用根本没执行——确认容器内 STARFORGE_ENABLED1, 并且代码确实走到了 init()
生命周期打点和产物登记,是平台判断作业何时真正开始、产出了什么的依据。如果这段代码放在用户自己的 common/ 里,删掉或改坏那个目录就会让平台变瞎,而动手的人还不会知道。这也是这个模块只依赖标准库的原因: 它必须能在任何训练镜像里干净地 import,而每多一个依赖,就多一处「镜像里恰好没装」的失败点。