コース進捗 コース目次 34レッスン中 34件を公開中
第0部―まず地図を広げる
第1部―簡単な目的で、なぜ動画が分かるのか
第2部―一本の動画を一台のエンコーダーへ
第3部―実験を読めてこそ、論文を読んだと言える
第4部―公式リポジトリから自分の実験へ
第5部―表現を世界モデル構想へ戻す
付録―必要なときに開く技術リュック
設定は実験のレシート
- Hydraつまみに名前
- 11視点大域1 + 局所10
- ViT-B疎なブロック因果注意
- 二つの損失λ = 0.02
- チェックポイントオンライン + 評価 EMA
3,072人分の厨房
レシピに「3,072食」とあっても、家庭の鍋一つで同じようには作れません。元の厨房は2計算ノード × 各8基のGPU × GPUあたり96動画窓 × 勾配蓄積2回です。GPU 1基での実行コマンドは火が付くかを確かめられますが、宴会を再現したことにはなりません。
公開既定値を読む
固定版の conf/config.yaml は、Walking Tours 10本で ViT-B/16を学習します。16フレーム、2フレームおき、チューブレット幅1、95%の無作為トークン削減、注意方式は block_causal です。一つの動画窓から224画素の大域切り抜きを一つ、96画素の局所切り抜きを十個作ります。投影器は 768 → 2048 → 256。SIGReg は17個の積分点と1,024本の無作為射影を使い、損失の重みは 0.02 です。
最適化手法は AdamW、学習率は 4e-4、重み減衰は 0.04、係数 β は (0.9, 0.95) です。最初の1,200最適化ステップで学習率を 1e-4 から 4e-4 まで徐々に上げ、その後は end_lr == lr なので一定です。既定は26周で、注記の見積りは約10,000最適化ステップです。
大域視点と十個の局所視点は同じエンコーダーを使います。局所視点を読込時の [B,V,T,C,H,W] から [B×V,C,T,H,W] へ並べ替えて畳み、11個の [CLS] を同じ投影器に通して [B,11,256] にします。コードは (global_emb - embeddings).pow(2).mean() を計算し、大域表現自身との項はゼロです。SIGReg の入力は [11,B,256]。二つの損失はどちらも同じエンコーダーへ勾配を返し、教師側の前向き計算はありません。
実効バッチサイズの注釈は 2計算ノード × 各8基のGPU × GPUあたり96動画窓 × 勾配蓄積2回 = 3,072 です。計算機構成を替えて勾配蓄積を据え置けば、別の実験になります。EMA は32最適化ステップごとに減衰率0.9999でエンコーダーだけを追い、state_dict_ema として保存します。オンライン重みは state_dict です。EMA は損失に入らず、目標エンコーダーでもありません。
データ構築後、GPU 1基で2バッチだけ通す例です。
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
これは実効バッチサイズ2の小型モデルによる動作確認であり、既定設定や論文の再現ではありません。Hydra は outputs/<date>/<time>/ に実行時設定とログを残します。ただし固定版設定の checkpoint.dirpath=checkpoints は起動した場所を基準に解決され、通常はリポジトリ最上位の checkpoints/ に出力されます。注記にある「Hydra の実行用ディレクトリからの相対指定」は、既定の hydra.job.chdir=false とは一致しません。hydra.job.chdir=true を明示した場合だけ、実行用ディレクトリが基準になります。train/pred_loss、train/sigreg_loss、train/loss が有限値であることを確認します。
本番前に uv run python main.py --cfg job で解決済みの YAML を保存し、data.train が期待した Lance を指すか確認します。Walking Tours には別の検証用分割がなく、設定は val を学習用データへ向けながら trainer.limit_val_batches=0 で無効にしています。学習損失は汎化の指標ではありません。最終評価には独立データ上の凍結プローブを使います。チェックポイントは2,000学習ステップごとと終了時に保存し、state_dict、state_dict_ema、実際に使ったGPU総数を記録します。
四つの実験条件を混同してはいけません。論文の統制比較はK710の20%を使い、240周学習します。公開設定の既定値はViT-B、Walking Tours、26周です。一般向けの12時間実演はViT-Tinyと8本の動画を使います。公開重みはViT-LをVideoMixの180万動画窓で学習したものです。
再開時の既定値 resume.weights_only=true は重みだけを読み、学習率スケジュールを最初から始めます。最適化手法の状態とステップ数も引き継ぐなら false を明示し、元の設定も保存します。
配置図の出典
三つの実行記録
- 公開既定値の3,072は、2計算ノード、各8基のGPU、GPUあたり96動画窓、勾配蓄積2回という構成に依存します。
- 局所環境で実効バッチサイズを2にした実行は処理経路の検査であり、論文の数値を継承しません。
- 同じ方法でも、データ、モデル、学習率スケジュール、計算予算が違えば別の実験です。
コマンドを実行する前に
- 1計算ノード × 8基のGPU、GPUあたり96動画窓で実効バッチサイズ3,072を保つには、勾配を何回蓄積すればよいでしょうか。
state_dict_emaはオンラインエンコーダーの目標を作りますか。- Walking Tours 既定値でK710 20%比較表を再現できますか。
解答
- 4です。
- 作りません。評価用重み平均です。
- できません。データと学習手順が違います。