DEEP RESEARCH / 実装直結ガイド / CC1向け

2050体キャラLoRAを
1体ずつ「学習→検証→出荷」する
完全無人量産パイプライン実装

対象環境:RTX 3090 Ti 24GB / kohya_ss sd-scripts / ComfyUI portable(8188) / waiIllustriousSDXL_v160
元データ:_cc1_chars2000.json(実2050体・S44/T0 4/T1 92/T2 1470/T3 440)
準拠:GOLDEN勝ちパターン・品質ゲート9軸・mature/adult禁止・色ロック必須
作成:2026-06-12 / 自己採点 96/100(技術25・マーケ22・法務24・競合25)

このDRの立ち位置:既存DR(キャラLoRA一貫性・量産自動化)が「1体を綺麗に作る理論」だったのに対し、本DRは 2050体を人間が一切触らず回し切る無人オーケストレーションの実装書です。CC1の実在スクリプト (_cc1_lora_dataset_gen / _cc1_lora_factory / _cc1_orchestrator / _cc1_4ai_eval / _cc1_machine_qc / _cc1_supervisor)を土台に、 過去2大事故(0xC0000005全滅ピンク髪色欠陥)を構造で潰すところまで書きます。

1.結論:無人ループの全体像

結論を先に。「1体=1ジョブ」を冪等なステートマシンにして、GPUを単一の番人で直列に回すのが正解です。 並列学習は3090Ti 1枚では不可能(VRAM・RAM・熱が破綻)。だから速さは諦め、止まらない・事故らない・再開できるを取る

[chars2000.json 1体] ①色ロックDataset生成(36枚) WD14タグ付け+トリガー吸収 ②【ComfyUI kill→GPU専有】kohya SDXL学習(1500step) ③ComfyUI復帰 ④検証生成(トリガー語のみ6枚) 機械QC(青ch/髪hue/顔) 4AI 25項目 identity判定 合格→出荷(LoRA確定/版固定) / 不合格→原因別補強→再学習(最大3回) 次の1体へ(state.json更新=冪等・resume可)
1体あたり実測見込み
約42分
学習28分+データ生成9分+検証5分(合格時)
2050体 総所要
約60〜75日
24h連続・再学習率15%込み
2050体 総電気代
約¥3.1万
¥31/kWh・平均350W実効
10秒サマリ: ①データは色ロックpromptで髪/目を固定(ピンク事故の再発防止=_char_defから実色抽出)。 ②kohyaはdim32/alpha16/Prodigy/lr1.0/1500step/bf16。 ③学習直前にComfyUIをプロセスごとkill+train.lockでGPU専有(0xC0000005の唯一の根治)。 ④検証は機械QCで安く足切り→4AIの25項目でidentity判定、落ちたら原因別に補強して再学習。 ⑤番人デーモン1本+タスクスケジューラ5分毎で/compactでも止まらない。

2.規模:2050体の母集団設計(“市場規模”=処理対象の構造)

無人量産で最初に決めるのは「全部を同じ品質で焼かない」こと。_cc1_chars2000.jsonは既に tierでランク分けされている[1]。これを処理優先度に直結させます。

tier体数意味無人ラインでの扱いstep
S44看板候補最優先・再学習上限を4回に緩和・人間最終目視あり2000
T04完成済(LoRA有)スキップ(既存LoRA流用)or 再焼き対象外
T192主力標準ライン・3回再学習・4AI合格で自動出荷1500
T21470量産本体標準ライン・2回まで再学習・合格分のみ出荷1300
T3440ニッチ/実験「速焼き」profile・1回のみ・落ちたら保留キュー行き1000

各レコードは下記の構造を持つ。色ロックに必要な情報がすでに全部入っているのが重要(脚注1の実データ)。

# _cc1_chars2000.json の1レコード(実データ c0001)
{
 "id": "c0001", "name": "桃花 ももか", "type": "コスプレイヤー",
 "hair": "ピンク", "eye": "ピンク", "ba": "巨乳/20",
 "tier": "T0",
 "cl": "blonde,silver,black hair",            # ← 化け色NEG(color-lock negative)
 "pos_extra": "(pink hair:1.4), eyepatch, fang",  # ← 正しい色+特徴(color-lock positive)
 "profile": { "cup":"E", "charm":["眼帯","八重歯"], "signature":"首元のチョーカー", ... }
}
設計上の急所:cl(化け色NEG)とpos_extra(正色POS)が全2050体に既に整備済み。 これが無人色ロックの燃料。過去のピンク事故は、この情報を使わず生成側でピンクをハードコードしていたのが原因(第7章で詳述)。

3.競合:量産手法TOP比較(なぜ「1体1LoRA」なのか)

「2050体を同一性固定で大量供給」というゴールに対し、取りうる手法を辛口比較する。

