train.sh 会 import 的东西。仅此而已。
镜像里装什么
日志:
print、logging、框架打到 stdout/stderr 的内容进控制台日志页。不要 POST /api/ingest/logs。
曲线:不会从 stdout 里猜。训练代码里调 starforge.report。
一份能改的 Dockerfile
风格对齐平台 TRL 镜像:CUDA devel 基底、venv 在PATH 最前。catalog custom/custom 建议在后面的 RUN 里装 starforge-core。
train.py 实际 import 来改。DeepSpeed 要运行期 JIT 的话,通常需要带 nvcc 的 devel 镜像,和 Dockerfile.trl 一样。
local 执行器会用 bash 跑入口。PATH 仍须指向那个 venv,否则 train.sh 里的 python 可能是没有 torch 的 /usr/bin/python。
构建和推送
白名单
--image 会解析出仓库主机(ghcr.io、localhost:5000、没有主机名时是 docker.io)。这个主机必须出现在服务端 FORGE_ALLOWED_IMAGE_REGISTRIES(.env 里逗号分隔的主机名)。
运维可以写成
FORGE_ALLOWED_IMAGE_REGISTRIES=registry.example.com,ghcr.io。节点还要能拉到镜像(KubeRay 的 imagePullSecret、agent 上的 Docker login、Slurm 侧已经转好的 SIF)。
各执行器
拉镜像慢时作业停在
PENDING,直到 preRunning 超时变成 FAILED。这不是训练代码的问题。
不要做的事
- 把 StarForge 源码 COPY 进
/opt,指望它和服务器 runner 对得上。capsule 是内容寻址、启动时注入的。 - 把
HF_TOKEN烤进镜像层。服务端会注入HF_TOKEN/HUGGING_FACE_HUB_TOKEN,或给一个密钥文件路径(CLUSTER_SECRETS_FILE)。 - 把
FORGE_INGEST_URL设成控制台机器上的127.0.0.1。训练节点用不了你笔记本的 loopback。这个变量在服务端,提交的人不用设;stdout 正常但图表空,多半是运维配错了。