DMD2 (NVIDIA cosmos-predict2.5 流派) 蒸留
← README に戻る — 関連: PCM / DMDX / 蒸留全般
概要
NVIDIA cosmos-predict2.5 公式の DMD2 + TrigFlow 流派を Anima 移植。同 base に 2 つの独立 PEFT adapter (student / fake_score) を attach し set_adapter() で runtime 切替、TTUR (alt 5 critic : 1 generator)。
実装: scripts/distill/{dmd2_official_loss,train_dmd2_official}.py
Modal: modal_app.py::train_dmd2_official_distill
設計の鍵
- 2 adapter / single base → memory 効率 (teacher は別 deepcopy)
- TrigFlow time sampling:
s ∈ shifted_uniform(shift=3-5) → t = arctan(s/(1-s)) - DMD2 gradient trick (逆 KL):
grad = (x0_fake - x0_teacher) / |x_hat - x0_teacher|.mean()→loss = ((x_hat - (x_hat - grad).detach())**2).mean() - Critic phase: weighted denoise with
1/sin(t)**2factor - few-step rollout (n=1..4)、grad は最終 step のみ (memory efficient)
訓練設定 (実走、2026-05-18 - 19)
| 項目 | 値 |
|---|---|
| Base | anima-base-v1.0.safetensors |
| Method | DMD2 + TrigFlow (cosmos-predict2.5) |
| LoRA target | wide (980 keys) × 2 (student + fake_score) |
| LoRA rank | 32 |
| Total outer | 5000 (1 outer = 5 critic + 1 generator) |
| n_student_steps | 4 |
| Teacher CFG | 4.5 (Anima 公式推奨に整合、過去 preview3 試行の 3.0 から変更) |
| Student CFG | 1.0 (CFG embedded) |
| Shift | 3.0 (Anima sigma_shift と一致、過去の 5.0 から変更) |
| LR (gen / critic) | 5e-6 / 1e-5 (TTUR) |
| Warm-start | /models/loras/anima_turbo.safetensors (Civitai 公式 Turbo、968/1016 keys 一致) |
| GPU | B200 |
| 訓練時間 | step 660 まで ~40 min、resume + 4500 outer ~7h |
| コスト | 累計 ~$48-55 想定 (rate 6.2s/outer parallel 時) |
試行履歴 (2026-05-18 - 19)
1st run (/output/dmd2_v1/)
- 設定: warm-start (Anima Turbo) + 5000 outer
- 経過: step 660/5000 で
KeyboardInterrupt - 原因: Modal workspace billing cycle spend limit reached (DMDX 並列起動で予算限度超過)
- 保存: step 500 ckpt のみ無事 (volume commit 済)
Resume (/output/dmd2_v1_resume/)
- 設定: step 500 ckpt を warm-lora、残り 4500 outer
- warm-load: 980/980 keys 完全一致 (自前 LoRA 同 architecture)
- 完走済 (outer 4500/4500、累計
7.7h、$48):dmd2_student_final.safetensors+ 9 個の intermediate ckpt 保存 - 中断による rate slowdown あり (3.66s → 6.15s/outer、並列実行 + Modal capacity の影響)
結論: warm-start dominance (DMDX と同じ問題)
5000 outer 完走したが、student LoRA は warm-start (Civitai Anima Turbo) からほぼ移動せず、 視覚的に Turbo と区別困難。DMDX と全く同じ症状で、手法ではなく warm-start anchor が支配的。
Loss 推移 (順調)
| outer | l_dmd_critic | l_dmd_gen | 評価 |
|---|---|---|---|
| 0 | 0.0364 | 1.5780 | warm-start 直後 |
| 100 | 0.07 | 1.18 | gen 急速降下中 |
| 500 | 0.06 | 1.30 | spike あるが healthy |
| 660 (中断) | 0.0471 | 0.16 | 健全な状態で中断 |
| resume 0 | 0.0364 | 1.5771 | warm-load から再開、原 outer 0 と類似 |
| resume 500 | 0.058 | 1.29 | 期待通り |
| resume 1000 | 0.054 | 0.89 | 順調収束 |
magnitude (x_hat / teacher / fake): ~0.3-0.5 範囲で揃って distill 方向収束。
検証結果
step 500 (resume 開始時、4-step / er_sde+simple)
- 2 キャラ (Flandre / Remilia) 正確分離
- Civitai Turbo に近い品質 (warm-start 支配的、step 500 で大幅変化なし)
- 生成時間 10.95s
final (5000 outer 完走、4-step / er_sde+simple)
- step 500 と視覚的にほぼ同一
- Civitai Anima Turbo baseline と区別困難
- 5000 outer 訓練を完走したが student LoRA の重みが warm-start からほぼ動かなかった
ローカル DL 済: ~/Downloads/anima_loras/dmd2/dmd2_v1_step00500.safetensors
配布
HF: darask0/anima-distill-loras/dmd2/
PEFT + ComfyUI 両形式 + 専用 README + 比較サンプル画像 (Turbo vs DMD2 final) を upload 済。 実用としては Civitai Anima Turbo と差異なし、研究目的の配布。
ComfyUI 推奨設定
LoraLoaderModelOnly:
lora_name: dmd2_v1_step00500.safetensors
strength_model: 1.0
ModelSamplingAuraFlow:
shift: 3.0
KSampler:
steps: 4
cfg: 1.0
sampler_name: er_sde
scheduler: simple
過去の preview3 試行との対比
migration_log.md §5.7 の preview3 DMD2 では:
- 8-step: 絵画調シフト、洗色傾向
- 4-step: シルエットのみ、ボケすぎ
→ 改善要因 (v1.0 試行):
- ✅ warm-start (Civitai Turbo) 必須化
- ✅ teacher_cfg 3.0 → 4.5 (Anima 公式推奨)
- ✅ shift 5.0 → 3.0 (Anima sigma_shift 整合、sampler 互換性向上)
- ✅ v1.0 base 直接 (preview3 ベース LoRA の style drift 回避)
知見
- 2 adapter peft set_adapter() で必須: 毎 forward で明示切替しないと片方の重みが leak (operations.md 参照)
No module named 'modal'の volume commit 失敗: subprocess 内で modal lib 未参照、harmless warning (function 終了時に Modal 自動 commit)- billing limit による KeyboardInterrupt: Modal の workspace spend limit に達すると cloud function に SIGINT が送られて停止する。ローカル CLI の interrupt とは別経路、Modal dashboard で billing を確認・上げる必要
- parallel rate 低下: 並列 (DMDX と) で 3.66s/outer → 6.2s/outer (~1.7x 遅い)、別 B200 アロケート時の混雑度に依存