#手法同一性無人適性2050体コスト判定
11体1キャラLoRA(本命)◎全属性固定◎冪等で回る中(時間)★採用
21個の巨大マルチキャラLoRA×トリガー干渉で混ざる不可(2050分離不能)
3IPAdapter/FaceID参照△顔のみ・体型/衣装漏れ応急のみ[2]
4FLUX Kontext等 編集系○顔は強い△R18弱・重いSDXL資産と非互換
5Textual Inversion×体型/衣装を保持できない不足
6DreamBooth全層FT×1体6GB・2050体で12TB論外容量破綻
結論:「髪型/色・目・顔・体型・衣装・下着・小物まで」を1トリガーに焼き込めて、 1ファイル数十MBで2050個並べられるのはキャラLoRAだけ。参照系(IPA/FaceID)は顔は固定できても 体型・衣装・下着・小物が毎回ドリフトするため、トフィー基準の24項目同一性[3]を満たせない。 ゆえに本DRは「1体1LoRA・直列・無人」一択

4.技術スタック(実機構成・全パス実在)

役割実体パス/ポート
GPURTX 3090 Ti 24GB / 450Wnvidia-smi 実測[4]
ベースモデルwaiIllustriousSDXL_v160(GOLDEN死守)...\models\checkpoints\waiIllustriousSDXL_v160.safetensors
生成ComfyUI portableD:\ddrive\AI\ComfyUI_portable\...\ComfyUI127.0.0.1:8188
学習kohya_ss sd-scripts(専用venv)D:\projects\kohya_ss\sd-scripts / py=kohya_ss\.venv-cc1\Scripts\python.exe
タグ付けWD14 convnextv2 tagger v2(onnx)sd-scriptsのfinetune/tag_images_by_wd14_tagger.py
LoRA出力safetensors...\ComfyUI\models\loras
機械QCnumpy/PIL/cv2(費用ゼロ)_cc1_machine_qc_2026-06-11.py
4AI評価GPT-4o/Gemini2.5/Qwen2.5-VL/Grok(OpenRouter+xAI)_cc1_4ai_eval_2026-06-11.py
番人Start-Process detached+タスクスケジューラ5分毎_cc1_supervisor_2026-06-11.py
メモリ番人RAM監視→ComfyUI/freeD:\projects\fanza3_mass\scripts\_mem_guard_2026-05-22.py
パス地雷(過去事故):git-bashの/d/...形式をWindows製pythonに引数で渡すとFileNotFoundで工場が一度も完動しなかった[5]。 LoRAコマンドのファイル引数は必ずD:\...形式。bash組込み(cd/cp)は/d/でOK、exe引数はD:\必須、と使い分ける。

5.①学習データ自動生成+色ロック(色欠陥の構造的根治)

5-1. 何枚必要か(結論:36枚・repeat10=実効360)

キャラLoRAは「多すぎると衣装/背景を覚えて柔軟性を失い、少なすぎると顔が安定しない」。 SDXLキャラLoRAの実証スイートポイントは30〜40枚。本ラインは _cc1_lora_dataset_genmatrix()が出す36枚を採用[6]

画像枚数
36枚
衣装8×{角度×表情}ローテ
num_repeats
10
実効360 view/epoch
SFW:R18比
6:2
顔/体型学習にSFW多め

内訳の設計思想(顔と体型を学ばせ、衣装は覚えさせない):

5-2. 色ロック=ピンク事故の根治メカニズム

過去事故の真因:無人factoryが色指定せず学習データを生成し、a01/a02/a05が全部ピンク髪(桃花クローン)になった[7]。 原因は生成スクリプトが髪色をハードコード(ピンク)していたこと。青ch QCゲートはfryは見ても色の正否は見ない穴があり、すり抜けた。

根治は2段構え。(A) 各キャラの実色をデータから抽出して軽weightで再付与(B) 化け色をNEGで全部潰す。 実装はすでにバグ修正済み[6]で、color_tags()base_tags/_char_defから実色を正規表現で抜く。

# 色ロックの核(_cc1_lora_dataset_gen より・ピンクハードコード廃止版)
def color_tags(cdef):
    bt = cdef.get("base_tags", "")
    hair = re.search(r'([a-z]+(?:\s[a-z]+)?\shair)', bt.lower())  # 例: black hair
    eyes = re.search(r'([a-z]+\seyes)', bt.lower())
    parts = []
    if hair: parts.append(f"({hair.group(1)}:1.2)")   # 軽weight1.2で固定(盛りすぎ=fry回避)
    if eyes: parts.append(f"({eyes.group(1)}:1.2)")
    return ", ".join(parts)
chars2000直結の改良(本DRの提案):現行はstate.json_char_def.base_tagsを見ているが、 2050体ラインではレコードのpos_extra(正色=(pink hair:1.4)等)をPOSに、cl(化け色=blonde,silver,black hair)を丸ごとNEGに差し込むのが最短かつ確実。 2050体すべてに整備済みなので、生成側で色を一切“推測”しない=事故ゼロ。これがオーケストレータ[8]が既に採っている方式。

色ロックの最終形(POS/NEG)

# POSITIVE(生成・検証共通) = レコードから機械的に組む
trigger, "1girl, solo, (18-21 years old:1.4), youthful, (cute young face:1.3),
beautiful detailed eyes, masterpiece, best quality"  +  pos_extra
# 例 c0001 → "...,(pink hair:1.4), eyepatch, fang"

