| # 既存実装の移植 — 2026-05 試行ログ |
|
|
| [← README に戻る](../README.md) — 前章: [distillation.md](distillation.md) |
|
|
| > ⚠️ 本ドキュメントは **2026-05-17 時点のスナップショット**を含む。Modal volume の |
| > 状態 (LoRA path、cache 内容など) は時間とともに変動するので、最新状態は |
| > `modal volume ls` で確認すること。配布済 LoRA は HF の |
| > [darask0/anima-distill-loras](https://huggingface.co/darask0/anima-distill-loras) に集約。 |
|
|
| [§4 失敗分析](distillation.md#4-実際の失敗全-5-件詳細) の 5 回失敗を受け、「自前で書き下す」のを諦めて **既存の動く実装を最小改造で |
| Anima に移植する** 方針に転換。survey と smoke test を経て **5 手法** を実装、 |
| 本リポジトリに収録 (`scripts/distill/`)。 |
|
|
| ## 5.0 全体マップ |
|
|
| ``` |
| ┌── Z-Image trajectory imitation (DiffSynth-Studio 由来) |
| ├── DMD2 + TrigFlow (NVIDIA cosmos-predict2.5 公式) |
| 蒸留 5 候補 ────┼── LADD (AMD Nitro-1 移植、PixArt 由来) |
| ├── Reflow / InstaFlow (rfpp NeurIPS 2024 知見適用) |
| └── PCM (G-U-N/Phased-Consistency-Model、SD3 変種) |
| |
| 無料補完 ────── ComfyUI-CapitanFlowMatch / ZiT-Scheduler (推論側 scheduler) |
| |
| survey で却下 ── DMDR / Hyper-SD / NitroFusion / ADD (訓練コード非公開) |
| ``` |
|
|
| ## 5.1 採用 5 手法の概要 |
|
|
| | # | 手法 | カテゴリ | 中核ファイル | 設計の鍵 | |
| |---|---|---|---|---| |
| | ① | Z-Image trajectory imitation | trajectory matching | `scripts/distill/{traj_scheduler,traj_loss,train_traj}.py` | critic なし、teacher 50-step CFG=2 trajectory を student 8-step に align | |
| | ② | DMD2 + TrigFlow (cosmos-predict2.5) | score matching | `scripts/distill/{dmd2_official_loss,train_dmd2_official}.py` | **同じ base に 2 LoRA adapter** (student + fake_score)、`set_adapter()` 切替、alt 5:1 | |
| | ③ | LADD (AMD Nitro-1) | adversarial + recon | `scripts/distill/{anima_ladd_disc,train_ladd}.py` + `precompute_teacher_x0.py` | D backbone = teacher MiniTrainDIT (frozen)、5 spectral-norm head、Smooth-L1 recon anchor | |
| | ④ | Reflow / InstaFlow | flow alignment | `scripts/distill/train_reflow.py` (cache は `--save-noise` 必須) | Anima は元から RF、U-shape t + Huber + 間欠 LPIPS、1 grad-through で最安 | |
| | ⑤ | PCM (Phased Consistency Model) | consistency | `scripts/distill/{pcm_scheduler,train_pcm}.py` | SD3-PCM 流派 (FlowMatch + v-pred)、Anima RF と math 一致、N=50 を K=4 phase に分割 | |
|
|
| 全手法に共通の前提: |
| - **wide LoRA** (`attach_wide_lora()` で AdaLN + attn + MLP 全 Linear、454 modules、~72M trainable) |
| - **warm-start = Civitai 公式 Anima Turbo LoRA** (matched 968/1016 keys、x_embedder/t_embedder の 12 keys のみ skip) |
| - **B200 GPU** + dataset は `/dataset/raw` (5000 caption、品質タグは未掃除でも蒸留には影響なし) |
|
|
| ## 5.2 R3GAN との決定的な違い (なぜ LADD は動く可能性が高いか) |
|
|
| | 失敗パターン | R3GAN | LADD | |
| |---|---|---| |
| | D が無信号 → mean collapse | CNN を一から学習、16ch latent prior なし | D backbone = **teacher MiniTrainDIT (frozen)**、Anima latent を既に理解 | |
| | D 爆発 | γ (gradient penalty) calibration 困難 | **spectral norm + BatchNormLocal** で D の Lipschitz 制約 | |
| | anchor 不在で発散 | DMD2 単独だと mean に潰れる | **Smooth-L1 recon loss** (vs teacher x0) で「絶対に teacher から離れない」床を作る | |
|
|
| LADD smoke (5 step、`l_g_adv ≈ ln(2) ≈ 0.69`, `l_d_total ≈ 2·ln(2) ≈ 1.39`) — R3GAN 試行で |
| 1 度も達成できなかった「**stable initialization**」が初手で出る。 |
|
|
| ## 5.3 LoRA-only + warm-start + precompute cache の三位一体 |
|
|
| 3 つを組み合わせて実コストを大幅圧縮: |
|
|
| 1. **LoRA-only (~72M trainable / 2B base)** — gen と D backbone は frozen、optimizer state も小さい |
| 2. **warm-start (Civitai Turbo LoRA)** — cold-start より convergence が早く、品質下限が保証される |
| 3. **precompute teacher x0 cache** — teacher の 20-step CFG=4.5 rollout を 1 度だけ実行 (~$11 / 5000 サンプル)、 |
| その後の蒸留で **複数手法が同じ cache を共有** (LADD / PCM が利用) |
|
|
| ``` |
| precompute_teacher_x0_cache (1回, $11) |
| │ |
| ├── LADD train (cache の x0 を real として使用) |
| └── PCM train (cache の emb を流用、x0 は teacher rollout source) |
| |
| precompute_for_reflow (--save-noise 付き、別 cache, $11) |
| │ |
| └── Reflow train (noise + x0 + emb triplet) |
| ``` |
|
|
| ## 5.4 採用しなかった手法 (survey 結果) |
|
|
| | 手法 | 却下理由 | |
| |---|---| |
| | **DMDR** (vvvvvjdy/dmdr) | ImageNet/SiT のクラス条件 toy のみ公開、T2I (Z-Image, SD3.5) パイプラインは未公開 | |
| | **Hyper-SD / Hyper-FLUX** (ByteDance) | 訓練コード非公開 (HF model card のみ)、コミュニティ port なし | |
| | **NitroFusion / NitroSD-Vibrant** (ChenDarYen) | 訓練コード "Coming Soon" のまま停滞、リポジトリは 6 commit で凍結 | |
| | **ADD / LADD-DINOv2** (StabilityAI) | 訓練コード非公開 (issues wontfix)、AMD 版で代替 | |
|
|
| ## 5.5 inference 側補完: AYS / TeaCache / GGUF / sageattention の適用可否 |
|
|
| | 手法 | Anima 適用可否 | 理由 | |
| |---|---|---| |
| | **AYS** (NVIDIA Align Your Steps) | ❌ | ComfyUI 公式実装は **SD1/SDXL/SVD の sigma schedule を hardcode** で rectified flow 未対応 | |
| | **TeaCache** (timestep 残差 cache) | ⚠️ **base 高 step 用のみ** | 4-8 step 蒸留 LoRA とは**構造的に non-compatible** (連続 step の差分が大きすぎてスキップ不可)。base 28-50 step での **2x 速** には使える、porting ~250 LoC | |
| | **ComfyUI-GGUF** Q8/Q4 量子化 | ⚠️ Anima 未対応 | FLUX/SD3/Hunyuan 系のみ。Anima loader 追加 + GGUF 変換が必要 | |
| | **CapitanFlowMatch / CapitanZiT-Scheduler** | ✅ | rectified flow / Cosmos-Predict2 兄弟向け scheduler、ComfyUI ノード追加だけ | |
| | **sageattention** | ✅ | torch SDPA 置換で 1.2-1.5x 推論速、`pip install sageattention` で `_base_image` に同梱済 | |
| | **DPM-Solver++ 高次** / **UniPC** | ✅ | sampler ノード切替のみ、Anima 標準 `er_sde` の代替 | |
|
|
| **実用推奨**: 蒸留 LoRA + sageattention + CapitanFlowMatch scheduler のスタックが最も効率的。 |
| TeaCache は「LoRA 使わず base 高品質モード」用の補完として将来 porting する価値あり (~250 LoC, ~$10 calibration)。 |
|
|
| ## 5.6 これから挑む人へ |
|
|
| - **survey をサボらない**: 4 つの「有名手法」が実は訓練コード非公開で詰む。GitHub の README を見るだけでなく `train.py` / `run.sh` を実際に開いて確認 |
| - **`scripts/distill/anima_loader.py` は再利用** — `build_anima()` + `AnimaBundle` で diffusion-pipe の罠 (namespace shadow、`padding_mask` 必須、dtype object vs str など) を全部吸収済 |
| - **smoke test を必ず 1 step 走らせる** — sign / dtype / 配線ミスを **$1-2 で発見**、本番 $30-50 をドブに捨てるリスク回避 |
| - **`MSYS_NO_PATHCONV=1 PYTHONIOENCODING=utf-8 PYTHONUTF8=1` を modal CLI に毎回つける** (Windows JP locale 必須) |
| |
| ## 5.7 実画像比較 (2026-05、同 prompt × seed) |
| |
| 5 prompt × 2 seed × {8 step, 4 step} × {base CFG=4.5, Civitai 公式 Turbo CFG=1, ① Z-Image |
| trajectory imitation CFG=1, ② DMD2 CFG=1} = **80 枚** を Modal `compare_distill_loras` で |
| 生成 + v1.0 base 上で **13 条件 1 prompt 1 seed** を `verify_completed_loras` で生成。 |
| 同 noise seed なので 1:1 で比較可能 (実装: [modal_app.py](../modal_app.py))。 |
| |
| **観察された明確な順位** (8-step CFG=1、preview3 base、5 prompt × 2 seed = 80 枚): |
| |
| | Rank | 手法 | 評価 | |
| |---|---|---| |
| | 🥇 | **Civitai 公式 Anima Turbo** | シャープ、彩度高、盾の紋章/松明の光まで完備、キャラ識別正確 | |
| | 🥈 | ① Z-Image traj imitation (本 repo) | 鮮明・安定、ディテール OK | |
| | 🥉 | ② DMD2 (本 repo) | 絵画調シフト、やや洗色傾向 | |
| | ❌ | base 30step→8step | 暗め・シンプル、品質劣化大 | |
| |
| **4-step での頑健性順位**: |
| |
| | Rank | 手法 | 評価 | |
| |---|---|---| |
| | 🥇 | **Civitai 公式 Anima Turbo** | 8-step とほぼ同等品質を維持 | |
| | 🥈 | ① Z-Image | エッジ甘くなる (8-step 訓練だったため) | |
| | ❌ | ② DMD2 | シルエットのみ、ボケすぎ | |
| | ❌ | base | ほぼ崩壊、使用不可 | |
| |
| **v1.0 base での生成時間 (sageattention 有効、1024×1024、er_sde/simple/shift=3)**: |
|
|
| | step / 条件 | 時間 | 備考 | |
| |---|---|---| |
| | 4-step LoRA (全 6 LoRA) | **3.5-4.0s** | 公式 Turbo / ① Z-Image / ② DMD2 / ④ Reflow / ⑩ DRaFT+ 系すべて | |
| | 8-step LoRA (全 6 LoRA) | **4.0-4.7s** | 同上 | |
| | 30-step base CFG=4.5 | **10.7s** | LoRA 無効、品質基準 | |
|
|
| → **4-step LoRA = base 30 step の 3 倍速**、sageattention 効果込み。Modal B200 のコスト換算で |
| 1 画像 ~$0.006 (4-step LoRA) vs ~$0.018 (base 30 step)。 |
|
|
| **正直な結論**: **CircleStone Labs 公式 Turbo (Civitai) に予算 ~$300 で勝つのは現状困難**。 |
| 公式は遥かに多い GPU 時間と専門知見を投入した結果。本 repo の自前蒸留は: |
|
|
| - base からの **品質向上は明白** (8-step CFG=1 が実用レベル) |
| - 公式 Turbo に **代替/補完** できる位置 (ライセンス遵守、自前カスタマイズ可) |
| - **学習目的・特定スタイル特化・蒸留パイプライン理解** には十分価値 |
|
|
| ### 5.7.1 v1.0 base 切替で観察された style drift |
|
|
| 2026-05-17 に base を `anima-preview3-base.safetensors` → `anima-base-v1.0.safetensors` に |
| 切替。**既存 LoRA はすべて preview3 で訓練済だが v1.0 でも動作する** (アーキ互換)。ただし: |
|
|
| - **出力 style がデフォルメ寄りに変化** — verify_v1_sage の 13 条件すべてで chibi/SD 風が強く |
| 出た。preview3 base での同じ LoRA の出力 (compare_z_vs_dmd2) は比較的写実寄り |
| - 原因仮説: v1.0 base が「young girl appearance」prompt を v1.0 の aesthetic prior でより |
| 強く解釈する。preview3 とは prior 分布が異なる |
| - LoRA を再訓練するなら v1.0 base 上で行うのが筋。preview3 ベース LoRA を v1.0 で使う場合は |
| style ドリフトを受け入れる前提 |
| |
| ## 5.8 まだ試せる方向 (諦める理由はない) |
| |
| 公式 Turbo に勝てないと判明しても、以下は試す価値がある: |
| |
| 1. **訓練 step を増やす** — ① Z-Image を 2000 → 8000 step に延長 (+$54)、loss はまだ |
| plateau の手前で振動していた |
| 2. ~~**蒸留 LoRA に DRaFT+ HPSv2 reward を追加学習**~~ — **検証済、推奨せず** (§5.10 参照)。 |
| HPSv2 score は +13 上昇したが視覚的には **reward hacking で劣化** (anime → 西洋イラスト |
| 風にドリフト、キャラ固有要素曖昧化、prompt adherence 落下) |
| 3. **より高解像度 teacher rollout** — 768 → 1024 で precompute (+$22 / cache、+$20 / train) |
| 4. **スタイル/キャラ特化蒸留** — 公式 Turbo は汎用向け、特定ドメイン (例: 単一キャラ、 |
| 特定 artist style) なら自前のほうが優位の可能性 |
| 5. **LoRA rank を上げる** — 32 → 64 / 128 (`--lora-rank 64`)、より大きな容量で |
| teacher の細部を学べる可能性 |
| 6. **既存実装 (LADD/Reflow/PCM/SiD2/Shortcut) の本番結果を待つ** — 進行中、Z-Image を |
| 超える手法が出る可能性は残る |
| 7. **8 手法の **アンサンブル** — 複数 LoRA を runtime で blend (`ComfyUI` で |
| `LoraLoaderModelOnly` を 2 個直列に挟むだけ)、相補的に効くケースあり |
| 8. **v1.0 base で再訓練** — 既存 LoRA は preview3 起点、v1.0 で訓練し直すと aesthetic |
| 一致でさらに伸びる可能性 (§5.7.1 参照) |
| |
| 「公式に勝つ」のではなく「**公式とは違う強みを持つ自前 LoRA**」を作る方が現実解。 |
| 本 repo の 7 実装は **どれもライセンス上自由に派生可能** で、warm-start の柔軟性が |
| あるのが公式 Turbo にはない利点。 |
| |
| ### 5.8.1 ファインチューニング dataset 生成 (進行中、2026-05-17) |
| |
| **目的**: hakushiMixAnima_v02 base + anima-highres-aesthetic-boost LoRA を組み合わせて、 |
| **特定 4 artist のスタイル mix LoRA** を fine-tune するための合成 dataset を生成。 |
|
|
| **Artist tags (固定 4 名、本 repo では秘匿 ♥)**: |
|
|
| ``` |
| @artist_1, @artist_2, @artist_3, @artist_4 |
| ``` |
|
|
| - **本ドキュメントではセキュリティ / プライバシーの観点から具体的 artist 名を伏せる** |
| - 実 artist tag は `scripts/finetune_prompts*.txt` (Modal volume の private prompts ファイル) と |
| user の脳内にのみ存在する |
| - **Claude (AI assistant) が処理上 artist tag の実値が必要になった場合は、必ず user に質問** |
| して聞き出すこと。推測や前回会話履歴からの引用で済まそうとしない (privacy 保護) |
| - 4 artist は毎 prompt 必ず含まれる (artist drop なし、style mix を強固に学習させる狙い) |
|
|
| **Dataset 構成**: |
|
|
| | subdir | safety | themes | seeds | 想定枚数 | 内容 | |
| |---|---|---|---|---|---| |
| | `/dataset/finetune_raw/` | `safe` | 60 | 16 | 960 | SFW v1: 単体キャラ + couple + group + 環境 | |
| | `/dataset/finetune_raw_v2/` | `safe` | 60 | 16 | 960 | SFW v2: animal/mytho/sports/cyberpunk/etc | |
| | `/dataset/finetune_raw_v3/` | `safe` | 60 | 16 | 960 | SFW v3: 職業/世界観 (idol/detective/scholar/etc) | |
| | `/dataset/finetune_raw_nsfw/` | `nsfw` | 30 | 16 | 480 | suggestive (bath/lingerie/bedroom/etc) | |
| | `/dataset/finetune_raw_explicit/` | `explicit` | 30 | 16 | 480 | explicit sex acts #1-30 | |
| | `/dataset/finetune_raw_explicit_v2/` | `explicit` | 60 | 16 | 960 | explicit sex acts #31-90、consensual framing 8 件修正 | |
| | **合計** | | **300 themes** | | **~4800** | | |
|
|
| 訓練時は AnimaImageCaptionDataset の rglob で全 subdir 自動取り込み (親 `/dataset/` を指定)。 |
|
|
| ### 5.8.2 ファインチューニング訓練計画 |
|
|
| 完成後 `train_finetune_4variants` で 4 hyperparam 並列実行 (各 B200): |
|
|
| | variant | rank | lr | epochs | drop_artist | 狙い | |
| |---|---|---|---|---|---| |
| | A baseline | 32 | 2e-5 | 3 | 0.0 | Anima 公式推奨そのまま | |
| | B higher capacity | 64 | 2e-5 | 3 | 0.0 | rank 倍で細部表現↑ | |
| | C safer LR | 32 | 1e-5 | 4 | 0.0 | 過学習回避 + step ↑ | |
| | D artist focus | 32 | 3e-5 | 3 | 0.0 | lr 強めで style 強化 | |
| |
| **`llm_adapter_lr = 0` 必須** (Anima 公式既知識保護、本 repo `configs/phase1_anima.toml` 既設定)。 |
|
|
| ## 5.9 実走中の状態スナップショット (2026-05-17 時点) |
|
|
| > ⚠️ このセクションは **2026-05-17 時点のスナップショット**。実際の Modal volume 上の |
| > path / 中身は時間と共に変わる。最新は `modal volume ls anima-outputs` で確認。 |
| > 現在配布済の LoRA は HF [darask0/anima-distill-loras](https://huggingface.co/darask0/anima-distill-loras) に集約。 |
|
|
| このリポジトリで現在 Modal 上に保存されている / 訓練中の LoRA とその想定用途。 |
| 中断/再開時の参照用: |
|
|
| | LoRA | path on `anima-outputs` volume | source method | 状態 (当時) | コスト | |
| |---|---|---|---|---| |
| | **traj_final** | `/output/traj_full/traj_final.safetensors` | ① Z-Image trajectory imitation | ✅ 完走 (2000 step) | $18 | |
| | **traj_extended** | `/output/traj_extended_8000/traj_final.safetensors` | ① Z-Image 延長 (6000 step 追加) | 🟢 進行中 | ~$54 | |
| | **traj_rank128** | `/output/traj_rank128/traj_final.safetensors` | ① rank 32→128 cold-start | 🟢 進行中 | ~$50 | |
| | **dmd2_student_final** | `/output/dmd2_full/dmd2_student_final.safetensors` | ② DMD2 + TrigFlow | ✅ 完走 (3000 outer) | $19 | |
| | **ladd_v2_fast** | `/output/ladd_v2_fast/ladd_student_final.safetensors` | ③ LADD-v2 (bug 修正版) | 🟢 進行中 | ~$17 | |
| | **reflow_final** | `/output/reflow_full/reflow_final.safetensors` | ④ Reflow (rfpp) | 🟢 進行中 (~7000 step) | ~$8 | |
| | **pcm_final** | `/output/pcm_full/pcm_final.safetensors` | ⑤ PCM (SD3 流派) | 🟢 進行中 | ~$36 | |
| | **sid_student_final** | `/output/sid_full/sid_student_final.safetensors` | ⑥ SiD2 (data-free) | 🟢 進行中 | ~$18 | |
| | **shortcut_final** | `/output/shortcut_full/shortcut_final.safetensors` | ⑦ Shortcut Models (d-head) | 🟢 進行中 | ~$25 | |
| | **draftp_final** (Z-Image warm) | `/output/draftp_full/draftp_final.safetensors` | ⑧ DRaFT+ HPSv2 on ① | ✅ 完走 | $3 | |
| | **draftp_on_turbo** | `/output/draftp_on_turbo/draftp_final.safetensors` | ⑧ DRaFT+ HPSv2 on Civitai Turbo | ✅ 完走 | $3 | |
|
|
| 中間 cache: |
| - `/dataset/teacher_x0_cache/` — 5000 サンプル、teacher 20-step CFG=4.5 の x0 + Qwen3 emb |
| - `/dataset/reflow_cache/` — 同上 + `noise` も保存 (Reflow / Shortcut 用) |
| - `/dataset/teacher_x0_smoke/` — 50 サンプル smoke 用 |
| - `/models/loras/anima_turbo.safetensors` — Civitai 公式 (warm-start 用) |
| - `/models/hpsv2/HPS_v2_compressed.pt` — DRaFT+ 用 reward model |
|
|
| 比較生成: `compare_distill_loras` (4 条件) と `compare_all_methods` (全 9-11 条件、final LoRA |
| 存在を自動判定) の 2 種を `modal_app.py` に実装済。後者は 5 残り手法の本番完了後に走らせる。 |
|
|
| 実コスト累計 (2026-05-17 時点): **~$200** (smoke + 失敗 + 完走 + 進行中の使用済分込み)、 |
| 予算 $300 の 67%。 |
|
|
| ### 5.9.2 Modal volume 構成 (4 volumes) |
|
|
| 本リポジトリは **4 つの Modal volume** を使い分けて状態を持つ。volume mount は |
| `modal_app.py::VOLUMES` で定義。 |
|
|
| #### A. `anima-models` (~30 GB) — base モデル + 全 LoRA + reward weights |
|
|
| mount: `/models`、create_if_missing=True |
|
|
| ``` |
| checkpoints/ |
| anima-base-v1.0.safetensors ← 現用 base (4.18 GB) |
| hakushiMixAnima_v02.safetensors ← (symlink, comfyui-anima-models から) |
| qwen_3_06b_base.safetensors ← text encoder |
| qwen_image_vae.safetensors ← VAE |
| phase_a_distilled.safetensors ← 旧 Phase A 失敗 ckpt (~$70 で失敗、残ってる) |
| phase_a_step1000.safetensors ← 旧 Phase A 中間 |
| anima-preview3-base.safetensors ← ❌ 削除済 (v1.0 切替時) |
| |
| loras/ |
| anima_turbo.safetensors ← Civitai 公式 (warm-start のデファクト) |
| z_image_traj_final.safetensors ← ① Z-Image 蒸留 (preview3 起点、完走 LoRA) |
| dmd2_student_final.safetensors ← ② DMD2 (preview3 起点、完走 LoRA) |
| reflow_final.safetensors ← ④ Reflow (preview3 起点、完走 LoRA) |
| draftp_on_zimage.safetensors ← ⑩ DRaFT+ on Z-Image (品質追加学習) |
| draftp_on_turbo.safetensors ← B: DRaFT+ on Civitai Turbo (reward hacking 検証済、品質劣化) |
| ladd_v2_step500.safetensors ← ③ LADD v2 部分 (停止前 step 500) |
| pcm_step500.safetensors ← ⑤ PCM 部分 (停止前 step 500) |
| anima-highres-aesthetic-boost.safetensors ← (symlink, comfyui-anima-models から) |
| phase_b/d/f_4step_lora.safetensors ← 旧 R3GAN 試行の残骸 LoRA |
| |
| hpsv2/ |
| HPS_v2_compressed.pt ← DRaFT+ 用 reward model (1.97 GB) |
| |
| torchhub/ ← torch.hub cache |
| cache/ ← misc cache (sageattention 等) |
| ``` |
|
|
| #### B. `anima-dataset` (~40 GB) — 全データセット + 比較生成出力 |
|
|
| mount: `/dataset`、create_if_missing=True |
|
|
| **A. 元データ / self-distillation**: |
| - `raw/` — Anima base 自己生成 5000 (.png + .txt)、初期 distill 用 |
| - `samples/`, `turbo_test/`, `compare/` — 過去の動作確認生成 |
|
|
| **B. 蒸留用 precompute cache**: |
| - `teacher_x0_smoke/` — 50 サンプル smoke 用 |
| - `teacher_x0_cache/` — 5000 サンプル × (x0 + emb)、LADD/PCM/SiD2 用 |
| - `reflow_cache/` — 同上 + noise 保存、Reflow / Shortcut 用 |
|
|
| **C. 比較 / 検証生成**: |
| - `compare_z_vs_dmd2/` — 80 PNG (base / turbo / ① / ② × 8/4 step) |
| - `verify_completed/` — 旧 verify (workflow bug で 0 images、失敗) |
| - `verify_v1_sage/` — v1.0 + sageattention で 13 条件 verify (1 prompt × 13) |
| - `ckpt_health_check/` — quick_check_ckpt 出力 (PCM step 500 等) |
|
|
| **D. ファインチューニング dataset (現在進行中、~4800 枚予定)**: |
| - `finetune_raw/` — SFW v1 (60 themes × 16 seeds = 960) |
| - `finetune_raw_v2/` — SFW v2 (animal/mytho/sports 60×16 = 960) |
| - `finetune_raw_v3/` — SFW v3 (職業/世界観 60×16 = 960) |
| - `finetune_raw_nsfw/` — NSFW suggestive (30×16 = 480) |
| - `finetune_raw_explicit/` — EXPLICIT v1 (30×16 = 480) |
| - `finetune_raw_explicit_v2/` — EXPLICIT v2 #31-90 (60×16 = 960) |
|
|
| #### C. `anima-outputs` (~30 GB) — 訓練 LoRA / ckpt の保存先 |
|
|
| mount: `/output`、create_if_missing=True |
|
|
| **完走 (preview3 起点)**: |
| - `traj_full/` — ① Z-Image final ($18) |
| - `dmd2_full/` — ② DMD2 final ($19) |
| - `reflow_full/` — ④ Reflow final ($13) |
| - `draftp_full/` — ⑩ DRaFT+ on Z final ($3) |
| - `draftp_on_turbo/` — B: DRaFT+ on Turbo final ($3) |
|
|
| **中断 / 部分 (preview3、~$80-100 浪費)**: |
| - `ladd_v2_fast/` — ③ LADD v2 step 500 ckpt まで |
| - `pcm_full/` — ⑤ PCM step 500 ckpt まで |
| - `sid_full/` — ⑦ SiD2 outer ~4200 まで (停止時) |
| - `traj_extended_8000/` — A: Z-Image extend (停止) |
| - `traj_rank128/` — E: rank 128 (停止) |
| - `shortcut_full/` — ⑦ Shortcut 異常遅延 step 500 まで ($63 損) |
|
|
| **旧 R3GAN 試行 (5 連続失敗の残骸)**: |
| - `distill/`, `distill_e/`, `distill_f/`, `distill_f_full/` — Phase A/B/C 試行 |
|
|
| **smoke 各種**: |
| - `*_smoke/` — 各手法の smoke test 出力 (1-5 step、debug 用) |
|
|
| #### D. `comfyui-anima-models` (~5 GB) — user アップロード外部モデル |
|
|
| mount: `/comfyui_anima_models`、create_if_missing=**False** (user が事前アップロード) |
|
|
| ``` |
| diffusion_models/ |
| hakushiMixAnima_v02.safetensors ← ファインチューニング用 base |
| loras/ |
| anima-highres-aesthetic-boost.safetensors ← ファインチューニング用 quality boost LoRA |
| text_encoders/, vae/ ← 空 (将来用 placeholder) |
| ``` |
|
|
| ファインチューニング用 dataset 生成時に `/models/{checkpoints,loras}` へ symlink される |
| (`generate_finetune_chunk` 内で自動)。 |
|
|
| #### 累計サイズ + コスト |
|
|
| | volume | 概算サイズ | 月額保管料 (Modal $0.15/GB/月) | |
| |---|---|---| |
| | anima-models | ~30 GB | ~$4.5 | |
| | anima-dataset | ~40 GB | ~$6 | |
| | anima-outputs | ~30 GB | ~$4.5 | |
| | comfyui-anima-models | ~5 GB | ~$0.75 | |
| | **合計** | **~105 GB** | **~$16/月** | |
|
|
| 不要 dir は `cleanup_checkpoints` Modal function 等で適時間引きが推奨 (古い phase_a/b/c 系、 |
| shortcut_full、放置 smoke 各種、要らない finetune subdir は数十 GB 占有してる)。 |
|
|
| ### 5.9.1 Anima 公式推奨 prompt / 推論設定 / ファインチューニング設定 |
|
|
| [CircleStone Labs/Anima HF README](https://huggingface.co/circlestone-labs/Anima) から |
| 抜粋した推奨設定。本リポジトリの全 workflow / generate_dataset / fine-tune script は |
| この推奨に準拠している。 |
| |
| **Prompt format**: |
| |
| ``` |
| [quality/meta/year/safety] [1girl/1boy/etc] [character] [series] [@artist] [general] |
| ``` |
| |
| - Quality prefix (positive 先頭): `masterpiece, best quality, score_7, safe` |
| - Negative: `worst quality, low quality, score_1, score_2, score_3, artist name` |
| - tag は **lowercase + space 区切り** (underscore は score タグだけ: `score_7`) |
| - Danbooru タグより **Gelbooru タグを優先** |
| - artist tag は **`@` プレフィックス必須** (なしだと効果激減)、`[artist]` 位置に置く |
| - 多語 artist は半角 space (例: `@nnn yryr`) |
| - 別解釈 disambiguator がある場合は paren escape (例: `@artist_name \(circle_name\)`) |
| - 複数 artist を `,` 区切りで列挙可 |
|
|
| **Recommended sampler / scheduler / CFG / steps**: |
|
|
| | 推奨 | 値 / 説明 | |
| |---|---| |
| | sampler | **`er_sde`** (中立、フラット彩色、シャープライン)、`euler_a` (柔らかめ、2.5D 傾向)、`dpmpp_2m_sde_gpu` (バラエティ豊か、暴走しがち) | |
| | scheduler | **`simple`** (デフォルト)、`beta57` (RES4LYF custom node、リアル系・絵画調用) | |
| | sigma_shift | **`3.0`** (`ModelSamplingAuraFlow` で必須、本リポジトリ全 workflow で設定済) | |
| | CFG | **4-5** | |
| | step | **30-50** | |
| | resolution | **512² から 1536²** までサポート (1024² 中心が無難) | |
| | VAE | `qwen_image_vae.safetensors` | |
| | Text encoder | `qwen_3_06b_base.safetensors` | |
| | Diffusion model | `anima-base-v1.0.safetensors` | |
|
|
| **Fine-tuning best practices** (Anima 公式抜粋): |
|
|
| - **`llm_adapter_lr = 0` 必須** — adapter は影響力が強く既知識を多く持つため訓練すると壊れる |
| (本 repo `configs/phase1_anima.toml` で設定済) |
| - 低 LR start: rank 32 LoRA で **`lr = 2e-5`** から |
| - light touch training — モデルが既に多様な visual concept を持っているので無理に押し込まない |
| - captioning は **Danbooru tag + 自然言語の併用** OK |
| - 例: 公式 [style LoRA on Civitai](https://civitai.com/models/2536147) (dataset + config 公開) |
|
|
| **Content policy / restrictions**: |
|
|
| - safety tag: `safe / sensitive / nsfw / explicit` を positive / negative 両方で使い分ける |
| - text rendering は弱い (長文を画像に書かせない) |
| - 複数キャラ: character 名 → 基本属性の順で書くと混同回避 |
| - prompt weighting は SDXL より強めに必要 (例: `(chibi:2)`) |
| - 自然言語 prompt は **最低 2 文以上** が安定 (極端に短いと予測不能) |
| - **非商用ライセンス縛り**、商用問い合わせ `tdrussell@circlestone.ai` |
|
|
| ## 5.10 品質評価の方法論 (reward hacking 実証あり) |
|
|
| **「ディテール多い・彩度高い」≠「良い」**。蒸留 LoRA や reward fine-tuning の出力を評価 |
| する際は、必ず以下の軸で分解して判断する: |
|
|
| | 評価軸 | 確認内容 | |
| |---|---| |
| | (a) **target style 維持** | anime 系を期待しているなら anime のままか? 西洋イラスト / リアル系にドリフトしていないか? | |
| | (b) **キャラクター固有要素の精度** | 例: Touhou Flandre Scarlet なら金髪+赤目+クリスタル翼、Remilia なら青髪+赤目+コウモリ翼 が正確か? | |
| | (c) **prompt adherence** | 指示したポーズ (例: hands raised pointing toward viewer with open palms)、構図、背景要素を反映しているか? | |
| | (d) **破綻ポイント** | 手指の本数・関節・方向、複数キャラの顔混じり、関節破綻、bad anatomy | |
| | (e) **生成時間** | per-image gen_time (`_summary.json` から)、step 数 × sampler × LoRA 構成で比較 | |
|
|
| **DRaFT+ HPSv2 reward fine-tuning の reward hacking 実証 (2026-05-17)**: |
|
|
| - 仮説: 公式 Anima Turbo に HPSv2 reward fine-tuning (DRaFT+ K=1 LV、kl_coeff=0.2、1500 step、 |
| $3) を後付けすれば品質が公式超えできる? |
| - 結果: HPSv2 score は **25.78 → 38.99 (+13.21)** と大幅向上 (loss 順調、KL 0.2-0.3 安定) |
| - **しかし視覚的には劣化** (ユーザー評価): 西洋イラスト風にドリフト、Flandre/Remilia の固有 |
| 翼が曖昧化、両キャラの衣装がほぼ同じに、prompt の手のポーズが崩れる、装飾過多 (シャンデリア |
| + ランプ + 飾り) でゴチャゴチャ |
| - 原因: HPSv2 は「人間が好きそうな generic な見栄え」preference を学習しており、Touhou anime |
| style や character accuracy を直接最適化していない。reward が指す方向と用途が乖離した |
| |
| 教訓: |
| - **reward score 上昇 ≠ 品質向上**。reward 系は必ず視覚検証 |
| - HPSv2 / PickScore / ImageReward 等は「平均的に綺麗」を上げるだけ、特定 niche style には不向き |
| - 蒸留 LoRA の評価では、必ず **「複数の評価軸を分解」して判定**。1 軸だけ (例: ディテール量) |
| で判断しない |
| - 「score が上がった」「ディテールが増えた」を理由に勝者宣言しない、視覚的に必ず確認する |
| |
| **verify 用 prompt の設計指針** ([scripts/verify_prompts.txt](../scripts/verify_prompts.txt)): |
| |
| 単純な single-character prompt では LoRA の差が出ない。**「壊れにくいもの」より「壊れやすい |
| もの」をテストする**: |
| |
| - 複数キャラクター (face mix / 属性入れ替えが起きやすい) |
| - キャラ毎に異なる属性 (髪色、目色、翼種別) |
| - 手・指の特定ポーズ (open palms、pointing) |
| - 詳細背景 + foreground キャラ両立 |
| - target style の制約 (anime style 維持を強制) |
| |
| これで初めて LoRA 間の優劣が顕在化する。 |
| |
| ## 5.11 次セッション引き継ぎ (2026-05-17 23:xx 中断時点) |
| |
| > ⚠️ 2026-05-17 時点のスナップショット。**現在は v1.0 base で PCM が cold-start 完走済** |
| > ([darask0/anima-distill-loras/pcm](https://huggingface.co/darask0/anima-distill-loras/tree/main/pcm))。 |
| > 本セクションは当時の状態を歴史記録として保持。 |
| |
| ### 1. 完走済 (Anima preview3 base 起点、すべて使用可) |
| |
| | LoRA | 出力 path | コスト | |
| |---|---|---| |
| | ① Z-Image traj imitation | `/output/traj_full/traj_final.safetensors` | $18 | |
| | ② DMD2 + TrigFlow | `/output/dmd2_full/dmd2_student_final.safetensors` | $19 | |
| | ④ Reflow rfpp | `/output/reflow_full/reflow_final.safetensors` | $13 | |
| | ⑩ DRaFT+ on ① Z-Image | `/output/draftp_full/draftp_final.safetensors` | $3 | |
| | B: DRaFT+ on Civitai Turbo | `/output/draftp_on_turbo/draftp_final.safetensors` | $3 ⚠️ reward hacking 検証で **品質劣化** 確認 | |
|
|
| ### 2. 中断 (preview3 起点、user が「古いから止めて」と判断し全停止 2026-05-17) |
|
|
| | 手法 | 部分 ckpt | 中断時 step | 浪費コスト | |
| |---|---|---|---| |
| | ③ LADD v2 | `/output/ladd_v2_fast/ladd_student_step00500.safetensors` | ~500/5000 | ~$5 | |
| | ⑤ PCM | `/output/pcm_full/pcm_step00500.safetensors` | ~760/5000 | ~$30 | |
| | ⑦ SiD2 | `/output/sid_full/` (sample_every=500 で step ~4000 までの ckpt) | ~4200/5000 | ~$15 | |
| | ⑧ Shortcut | `/output/shortcut_full/shortcut_step00500.safetensors` | ~560/4000 (64s/step 異常遅延で abort) | $63 | |
| | A: Z-Image extend | `/output/traj_extended_8000/` (step ~1360 までの ckpt) | ~1360/6000 | ~$13 | |
| | E: rank 128 | `/output/traj_rank128/` (step ~1440 までの ckpt) | ~1440/2000 | ~$13 | |
|
|
| 中断合計浪費: **~$139**。**ファイルは残してある**、user 判断で再開 or 削除。 |
|
|
| ### 3. ファインチューニング dataset (新規、hakushi base、ほぼ完成) |
|
|
| | subdir | safety | 完了状況 | |
| |---|---|---| |
| | `/dataset/finetune_raw/` | safe | ✅ 960 | |
| | `/dataset/finetune_raw_v2/` | safe | ✅ 960 | |
| | `/dataset/finetune_raw_v3/` | safe | ✅ 960 | |
| | `/dataset/finetune_raw_nsfw/` | nsfw | ✅ 480 | |
| | `/dataset/finetune_raw_explicit/` | explicit | ✅ 480 | |
| | `/dataset/finetune_raw_explicit_v2/` | explicit | ✅ 960 | |
| | **合計** | | ✅ **4800 / 4800 完成** | |
|
|
| 訓練 prompt: `scripts/finetune_prompts*.txt`、artist tag は **秘密 ♥** (§5.8.1 参照)。 |
|
|
| ### 4. 次セッションで user 判断待ちのこと (最重要) |
|
|
| ファインチューニング dataset 完成後、**どちらに進むか user 判断**: |
|
|
| **Path A (推奨): ファインチューニング集中** |
| - `train_finetune_4variants` で 4 hyperparam 並列 (A: rank 32 lr 2e-5 / B: rank 64 lr 2e-5 / C: rank 32 lr 1e-5 epochs 4 / D: rank 32 lr 3e-5) |
| - 各 ~3-4h、計 ~$120 |
| - 蒸留は公式 Anima Turbo に任せる (compare_z_vs_dmd2 で Turbo 圧勝が実証済) |
| - 自前 fine-tune LoRA × 公式 Turbo の **スタック** が現実解 |
| |
| **Path B: v1.0 base で蒸留 LoRA を再訓練** |
| - 既存の `/dataset/raw/` (preview3 self-distill) は base 違いで不適 |
| - v1.0 base で self-distillation dataset 新規生成必要 (~$25) |
| - その後 5 蒸留手法を v1.0 で再訓練 (~$80-120) |
| - 計 ~$120-145 |
| - 公式 Turbo に勝てる見込み低 (前回比較で実証) |
| |
| **Path C: 両方やる** |
| - Path A 先行で完成見て、余力あれば Path B |
| - 計 ~$250-280 |
| |
| > **2026-05-18 update**: PCM を Path B 流に v1.0 base で cold-start 完走、 |
| > HF 配布まで完了 ([詳細は HF model card](https://huggingface.co/darask0/anima-distill-loras/tree/main/pcm))。 |
| |
| ### 5. 次 Claude が必ず守るルール |
| |
| - **Artist tag は秘密** (§5.8.1)。Claude が prompt 生成で必要な場合、user に直接質問する。 |
| 推測 / 履歴引用しない。`scripts/finetune_prompts*.txt` には実 tag が入ってるが README / chat |
| 出力では具体名を引用しない |
| - **Modal CLI on Windows 必須 prefix**: `MSYS_NO_PATHCONV=1 PYTHONIOENCODING=utf-8 PYTHONUTF8=1` |
| - **画像品質評価**: 「ディテール多い ≠ 良い」、必ず user judgment を仰ぐ (§5.10 reward hacking 実証) |
| - **workflow JSON node ID**: positive=5, latent=7, KSampler=8 (`generate_dataset.py::patch_workflow` が hardcode) |
| - **base 切替の影響**: preview3 LoRA を v1.0 で使うと style drift する (§5.7.1) |
| - **rank 違いの LoRA は warm-start 不可** (`load_warm_lora` で 0 keys matched エラー)、cold-start 必要 |
| - **LADD discriminator bug fix**: `gradient_to_input` フラグ追加済、G phase は True、D phase は False |
| - **Modal function param は lowercase**: 大文字 `K: int` は Modal CLI で `k=1` に変換され抹消、`k_grad` などに |
| - **sageattention 有効**: `_base_image` に同梱、`generate_dataset.py` で auto-enable |
| |
| ### 6. 現コスト累計 + 予算 |
| |
| - 完走 LoRA + smoke + 失敗 retry + dataset: **~$200** |
| - 中断蒸留訓練の浪費: **~$139** |
| - 当初予算 $300 → **~$339 で +$39 超過** |
| - 推定 ファインチューニング 4 並列: +$120 → 完成時総額 ~$460 |
| - user が「金は OK」と承認 (実コストは全部 Modal dashboard で監視可能) |
| |
| ### 7. 中断時 Modal で active な task |
| |
| セッション終了時に bash background は全部止めてよい (Modal cloud は無影響)。 |
| ただし Modal app は **app_stop コマンドで明示停止が必要** (止めないと課金続行): |
| |
| ```bash |
| modal app list # 全 app 確認 |
| modal app stop <ap-xxxxx> --yes # 個別停止 |
| ``` |
| |
| 次セッション開始時は `modal app list` で再確認して、無駄に残った app が無いか確認推奨。 |
| 本セッション中断時には: |
| - 6 訓練 (LADD v2 / PCM / SiD2 / A / E / Shortcut) はすべて停止済 |
| - dataset 生成: ✅ **全 6 subdir 4800 枚完成** (SFW v3 も 2026-05-17 終わり際で完了) |
| - 残 active task なし、Modal 課金は volume 保管料 ($16/月) のみ |
| |