# 実行手順 + 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/" # 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/月) も適時間引き。