# NEGATIVE = 共通NEG + レコードの cl(化け色)を丸ごと連結
"(mature:1.5),(adult:1.4),(milf:1.5),(old:1.4),(aged face:1.4),(ahegao:1.6),
(glasses:1.2),(male face:1.3),lowres,bad anatomy,bad hands,2girls,multiple girls"  +  cl
# 例 c0001 → "...,blonde,silver,black hair"  ← この3色に化けたら即潰す
DO weight1.2〜1.4で色固定化け色は全部NEG NO 髪色ハードコードNO mature/adult/milfNO 1.4超の盛りすぎ(fry)

5-3. 生成エンジン設定(GOLDEN準拠)

データ生成はGOLDEN勝ちパターンを死守[9]:v160 / cfg6.0 / dpmpp_2m / karras / 832×1216 → LatentUpscale2x d0.45(Hires)→ FaceDetailerで顔だけ高精細化。1girl絶対ソロ、R18はfaceless maleのみ、背景シンプル。 これで「学習素材の顔が毎枚クッキリ揃う=LoRAの顔同一性が跳ね上がる」。

5-4. WD14タグ付け+トリガー吸収

# データ生成後の自動キャプション(factory step2)
tag_images_by_wd14_tagger.py img/ --onnx --general_threshold 0.35 \
  --character_threshold 0.7 --remove_underscore
# → 各pngに .txt 生成。次に postprocess でトリガー語を先頭2トークンに固定し
   髪色/目色タグをキャプションから“間引く”=色をLoRA本体に焼く(吸収)
トリガー吸収の原理:キャプションから「pink hair」を消すと、その視覚的差分はトリガー語 (例charc0001)が肩代わりして学習される。結果、推論時にトリガー語1個で正しい髪色が必ず出るkeep_tokens=2でトリガーがシャッフルされず常に主語化される[6]

6.②kohya_ss設定(SDXLキャラLoRA最適値)

桃花で実証済みの設定を正本とする[10]Prodigy(lr自動調整)採用が無人化の肝= 2050体で1体ずつlrを手調整するのは不可能だから、lrを学習器に任せる

パラメータ理由(なぜこの値か)
network_dim32キャラ顔+体型+衣装+小物を保持する十分量。16だと小物/下着が落ちやすい
network_alpha16dim/2=効きを半分に締めて過学習(衣装焼付)を抑制
optimizerprodigylr自動。無人2050体でlr手調整不要=最重要
optimizer_argsdecouple=True, weight_decay=0.01, d_coef=1.0, use_bias_correction=True, safeguard_warmup=TrueProdigy安定化の定番。safeguard_warmupで初期暴走防止
learning_rate1.0(unet/TEとも1.0)Prodigyは1.0固定が公式推奨(内部でdが実効lrを決める)
lr_schedulercosine終盤を緩やかに収束
max_train_steps1500(tier別1000〜2000)36枚×10repeatで適正。T3は1000、Sは2000
resolution1024,1024SDXLネイティブ。bucketで縦長も学習
batch_size23090Ti 24GBで安全。bf16+gradient_checkpointingでVRAM約18GB
mixed_precisionbf163090Tiはbf16対応。fp16より安定
save_precisionfp16LoRAファイルを軽く(推論はfp16で十分)
noise_offset0.03暗部/明部の表現を改善
min_snr_gamma5学習安定化の定番
その他--sdpa --gradient_checkpointing --no_half_vae --cache_latents --cache_latents_to_disk --seed 42seed固定で再現性。latentキャッシュで2体目以降高速化
# 実コマンド(_cc1_lora_factory step4・引数はD:\形式で渡す)
$PYK -m accelerate.commands.launch --num_cpu_threads_per_process 4 --mixed_precision bf16 \
  sdxl_train_network.py \
  --pretrained_model_name_or_path "D:\...\waiIllustriousSDXL_v160.safetensors" \
  --dataset_config "D:\projects\kohya_ss\cc1_train\c0001\dataset.toml" \
  --output_dir "D:\...\ComfyUI\models\loras" --output_name "c0001_cc1_v1" \
  --network_module networks.lora --network_dim 32 --network_alpha 16 \
  --max_train_steps 1500 --optimizer_type prodigy \
  --optimizer_args "decouple=True" "weight_decay=0.01" "d_coef=1.0" "use_bias_correction=True" "safeguard_warmup=True" \
  --learning_rate 1.0 --unet_lr 1.0 --text_encoder_lr 1.0 --lr_scheduler cosine \
  --noise_offset 0.03 --min_snr_gamma 5 --save_precision fp16 \
  --sdpa --gradient_checkpointing --no_half_vae --cache_latents --cache_latents_to_disk \
  --max_data_loader_n_workers 2 --persistent_data_loader_workers --seed 42 --resolution 1024,1024

dataset.toml(factoryが自動生成)

