平台注入了什么
每个训练容器里都会出现四个环境变量。你的代码读它们;它拿不到账号凭据、集群地址或对象存储密钥。
用
X-StarForge-Token: <token> 认证。这些路由同时也接受 Authorization: Bearer <token>,
已经有 bearer 封装的客户端可以直接复用。
接口
全部是POST,全部收 JSON,全部要带 run_id。
POST /api/ingest/lifecycle —— 声明训练真正开始的时刻
POST /api/ingest/lifecycle —— 声明训练真正开始的时刻
starting、running、succeeded、failed。在把控制权交给训练 entrypoint 之前的那一刻打 running。执行器自己报的 RUNNING 要早得多——
它在建虚拟环境、拉权重之前就触发了,这两件事可能耗掉好几分钟——拿它当计量起点会系统性地多算。POST /api/ingest/metrics —— 曲线
POST /api/ingest/metrics —— 曲线
{"ok": true, "inserted": 2}。数据点必须已经摊平:一个 key 一个 step 对应一个标量。
嵌套字典和非标量值由调用方自己先归约。POST /api/ingest/hparams —— 配置面板
POST /api/ingest/hparams —— 配置面板
POST /api/ingest/validation —— 样本对话与奖励分布
POST /api/ingest/validation —— 样本对话与奖励分布
user、assistant、env、reward 是控制台渲染的骨架。算法特有的字段——DPO 的 rejected、
SFT 的参考答案——放进每条样本的 extra,平台不需要理解它们就能展示。验证轮次很大时可以分片:设置 total_chunks,每片带自己的 chunk_index 分别发送。POST /api/ingest/logs —— stdout 和 stderr
POST /api/ingest/logs —— stdout 和 stderr
eof。作业进入终态时由平台统一补——容器被 SIGKILL 时,转发进程根本没有机会发。POST /api/ingest/artifact —— 登记产出
POST /api/ingest/artifact —— 登记产出
kind 取值:checkpoint、hf_export、eval_report、merged_model。format 必填且不得为空。容器类执行器下,path 必须是对象存储 URI。容器一销毁本地路径就不存在了,平台不会去猜它去了哪。
先用 GET /api/ingest/artifact/upload-url 拿一个签名 URL 上传。POST /api/ingest/hardware 和 /environment —— 系统页
POST /api/ingest/hardware 和 /environment —— 系统页
hardware 收采样点(GPU 利用率、显存、网络)。environment 收一次性的静态信息:包版本、CUDA 版本、
GPU 型号。environment/nodes 上报多节点作业的每节点硬件。除非你传了 monitor_hardware=False,否则这三样 SDK 都会替你采集和发送。POST /api/ingest/benchmark —— 外部产生的评测分数
POST /api/ingest/benchmark —— 外部产生的评测分数
给在平台之外打分、再把结果报回来的 harness 用。围绕它的完整流程见评测。
确认成功
在控制台打开这个作业。第一次调用metrics 之后几秒内,Charts 页就会出现一个点。
如果日志在滚而曲线一直是空的,说明回传调用根本没执行——确认容器内 STARFORGE_ENABLED 是 1,
并且代码确实走到了 init()。
为什么回传代码放在 SDK 里,而不是用户上传的工作目录里
为什么回传代码放在 SDK 里,而不是用户上传的工作目录里
生命周期打点和产物登记,是平台判断作业何时真正开始、产出了什么的依据。如果这段代码放在用户自己的
common/ 里,删掉或改坏那个目录就会让平台变瞎,而动手的人还不会知道。这也是这个模块只依赖标准库的原因:
它必须能在任何训练镜像里干净地 import,而每多一个依赖,就多一处「镜像里恰好没装」的失败点。