rapid-anima / docs /workflow.md
darask0's picture
Initial commit: rapid-anima distillation codebase
77cc641 verified
|
Raw
History Blame Contribute Delete
7.97 kB
# 実行手順 + GPU + コスト概算
[← README に戻る](../README.md) — 前提: [setup.md](setup.md)
## Step 0: モデルダウンロード(初回のみ)
```bash
cd anima_modal
modal run modal_app.py::download_models
```
`anima-preview3-base.safetensors` (4.18GB) + Qwen3 + VAE が
`anima-models` Volume に保存される。
## Step 1: データセットを用意
### 1a. self-distillation で自動生成(おすすめ、約 11h / $28)
Anima base 自身に生成させて quality タグ依存性を消す pair を作る。
[scripts/gen_prompts.txt](../scripts/gen_prompts.txt) の 100 プロンプト × 50 seed で
5,000 枚生成。クライアント側でデータ用意不要。
```bash
# 試走: ComfyUI 起動 + 10 枚生成 (~10分, $0.10)
modal run modal_app.py::generate_dataset --max-images 10
# 本番(シリアル A100): 5,000 枚 (12.5h, $31)
modal run --detach modal_app.py::generate_dataset
# 本番(B200 × 10 並列): 5,000 枚 (~40分, $44) ← 速度優先
modal run --detach modal_app.py::generate_dataset_parallel
# パラメータ調整可
modal run --detach modal_app.py::generate_dataset \
--seeds-per-prompt 80 --max-images 8000
# 途中から再開 (既存 .png はスキップ)
modal run --detach modal_app.py::generate_dataset --start-from 50
```
ワークフローは [scripts/anima_workflow.json](../scripts/anima_workflow.json)、
**Anima 公式 README の推奨設定**:
- Sampler: `er_sde` / Scheduler: `simple` / Steps: 30 / CFG: 4.5
- ModelSamplingAuraFlow shift: 3.0 (公式 `anima_comparison.json` 由来)
- Positive prefix: `masterpiece, best quality, score_7, safe`
- Negative: `worst quality, low quality, score_1, score_2, score_3, artist name`
- タグ順: `[quality/meta/safety] [1girl/1boy] [character] [series] [artist] [general]`
### 1b. ローカル画像を持ち込み
```bash
modal volume put anima-dataset ./my_images /raw
```
`/dataset/raw/` 以下に展開される。
## Step 2: キャプションを掃除
このプロジェクトの Phase 1 は審美シフトではないので **artist タグは残す**:
```bash
modal run modal_app.py::clean_captions
```
artist タグを drop するオプションは「Anima 平均スタイル化」用で、
今回の目的(タグ依存性除去のみ)では基本不要:
```bash
# 必要なら確率 drop / 完全 drop も可能
modal run modal_app.py::clean_captions --drop-artist-prob 0.5
modal run modal_app.py::clean_captions --keep-artist false
```
`/dataset/cleaned/` に処理後の画像と .txt が出る。中を確認:
```bash
modal volume get anima-dataset cleaned/0001.txt
```
`masterpiece, best quality, score_9, year 2025, newest, highres, safe`
が綺麗に消えていればOK。
## Step 3: Phase 1 学習(quality タグ依存性除去)
```bash
modal run --detach modal_app.py::train_phase1
```
`--detach`**バックグラウンド実行**(数時間続くため)。
Modal ダッシュボード(modal.com/apps)で進捗確認できる。
**目安時間 (A100-80GB)**:
| データセット | 1 epoch | 2 epoch | コスト |
|---|---|---|---|
| 3,000 枚 | 2 h | 4 h | **$10** |
| 5,000 枚 | 3 h | 6-7 h | **$15-18** |
| 10,000 枚 | 6-7 h | 12-14 h | **$30-35** |
デフォルトは `epochs = 2`(prior shift には十分)。H100 にすれば 1.4-1.6x 速い。
**設定変更したい時**: `configs/phase1_anima.toml` を編集して
`modal run` を再実行(Modal が image を rebuild する)。
主な調整点:
- `epochs`: 試走 1、デフォルト 2、念のため 3 まで
(それ以上は base 性能を損なうリスク)
- `[optimizer].lr`: 1e-5 → 効きが弱ければ 2e-5
- `[adapter].rank`: 32-64 で十分(概念追加でないので大きくしても無駄)
- `gradient_accumulation_steps`: 5k 枚以下なら 2 で十分
## Step 4: Phase 1 結果の検証
```bash
modal run modal_app.py::generate_samples
```
`scripts/eval_prompts.txt` の短い「品質タグなし」プロンプトで生成して
`/output/phase1_samples/` に保存。
※ 現状は ComfyUI ベースで生成するスケルトンなので、本番では
ComfyUI を Modal の別 function で立てて API 経由で呼ぶ構成を別途追加することを想定。
## Step 5: Phase 2 蒸留
**数万円予算なら 5a (merge) を強く推奨**。5b/5c は数十時間の試行錯誤前提。
### 5a. Turbo LoRA との weight merge (即動く、$0.5、10分)
```bash
# Civitai の Turbo LoRA URL を指定して 1 ファイルに合成
modal run modal_app.py::merge_turbo_lora \
--turbo-url "https://civitai.com/api/download/models/<id>"
# alpha 調整 (デフォルトはどちらも 1.0)
modal run modal_app.py::merge_turbo_lora \
--turbo-url "..." --alpha-phase1 1.0 --alpha-turbo 0.8
```
候補の Turbo LoRA:
- 公式 Anima Turbo: https://civitai.com/models/2560840 (CFG=1, 8-12 step)
- RDBT-Anima (DMD2 蒸留先行例): https://civitai.com/models/2364703
出力は `/output/merged/anima_phase1_plus_turbo.safetensors` (LoRA だけの
ファイル)。ComfyUI で base + この LoRA を組めば即推論可能。
### 5b. SOTA 自前蒸留(Decoupled DMD2 + TSCD + R3GAN、B200 — **未完成、要追加開発**)
`scripts/distill/` に実装あり。**ただし 5 回試行して全て失敗**。詳細は
[distillation.md](distillation.md) を参照。これから取り組む人は、まず
そのドキュメントの §1.1 / §4 / §5 を読むことを強く推奨。
```bash
# (動くが収束しない) 我々が試したコマンド:
modal run --detach modal_app.py::generate_dataset_parallel # データ生成 $44
modal run --detach modal_app.py::train_sota_distill --phase b --total-steps 2000 # 失敗
```
> **強い推奨**: 商用要件なしなら 5a で十分。Anima の Turbo LoRA は **CircleStone
> Labs 公式****遥かに多い計算資源と試行錯誤** で作っており、数万円の予算で
> これを超える自前蒸留は現実的に困難。
## GPU の選び方
| GPU | Modal 料金 | 速度 | 推奨用途 |
|---|---|---|---|
| A100-40GB | $2.10/hr | 遅 | OOM のリスク。非推奨 |
| **A100-80GB** | **$2.50/hr** | 標準 | **Phase 1 デフォルト** |
| L40S 48GB | $1.95/hr | やや遅 | Phase 1 試走に使える |
| H100 80GB | $3.95/hr | 1.4-1.6x 速 | 時間最優先 / Phase 2 DMD2 |
| H200 | H100 と同額 | さらに速 | Modal が自動で割り当てる場合あり |
`modal_app.py``gpu="A100-80GB"` を書き換えるだけで切替可能。
## コスト概算 (1USD ≒ 150円換算)
### プラン A: ミニマム検証 (約 5,000円 / $33)
| 項目 | 想定 | コスト |
|---|---|---|
| Modal Volume | 10GB × 1ヶ月 | $0.90 |
| モデル DL (CPU 並列) | 5-10 分 | $0.01 |
| キャプション掃除 (CPU) | 5 分 | ~$0.00 |
| Phase 1 学習 (A100-80GB, 2,000枚 × 3 epoch) | 8 時間 | $20 |
| 検証生成 (L40S) | 10 分 | $0.30 |
| Phase 2 merge | 10 分 | $0.50 |
| 余裕枠 (失敗 retry 1 回ぶん) | | ~$10 |
| **合計** | | **~$32** |
### プラン B: スタンダード (約 1〜1.2万円 / $70-80)
| 項目 | 想定 | コスト |
|---|---|---|
| Modal Volume | 20GB × 1ヶ月 | $1.80 |
| **Phase 1 (A100-80GB, 10,000枚 × 3 epoch)** | 18-21 時間 | **$45-53** |
| 検証 + merge + 試行 retry | | ~$5 |
| 余裕 | | ~$15 |
| **合計** | | **~$70** |
### プラン C: 余裕プラン / 蒸留も自前 (約 3〜4万円 / $200-270)
| 項目 | 想定 | コスト |
|---|---|---|
| Phase 1 (A100-80GB, 10k × 5 epoch) | 30-35 時間 | $75-88 |
| Phase 2 LCM 自前蒸留 (A100, 試行2回) | 20 時間 | $50 |
| ↑ DMD2 にする場合 (H100, 試行1回) | 15 時間 | $60 |
| Volume + 検証 + 余裕 | | ~$30 |
| **合計** | | **$200-270** |
> ⚠️ `--detach` で背景実行中も課金は続く。`modal app stop rapid-anima` で
> 即停止できるので、想定時間を超えたら必ず確認。`cleanup_checkpoints` で
> Volume 課金 ($0.15/GB/月) も適時間引き。