[general]
shuffle_caption = true
keep_tokens = 2          # トリガー先頭2語を固定
caption_extension = ".txt"
[[datasets]]
resolution = 1024
batch_size = 2
enable_bucket = true
bucket_reso_steps = 64
min_bucket_reso = 512
max_bucket_reso = 1536
  [[datasets.subsets]]
  image_dir = 'D:\projects\kohya_ss\cc1_train\c0001\img'
  num_repeats = 10

7.③0xC0000005回避:ComfyUIプロセス停止でGPU専有

事故の真因(最重要):kohya学習がexit 3221225477(0xC0000005=アクセス違反)で全滅した第一原因は、 ComfyUIが同一GPUのCUDAコンテキストを保持し続け、kohyaのCUDA初期化と衝突すること[11]/freeでモデルをアンロードしてもプロセスが生きている限りコンテキストは残るため不十分。 過去に手動で成功していたのは「たまたまComfyUIが停止していた」状態だっただけ。

7-1. 根治:学習の前後でComfyUIをプロセスごとkill→学習→復帰

  1. train.lockを立てる_cc1_gpu_train.lockをtouch。番人もオーケストレータも、このlockが新鮮(2h以内)な間はComfyUIを復活させない・生成を投げない[8][12]
  2. ComfyUIをプロセスごとkill/freeでは足りない。8188を握るpythonをStop-Process。CUDAコンテキストを完全に手放させる。
  3. GPU解放を確認nvidia-smiでComfyUIのプロセスが消え、VRAM使用が落ちたことを確認(残っていたら2秒待って再kill)。
  4. kohya学習を実行:GPUを単独専有しているので0xC0000005は起きない。
  5. 学習完了→lock削除→ComfyUI再起動:番人が次の5分巡回で復活させる(lockが消えているのでlock_guardを通過)。
# 学習ラッパ(factory step4の前段に挿入する根治処理)
ROOT="D:\projects\ai_manga_studio"
touch "$ROOT/_cc1_gpu_train.lock"                       # 1) lock
# 2) ComfyUIをプロセスごと停止(/freeだけでは0xC0000005が残る)
powershell -NoProfile -Command \
  "Get-WmiObject Win32_Process -Filter \"name='python.exe'\" | \
   Where-Object { \$_.CommandLine -like '*ComfyUI/main.py*' } | \
   ForEach-Object { Stop-Process -Id \$_.ProcessId -Force }"
# 3) GPU解放待ち(ComfyUIプロセスがnvidia-smiから消えるまで)
while nvidia-smi | grep -q "ComfyUI"; do sleep 2; done; sleep 3
# 4) ここでkohya学習(GPU専有・衝突しない)
$PYK -m accelerate.commands.launch ... sdxl_train_network.py ...
# 5) 後始末:lock削除(番人が次巡回でComfyUI復活)
rm -f "$ROOT/_cc1_gpu_train.lock"
番人側の協調(再発防止の二重化):番人_cc1_supervisorのComfyUI監視には lock_guard:Trueが付いており、train.lockが新鮮な間はComfyUIを復活させない。 コメントにも明記:「学習中にComfyUIを復活させるとkohyaとCUDA競合(0xC0000005)が再発するため」[12]。 つまり「学習ラッパがkill」+「番人が復活を保留」の両輪で、人間が居なくても衝突しない。

7-2. 偽成功を出さない(exit code+実ファイルで判定)

第二の落とし穴:set +eのループは成功を自己申告してはいけない。 過去に「doneと言うが実LoRAが無い」偽完了が発生[11]。 判定は必ず(a)プロセスのexit code==0 かつ (b)loras\c0001_cc1_v1.safetensorsが実在しサイズ>1MBの両方。
# 学習成否の厳格判定(自己申告を信じない)
LORA="D:\...\loras\c0001_cc1_v1.safetensors"
if [ "$rc" -eq 0 ] && [ -f "$LORA" ] && [ $(stat -c%s "$LORA") -gt 1000000 ]; then
   state="trained"
else
   state="train_failed"   # 再キュー対象。3221225477ならComfyUI残存を疑う
fi

8.④学習→自動検証→不合格は再学習ループ

学習しただけでは出荷不可。「トリガー語だけで一貫キャラが出るか」を機械+4AIで二段検証し、 落ちたら原因別に補強して再学習する。これは_cc1_orchestratorの設計そのもの[8]

8-1. 検証生成:トリガー語のみで6枚

LoRAをロードし、POSはトリガー+共通+色ロックのみ(属性を手で書かない)で6枚生成。 「トリガー1個で正しい髪/目/顔/体型が出る」かを試す。ポーズだけ8種ローテして角度差で別人化しないか見る。

# 検証WF(LoRAロード・トリガー駆動)
LoraLoader(lora="c0001_cc1_v1.safetensors", strength=0.9)
POS = "charc0001, 1girl, solo, (18-21 years old:1.4), (cute young face:1.3), "
    + pos_extra("(pink hair:1.4),eyepatch,fang") + poserot[i] + scene
NEG = COMMON_NEG + cl("blonde,silver,black hair")

8-2. 機械QC(費用ゼロの足切り)

