课程进度 课程大纲 已发布 34/34 课
第 0 部分——先拿到地图
第 1 部分——为什么简单目标会学会看视频
第 2 部分——把一段视频送进单编码器
第 3 部分——会读实验,才算读懂论文
第 4 部分——从官方仓库到自己的实验
第 5 部分——把表征接回世界模型路线
附录——随用随查的技术背包
一张配置表,五处要对账
- Hydra 配方所有旋钮有名字
- 多视图1 全局 + 10 局部
- ViT-B稀疏、块因果
- 两项损失λ 固定 0.02
- 检查点训练权重 + EMA 评估副本
3,072 份从哪几口锅里来
菜谱写着“做 3,072 份”,并不是说家里一只锅要同时装下这么多。这个数字来自两间厨房、每间八只锅、每锅 96 份,再累计两轮。单卡命令仍然很有用:它能检查锅会不会点火;只是它回答的不是“整场宴会能否复现”。
先读这张公开配方
冻结 conf/config.yaml 的默认任务是:在十段 Walking Tours 上训练 ViT-B/16,16 帧、stride 2、tubelet 1、95% 随机 token dropping、block_causal;每个 clip 产生一张 224 全局 crop 与十张 96 局部 crop。projector 是 768 → 2048 → 256,SIGReg 使用 17 个 knots、1,024 个随机投影,损失权重 0.02。
优化器这只钟怎样走
优化器是 AdamW:学习率 4e-4、weight decay 0.04、betas (0.9, 0.95);前 1,200 optimizer steps 从 1e-4 warm up 到 4e-4,随后因 end_lr == lr 保持平坦。默认 26 epochs,作者注释估算约一万 optimizer steps。
十一扇窗最后汇成什么
训练计算图要和配置一起核对。global 与十个 locals 都经过同一 encoder;局部先从加载器布局 [B,V,T,C,H,W] 合并并换轴为 [B×V,C,T,H,W],随后十一张 [CLS] 经同一 projector 得 [B,11,256]。代码直接计算 (global_emb - embeddings).pow(2).mean(),其中 global 自己与自己贡献零;SIGReg 接收换轴后的 [11,B,256]。两项 loss 均向同一 encoder 回传,计算图里没有 teacher forward。
3,072 是乘出来的
配置注释假设 2 nodes × 8 GPUs × 96 clips × accumulation 2 = 3,072。机器数、卡数或 accumulation 改变,有效 batch 也会随之改变。EMA 每 32 optimizer steps 更新、decay 0.9999,仅跟踪 encoder,并以 state_dict_ema 写入 checkpoint;在线训练权重仍在 state_dict,EMA 不参与 loss,也不是 target encoder。
先点火两批,再决定是否跑长程
有数据后,可用一张 GPU 做两批冒烟检查:
uv run python main.py \
trainer.devices=1 trainer.num_nodes=1 trainer.strategy=auto \
trainer.max_epochs=1 trainer.limit_train_batches=2 \
loader.batch_size=2 loader.num_workers=0 accumulate_grad_batches=1 \
model.name=vit_tiny augmentation.local_crops_number=2
这是 effective batch 2 的小模型管线检查。它与默认配方、论文数据和预算不同,所以得到的是“冒烟测试”这张收据。日志中的 train/pred_loss、train/sigreg_loss、train/loss 都应为有限值。
Hydra 的日志与 checkpoint 不在同一抽屉
Hydra 会在 outputs/<date>/<time>/ 留下运行配置与日志;但冻结配置的 checkpoint.dirpath=checkpoints 会按启动目录解析,通常写入仓库根部的 checkpoints/。配置注释所说的“相对 Hydra run dir”与当前 hydra.job.chdir=false 默认行为不一致;若显式设 hydra.job.chdir=true,checkpoint 才会跟随 run dir。
正式启动前先运行 uv run python main.py --cfg job,把解析后的完整 YAML 保存进实验目录,并确认 data.train 指向预期 Lance。Walking Tours 没有独立 validation split;配置让 val 指回 train,同时以 trainer.limit_val_batches=0 禁用验证。训练 loss 因此不是泛化指标,最终比较仍需冻结、独立数据的 probe。checkpoint 默认每 2,000 train steps 及结束时保存;检查其中同时有常规 state_dict 与评估用 state_dict_ema,并记录实际 world size。
同一方法有四张不同收据
论文的受控比较在相同 20% K710、240 epochs 下重训基线;公开默认是 ViT-B + Walking Tours + 26 epochs;12 小时消费卡演示是 ViT-Tiny + 八段视频;发布权重是 ViT-L + 1.8M VideoMix clips。它们共享方法,却不共享完整训练条件。
续训也有两种含义:默认 resume.weights_only=true 只载入权重并重启 schedule;设为 false 才会连 optimizer 状态与步数一起恢复。把这个选择和原配置一并保存,下一次才知道训练时钟从哪里继续。
配方、入口与工作目录的出处
收起配方前核对
- 公开默认的 3,072 batch 建立在 2×8 GPU、每卡 96、累积 2 的假设上。
- 本地两批命令检查管线;它没有使用论文的数据与预算,因此不继承论文数字。
- 方法相同不等于数据、模型、schedule 和预算相同。
看你拿的是哪张收据
- 一节点八卡若保持每卡 96,怎样保留 effective batch 3,072?
state_dict_ema是否给在线 encoder 提供目标?- 默认 Walking Tours 命令能否复现 20% K710 对照表?
查看答案
- 将 accumulation 调为 4。
- 不能;它只是评估权重平均。
- 不能;数据与训练协议不同。