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 に戻る — 前提: 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.jsonAnima 公式 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:

出力は /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.pygpu="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/月) も適時間引き。