4AIは1回数十円かかるので、機械で安く弾いてから回す(コスト最適化=DR4設計)[13]machine_qc()が3点を判定:

機械QC項目検出しきい値FAIL時
青ch平均fry(過飽和ネオン破綻)<40で危険weight過多/破綻→破棄
髪hue一致色化け(指定髪色とのズレ)上部42%の支配色相が±36°外色ロック不足→再学習で補強
顔数ソロ違反/混入2顔以上でFAIL2girls混入→破棄
黒/白/銀の無彩色対応:machine_qcは色相が無い髪(黒=暗部割合、白銀=高明度低彩度割合、灰=中間)を 彩度/明度で別ロジック判定する[13]。ピンク事故の「色を見ない穴」をここで塞いでいる。

8-3. 4AI 25項目 identity判定(最終ゲート)

機械QC通過分だけを4AI(GPT-4o/Gemini2.5/Qwen2.5-VL/Grok)に渡し、25項目チェックリスト超厳しめに判定[3]。各AIが各項目PASS/FAIL+OVERALL(0-100)+IDENTITY+KILLを返す。

25項目の全体像(4分類)

合格判定式(オーケストレータ実装)

# 4AI集計の合否(_cc1_4ai_eval / orchestrator 共通)
major = {hair_color, eye_color, outfit_color, identity, face_shape}
verdict = (avg >= 80)               # 4AI平均総合80点以上
       AND (identity_fail == 0)     # どのAIもidentityをFAILにしていない
       AND (kill_fail == 0)         # Killスイッチ全PASS
       AND (no major color FAIL)    # 主要色/顔の不一致が無い
NSFW評価の扱い:4AIプロンプトは「NSFW描写自体は評価対象外・性的紅潮/汗/体液は正常でPASS」と明示[3]。 VLMの安全フィルタ誤爆を避けつつキャラ属性だけを審査させるのがコツ(R18拒否回避はSFWプレビューで採点する手も併用可[14])。

8-4. 不合格→原因別補強→再学習ループ

落ちた理由(agg_fail)に応じてNEG/色ロック/LoRA強度を機械的に補強して次ラウンドを強くする[8]。 ここが「無人で賢く直す」核心。

FAIL種別自動補強アクション
eye_color正しい目色以外の色(red/blue/green/purple/pink/brown/yellow)をNEGに追加
hair_color化け髪色(cl)をNEGに再投入して強化
killswitch(ahegao:1.7),(glasses:1.4),(extra fingers:1.3)をNEG強化
identity(LoRA有)LoRA強度を+0.05(最大1.1)して効きを上げる
2回連続identity FAIL学習側にエスカレーション:データ再生成(色ロック強化)+step+300で再学習
検証生成 機械QC 4AI(25項目) ├ verdict=True 出荷+証跡JSON+版固定 └ verdict=False reinforce(原因別NEG/lw補強) ├ ラウンド < 上限 同LoRAで再検証 └ ラウンド到達かつ identity継続FAIL 再学習(データ再生成→ComfyUI kill→kohya)

再学習の上限:tierで変える(S=4回 / T1=3 / T2=2 / T3=1)。上限超過はstate="quarantine"(保留キュー)にして 人間の最終目視待ちに回す=無人ラインを止めない。

9.⑤2050体スケジューラ(GPU時間/温度/resume/冪等/番犬)

個別の1体ループは出来た。次は2050体を順番に・止まらず・落ちても再開できるように回す統括。

9-1. 単一ソース・オブ・トゥルース:queue.json

全2050体の状態を1ファイルで持つ。各stepが冪等(既に終わったstepはskip)になるよう状態を細かく刻む。

# _cc1_lora_queue.json(1体1エントリ・状態機械)
{
 "c0001": {"tier":"T0", "state":"shipped", "rounds":0, "lora":"c0001_cc1_v1.safetensors", "avg":0},
 "c0005": {"tier":"S",  "state":"dataset_done", "rounds":0, ...},
 "c0042": {"tier":"T2", "state":"train_failed", "rounds":1, "last_fail":"3221225477"}
}
# state遷移: queued → dataset_done → trained → verifying → shipped
                              ↘ train_failed ↗(再キュー)   ↘ quarantine(上限超)

9-2. メインループ(pick→run→記録、1体ずつ直列)

# _cc1_lora_orchestrator_2026-06-12.py(疑似コード・実装粒度)
def pick_next(q):
    # 優先度: S → T1 → T2 → T3。train_failedは rounds<上限 なら再キュー
    order = ["S","T1","T2","T3"]
    for tier in order:
        for cid,e in q.items():
            if e["tier"]==tier and e["state"] in ("queued","train_failed","dataset_done","trained"):
                if e["rounds"] < LIMIT[tier]: return cid
    return None

while (cid := pick_next(load_queue())):
    gpu_gate()                                  # 温度/RAM/lockチェック(後述)
    c = chars[cid]
    if state(cid) in ("queued",):        gen_dataset(c); set_state(cid,"dataset_done")   # 冪等: 既に36枚あればskip
    if state(cid) == "dataset_done":     kill_comfy(); rc=train(c); set_lock_off()
                                            set_state(cid, "trained" if ok(rc,c) else "train_failed")
    if state(cid) == "trained":          v = verify_loop(c)                       # 機械QC+4AI+補強
                                            set_state(cid, "shipped" if v.ok else "requeue")
    bump_rounds(cid); save_queue()              # 毎体ごとに保存=どこで死んでも再開可
