| # DMD2 (NVIDIA cosmos-predict2.5 流派) 蒸留 |
|
|
| [← README に戻る](../README.md) — 関連: [PCM](pcm.md) / [DMDX](dmdx.md) / [蒸留全般](distillation.md) |
|
|
| ## 概要 |
|
|
| 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)**2` factor |
| - **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/](https://huggingface.co/darask0/anima-distill-loras/tree/main/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](migration_log.md#57-実画像比較-2026-05同-prompt--seed) の 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](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 アロケート時の混雑度に依存 |
| |