実行手順 + GPU + コスト概算
← README に戻る — 前提: setup.md
Step 0: モデルダウンロード(初回のみ)
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 の 100 プロンプト × 50 seed で 5,000 枚生成。クライアント側でデータ用意不要。
# 試走: 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、 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. ローカル画像を持ち込み
modal volume put anima-dataset ./my_images /raw
/dataset/raw/ 以下に展開される。
Step 2: キャプションを掃除
このプロジェクトの Phase 1 は審美シフトではないので artist タグは残す:
modal run modal_app.py::clean_captions
artist タグを drop するオプションは「Anima 平均スタイル化」用で、 今回の目的(タグ依存性除去のみ)では基本不要:
# 必要なら確率 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 が出る。中を確認:
modal volume get anima-dataset cleaned/0001.txt
masterpiece, best quality, score_9, year 2025, newest, highres, safe
が綺麗に消えていればOK。
Step 3: Phase 1 学習(quality タグ依存性除去)
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 結果の検証
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分)
# 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 を参照。これから取り組む人は、まず
そのドキュメントの §1.1 / §4 / §5 を読むことを強く推奨。
# (動くが収束しない) 我々が試したコマンド:
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/月) も適時間引き。