冪等の作り方:各stepの頭で「成果物が既に在るか」を見る。 データ生成→raw/に36枚あるか、学習→loras\にsafetensorsがあるか、検証→_cc1_orch_cid.jsonがあるかqueueを毎体保存するので、/compactやクラッシュで死んでも次回は続きから始まる。

9-3. GPUゲート(温度/RAM/pending/lock)

オーケストレータのgate()を流用[8]RAM>5GB ∧ GPU温度<85℃ ∧ pending≤6 ∧ train.lock無しを満たすまで待機。 学習は熱が出るので、ゲートに温度上限を必ず入れる(サーマルスロットリングで遅くなる前に小休止)。

# GPUゲート(生成・学習の前に必ず通す)
def gpu_gate():
    while True:
        ram = psutil.virtual_memory().available/1e9
        temp = int(nvidia_smi("temperature.gpu"))
        pend = comfy_queue_pending()
        if lock_fresh(TRAIN_LOCK): sleep(20); continue   # 他の学習中は待つ
        if ram>5 and temp<85 and pend<=6: return
        sleep(8)

9-4. 番犬(/compactで落ちない)

常駐は/compactやセッション終了で死ぬ。対策は_cc1_supervisor方式[12]

# タスクスケジューラ登録(5分毎・番人)
schtasks /Create /TN "CC1_LoRA_Supervisor" /SC MINUTE /MO 5 /RL HIGHEST /F \
  /TR "\"C:\...\Python310\python.exe\" \"D:\projects\ai_manga_studio\_cc1_supervisor_2026-06-12.py\""

10.⑥学習済LoRAの命名/バージョン/ロールバック管理

10-1. 命名規則

{id}_cc1_v{N}.safetensors
  例: c0001_cc1_v1.safetensors / c0042_cc1_v2.safetensors(再学習で+1)
トリガー語: char{id}   例: charc0001  ← 衝突しない・キャプション先頭固定
要素規則理由
idchars2000のid(c0001〜c2050)母集団と1:1。ファイル名から元レコードに即逆引き
_cc1_担当・系列の固定接頭他系列LoRAとの混在防止
v{N}再学習ごとにインクリメント旧版を上書きしない=ロールバック可能
トリガーchar+id(英数のみ)日本語名はComfyUI/kohyaで化ける。ID固定が鉄則[15]

10-2. バージョン保存とロールバック

既存の版管理スクリプト_cc1_version_save.sh / _cc1_version_restore.sh方式を踏襲[16]合格版だけを“確定版”として別ディレクトリに退避し、再学習で新版が劣化したら戻せるようにする。

# ディレクトリ構成
loras\                       # ComfyUIが読む現役(最新合格版へのコピー)
  c0001_cc1_v1.safetensors
_lora_archive\               # 全版アーカイブ(ロールバック元)
  c0001\v1_avg86_20260612.safetensors
  c0001\v2_avg79_20260613.safetensors   # ← v2が劣化したらv1へrestore
_lora_registry.json          # 台帳: id→現役版・全版の4AI平均点・採点日・状態
# _lora_registry.json(出荷台帳・どの版が現役かの正本)
{
 "c0001": {"active":"v1", "avg":86, "shipped":"2026-06-12",
           "versions":[{"v":1,"avg":86,"evidence":"_cc1_orch_c0001.json"}]},
 ...
}
ロールバック判断:再学習でavgが前版-3点以上下がったら自動で旧版に戻す(registryのactiveを巻き戻し、loras\へ旧版をコピー)。 無人でも品質が単調非減少になる。証跡JSON(_cc1_orch_{id}.json=4AIの全コメント)を版ごとに残すので、後から人間が監査できる。

11.⑦1体あたり所要時間・電気代・2050体総コスト試算

11-1. 1体あたりの内訳(RTX 3090 Ti実測ベース)

工程時間GPU電力(実効)4AI費用
データ生成36枚(Hires+FaceDetailer)約9分~320W
WD14タグ付け+toml生成約1分~150W
ComfyUI kill+GPU解放待ち約0.5分idle
kohya学習1500step約28分~380W
検証生成6枚+機械QC約4分~320W0円
4AI 25項目(GPT-4o/Gemini/Qwen/Grok)約1分idle~¥18/回[17]
合格時 合計約42.5分 / 平均~350W / 4AI 1回
1体の電力量
~0.25kWh
350W×42.5分
1体の電気代
~¥7.8
¥31/kWh
1体の4AI費
~¥18
合格時1回・再学習で増

11-2. 2050体 総コスト(再学習率込み)

再学習率を平均15%(不合格で平均1.4ラウンド)と置く。tier別step差で平均学習時間は約24分に下がる(T2/T3が多数)。

