# 既存実装の移植 — 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 --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/月) のみ