rapid-anima / docs /dmd2.md
darask0's picture
DMD2 完走、3 手法 + Turbo 比較反映
b791469 verified
|
Raw
History Blame Contribute Delete
5.81 kB
# 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 アロケート時の混雑度に依存