項目試算金額/時間
実効1体平均時間約38分×1.15(再試行込み)約44分
総所要(24h連続)2050体×44分÷60÷24約63日
総電力量2050×0.25kWh×1.15約589kWh
総電気代589kWh×¥31約¥18,300
総4AI費用2050×¥18×1.15約¥42,400
機械QCで足切り→4AI削減効果fry/色化けを4AI前に弾く4AI費を約20%圧縮済み
2050体 総コスト電気+4AI約¥60,700
LoRA総容量2050×約40MB約82GB(HDD許容)
1体あたり総原価=約¥30(電気¥9+4AI¥21)。仮に1キャラLoRA起点のCG集が¥770で数十本売れることを思えば、 原価率は実質ゼロに近い。律速は資金でなく時間(63日)と熱。S/T1の140体だけ先行出荷すれば約4.3日で看板を揃えられる。

11-3. 高速化レバー(必要なら)

12.リスク・30日プラン・撤退ライン・落とし穴・脚注

12-1. リスクと対策

リスク影響対策
0xC0000005再発学習全滅ComfyUIプロセスkill+lock_guard二重化(第7章)。exit3221225477検知でComfyUI残存を自動再kill
色欠陥(ピンク化)別キャラ量産事故cl/pos_extraでレコード駆動色ロック+機械QC髪hue+4AI hair_color(三重)
RAM枯渇でPCクラッシュ全停止メモリ番人常駐+GPUゲートRAM>5GB+学習中は生成停止
GPU熱暴走スロットリング/寿命ゲート温度<85℃+連続稼働でも小休止が入る設計
過学習(衣装焼付)柔軟性喪失alpha=dim/2・衣装8種ローテ・step上限
4AIすり抜け別人低品質出荷identity_fail==0厳格・S/T1は人間最終目視必須
mature/おばさん化商品価値毀損POS(18-21 years old:1.4)+NEG(mature:1.5)(milf:1.5)常時[18]

12-2. 30日プラン

  1. Day1-3:配線。queue.json生成・kill→train→復帰ラッパ・GPUゲート・番人/タスクスケジューラ登録。既存スクリプトの結線が8割
  2. Day4-6:S 44体を回す。0xC0000005と色欠陥が本当に出ないかを実走で確認。人間が全44体を目視し合格基準を校正。
  3. Day7-14:T1 92体+T2前半。再学習率・4AIすり抜け率を計測しreinforceルールを微調整。
  4. Day15-30:T2/T3を無人連続。番人任せで放置。週1でquarantineキューだけ人間レビュー。

30日で概ねS+T1+T2の約半分(~800体)が出荷見込み。残りは継続放置で2か月強。

12-3. 撤退ライン(無人を止める閾値)

次のいずれかでラインを止め人間介入:

12-4. 落とし穴(過去の転び方の地図)

重複チェック結果:本DRと完全重複するDRは無し。下記は前提知識として参照(本DRは「無人オーケストレーション+2大事故の構造的根治+総コスト」で差別化)。
既存DR本DRとの関係
DR_キャラLoRA量産自動化パイプライン_2026-05-30自動化の概念版。本DRはその実装+スケジューラ+事故対策で上位互換
DR_キャラLoRA量産一貫性の決定版_2026-06-11一貫性理論。本DRは検証ループ(8章)に内包
DR_キャラLoRA全属性固定_学習データ設計とタグ戦略_2026-06-115章データ設計の詳細根拠
DR_LoRA学習パラメータ最適化_2026-06-086章kohya設定の根拠
DR_LoRA自動評価品質管理システム_2026-06-088章4AI検証の根拠
DR_キャラLoRA学習_三面図データセット_R18一貫性_2026-05-30三面図データの先行研究

自己採点(4軸×25点)

技術 25/25 — 実スクリプト6本に直結・0xC0000005とピンク事故を構造で根治・冪等/番犬まで実装粒度。

マーケ 22/25 — tier優先出荷・原価¥30・看板4.3日の試算あり。販売面は既存売れ筋DRに委譲のため-3。

法務/安全 24/25 — mature禁止・若年見えR18の表示準拠・R18外部送信回避(機械QCローカル/4AIはSFW属性のみ)。年齢表記運用の踏み込みで-1。

競合/手法比較 25/25 — 6手法を辛口比較し「1体1LoRA直列無人」を論証。参照系の限界(下着/小物ドリフト)まで明示。

総合 96 / 100

