starforge-core 加载同一批文件,所以两边不可能对「一个方法是什么」产生分歧。
方法标识
方法用<framework>/<method> 两段式标识:
实验锁文件:recipe.lock.json
sf new 创建实验时会写入 recipe.lock.json,锁定:
提交时 CLI 与服务端 catalog 做握手:锁内容与服务端发布的 recipe 精确一致才放行。这保证了「你本地校验通过的配置,就是集群上实际运行的配置」。
框架版本矩阵
一个 recipe 可以同时发布多个框架版本(如verl/grpo 支持 0.8.0 与 0.9.0)。版本间的差异——训练入口变化、参数路径迁移、镜像工件——全部声明在 recipe 的版本矩阵里,adapter 代码不写版本分支:
- 入口覆盖:如 verl 0.9 移除
main_ppo_sync统一为main_ppo,在 0.9.0 变体上声明entrypoint覆盖即可; - 参数路径覆盖:超参在不同版本的配置树位置不同,用
path_overrides声明; - 执行工件:每个版本绑定精确
runtime_id,由框架默认、部署侧 runtime registry 或单次--image解析成 OCI 镜像(生产建议 digest)或 SIF/SQSH(Slurm)。
Custom recipe:自己的框架和镜像
catalog 里没有的框架走custom/custom。平台只跑实验目录里的 train.sh,不猜入口,也不会在别的 adapter 失败后落到 custom。
--image 必填。tag 能用,生产最好钉 digest。仓库要在 FORGE_ALLOWED_IMAGE_REGISTRIES 里。
默认 recipe 是外部观测(wandb 等),那种提交还要加 --observability-url。日志会跟 stdout 走;控制台曲线要在训练代码里调 starforge.report。Cookbook:自定义训练。镜像怎么打:自定义镜像。
配置分层
实验最终生效的配置由四层叠加,后者覆盖前者:sf validate 在本地完整走一遍这个叠加,struct 模式拼错键立即报错。