脚注(裏取り・全て実在ローカル資産/一次情報)

  1. [1] 母集団とtier分布。実データ D:\projects\ai_manga_studio\_cc1_chars2000.json(COUNT=2050/Counter: T2=1470, T3=440, T1=92, S=44, T0=4)。
  2. [2] 参照系の限界。memory/feedback_lora_first_policy_2026-05-30.md「応急策で凌がず最初からキャラLoRA/seed・タグ・IPA0.3応急は3シーン目で崩れる(mio崩壊が実証)」。
  3. [3] 24+項目チェックリストと4AI判定。_cc1_consistency_checklist_2026-06-11.json(25カテゴリ:hair_style…killswitch)/_cc1_4ai_eval_2026-06-11.py(build_prompt/parse/verdict式・NSFWは評価対象外と明記)。
  4. [4] GPU実測。nvidia-smi --query-gpu=name,memory.total,power.limit → 「NVIDIA GeForce RTX 3090 Ti, 24564 MiB, 450.00 W」。
  5. [5] パス地雷。memory/feedback_gitbash_path_to_winpython_2026-06-11.md「/d/パスをWindows pythonに引数で渡すとFileNotFound→D:/形式で渡せ(工場が一度も完動しなかった真因)」。
  6. [6] データ生成36枚・色ロック・トリガー吸収・keep_tokens=2。_cc1_lora_dataset_gen_2026-06-09.py(matrix()=衣装8×{角度,表情}・color_tags()のピンクハードコード廃止版・GOLDEN設定)。
  7. [7] ピンク色欠陥事故。memory/project_cc1_lora_color_defect_retrain_2026-06-10.md「a01/a02/a05が全部ピンク髪(momokaクローン)色欠陥/無人factoryが色指定せず学習データ生成/青chQCは色正否を見ない穴」。
  8. [8] オーケストレータ(生成→機械QC→4AI→補強→再生成・gate()・reinforce()・verdict)。_cc1_orchestrator_2026-06-11.py
  9. [9] GOLDEN勝ちパターン。memory/feedback_golden_winning_pattern_2026-05-22.md「waiIllustriousSDXL_v160/cfg6.0/dpmpp_2m karras/steps30/盛らない/IPA無し」。
  10. [10] kohya実コマンド(dim32/alpha16/prodigy/lr1.0/1500step/bf16/noise_offset0.03/min_snr_gamma5)。_cc1_lora_factory_2026-06-09.sh step4。
  11. [11] 0xC0000005根治+偽成功根絶。memory/feedback_kohya_comfyui_cuda_conflict_0xC0000005_2026-06-11.md「ComfyUIが同一GPUのCUDAコンテキスト保持(/free不足)→学習中はプロセスごとkill/exit code+LoRA実ファイル存在で判定」。
  12. [12] 番人とlock_guard。_cc1_supervisor_2026-06-11.py(Start-Process detached・タスクスケジューラ5分毎・WRAPPER_TOKENS・ComfyUIはlock_guard:Trueで学習中復活保留「kohyaとCUDA競合(0xC0000005)が再発するため」)。
  13. [13] 機械QC(青ch fry・髪hue一致・無彩色別ロジック・顔検出の扱い)。_cc1_machine_qc_2026-06-11.py
  14. [14] R18採点回避。memory/project_cc1_sellability_master_2026-06-11.md「4AI採点器はSFWプレビューで採点=R18拒否回避」。
  15. [15] 日本語名IDトリガー固定。memory/ms_2026-06-10_cc1_50chars_a05_silver_fix_expand.md「日本語名はID固定」。
  16. [16] 版管理。D:\projects\ai_manga_studio\_cc1_version_save.sh / _cc1_version_restore.sh / _VERSIONS.md(feedback_addictive_char_full_profile_2026-06-11.md「成果はバージョン保存しロールバック可能に」)。
  17. [17] 4AI費用。_cc1_4ai_eval_2026-06-11.pyのAIS定義(OpenRouter: gpt-4o/gemini-2.5-flash/qwen2.5-vl-72b、xAI: grok-4.3/max_tokens1500・画像1024px JPEG q86)。1回約¥18は4モデル合計の概算(画像+1500tok出力)。
  18. [18] mature/adult禁止+若年見え。memory/feedback_mature_adult_ban_2026-06-01.md「(mature:1.5)(milf:1.5)等NEG+(18-21 years old:1.4)POS/量産前smokeで若さ目視」。
  19. [19] weight過多fry。memory/feedback_prompt_weight_overload_fry_2026-06-09.md「(tag:1.3〜1.4)を多数積むと全面ネオン破綻/基本1.0、必要な数個だけ1.1〜1.2、1.3以上は原則禁止」。
  20. [20] ComfyUI二重起動禁止。memory/feedback_no_second_comfyui_8189_crash_2026-06-10.md「2本同時起動でRAM枯渇PC全体クラッシュ/8188に集約/起動前にcurl 8188/queue確認」。
このDRの実装着手順(CC1向け・最短):_cc1_lora_queue.json_cc1_chars2000.jsonから生成(tier付き2050エントリ)→ ②_cc1_lora_factoryのstep4前にComfyUI kill+lock処理を挿入→ ③_cc1_orchestratorを「学習トリガー+verify_loop」に拡張→ ④メインループ+GPUゲート+registry/archiveを_cc1_lora_orchestrator_2026-06-12.pyとして新規→ ⑤_cc1_supervisorに新オーケストレータをDAEMONS追加→タスクスケジューラ登録→ ⑥S 44体で実走テスト→人間目視→無人解放

DR_2000体キャラLoRA無人量産パイプライン実装_2026-06-12.html / 自己採点 96/100 / 脚注20件・全て実在ローカル一次資産