diff options
| author | tanaka takashi <isazaka@gmail.com> | 2026-10-14 02:21:50 +0900 |
|---|---|---|
| committer | tanaka takashi <isazaka@gmail.com> | 2026-10-14 02:21:50 +0900 |
| commit | 583a56f1ac3d9be9ce2f8c1715d77423347d4a4e (patch) | |
| tree | ec2789b91bfa4cfded83fa64adf044347926ecbf /README.md | |
| parent | 213e738140859dbcc12c2540ce40d6b6d2875aa7 (diff) | |
stdio MCPのツール一覧取得でも、受付開始前にModelManagerがSD本体・
外部VAE・LoRAをロードし、CUDAへ転送していた。画像生成しない通常の
質問でもこの起動コストが発生するため、有効な生成要求の実行時まで
モデル初期化を遅らせ、一覧取得時の不要な遅延とVRAM消費を除去する。
実装:
- ModelManagerの構築時は未ロード状態とし、冪等なload()を追加する。
- 初期化ロックで二重ロードを防ぎ、成功時だけモデルを保持する。
失敗時は未ロード状態を維持し、次の要求で再試行できるようにする。
- 3種類の生成メソッドからload()を呼び、既存サービスの入力検証・
生成ロックを経由したワーカースレッド内で初期化する。
- ControlNetと前処理モデルの既存の遅延ロード・モデル共有を維持する。
- 起動・設定読み込みと実際のモデルロードのログを分離し、ロードの
開始・完了・失敗をstderrへ出力する。
- benchmarkの計測区間で明示的にload()を呼び、ロード時間とVRAMの
計測の意味を維持する。READMEにロードタイミングと確認手順を追記する。
変更範囲:
- stdioのプロセス起動・終了方式を維持し、常駐化やHTTP切り替え、
チャット側の接続管理・一覧キャッシュ・アイドル解放は追加しない。
- MCPスキーマ、設定形式、CLI引数、プロンプト・seed処理、scheduler、
生成サイズ、PNGメタデータ・保存仕様は変更しない。
- 設定とモデルファイルの存在確認は起動時に残し、モデル互換性・
CUDA・推論依存関係のエラー検出は初回生成時へ移す。
- 同一プロセス内ではモデルを再利用し、終了時に解放する。
別の生成プロセスでの再ロードは引き続き許容する。
回帰テスト:
- 修正前の既存69件に対し、修正後は追加18件を含む87件すべて成功。
既存テストと期待値は変更していない。
- CLI/stdioでの一覧取得時にモデルロードと推論ライブラリのimportを
禁止しても成功することを確認する。
- 全生成方式の初回ロード、ワーカースレッド実行、同時要求、冪等性、
不正入力・無効なControlNet指定、失敗後の再試行、ログを検証する。
- ruff check .は成功、pyrightは0 errors / 0 warnings。
実GPU・stdioでの確認:
- 現在の設定(外部VAE、2件のLoRA、LCM、6 steps)を維持して計測した。
- 起動から一覧取得までの時間は8.233秒から0.671秒に短縮した。
- 一覧取得前後のGPU全体の使用量は修正前808→3233 MiBに対し、
修正後682→682 MiBで増加しなかった。
- 同じ接続で2枚生成してもベースモデルのロードは1回で、一覧取得では
0回だった。ロード時間は7.812秒で、初回生成要求に移った。
- 同じ設定・プロンプト・seedによる修正前後の画像は画素が完全一致。
PNG形式・寸法・メタデータと、返却PNGおよび保存PNGの一致を確認した。
- 最終版スクリプトでの再確認でも一覧取得0.655秒、初回生成14.089秒、
2枚目1.221秒で、画素・保存結果の一致と生成プロセス終了を確認した。
- 通常質問の親アプリの処理経路でも、LLMのみをスタブ化し、実際の
設定済みuvコマンドで一覧取得・3ツールの登録を確認した。
- 計測スクリプトと詳細な検証報告を追加する。生のJSON・stderr・PNGは
gitignore対象のdata/verification-lazy-loadに保存する。
確認の限界:
- Windowsのプロセス別VRAMはN/Aのため、GPU全体の使用量・プロセス一覧・
tasklistによる終了確認で評価した。全体値には他プロセスの変動がある。
- 計測値は単一セッションの観測であり、統計的な速度保証ではない。
- ブラウザ操作と実LLMを含むチャット全体、および現在の設定で無効な
ControlNetの実GPU生成は未実施。誘導生成・Inpaintのロード順は
スタブを用いた自動テストで確認した。
Diffstat (limited to 'README.md')
| -rw-r--r-- | README.md | 21 |
1 files changed, 20 insertions, 1 deletions
@@ -40,7 +40,7 @@ positiveは`base, user`の順でカンマ区切り、negativeは`base\nuser`のé モデルは `<root>/checkpoints`、`vae`、`lora`、`controlnet` からだけ読み込みます。 VAE componentは生成に常に必要です。`model.vae`を省略した場合はcheckpoint内蔵VAEを使い、 -指定した場合だけ外部VAEへ置き換えます。設定されたLoRAは起動時にすべてロードされ、3つの +指定した場合だけ外部VAEへ置き換えます。設定されたLoRAは初回生成時にすべてロードされ、3つの 生成ツールに共通して適用されます。MCP呼び出しごとのLoRA切替には対応しません。 Depth/Openpose の annotator 重みは `controlnet_aux` のローカルキャッシュに事前配置して ください。推論時のダウンロードは行いません。 @@ -53,6 +53,25 @@ GPU を使わないテストは `uv run pytest`、lint は `uv run ruff check .` `uv run pyright` で実行できます。実モデルの smoke test は環境依存のため自動テストには 含めていません。 +起動・MCP初期化・ツール一覧取得では画像モデルをロードせず、CUDAを初期化しません。 +設定とモデルファイルの存在は起動時に確認し、有効な生成要求の実行時にSD本体・VAE・LoRAを +ワーカースレッドでロードします。モデル互換性やCUDAのエラーは初回生成時に返されます。 +同一プロセスではロード済みモデルを再利用し、stdioプロセスの終了で解放します。 +一覧取得と生成を別プロセスで行うクライアントでは、生成プロセスごとのロードが必要です。 + +実際のCLI/stdio経路の一覧取得とVRAMを確認するには次を実行します(常駐化は不要です)。 + +```powershell +uv run python script\smoke_stdio.py --config data\config.toml ` + --result data\verification-lazy-load\list.json +``` + +`--images 2`を追加すると、固定seedで同じ接続から2枚生成し、PNG、画素ハッシュ、時間、 +PNGメタデータ、stderr、生成前後とプロセス終了後の`nvidia-smi`結果を記録します。 +seed固定は確認スクリプト内だけに適用され、製品のMCPスキーマやseed処理は変えません。 +要求の待機上限は`--timeout`で指定します(既定300秒)。Windowsでプロセス別VRAMが +`N/A`の場合は取得不能として扱い、GPU全体の使用量とプロセスの終了も確認してください。 + 実GPUとMCP経路を使う`generate_image` smoke testは次のように実行できます。 ```powershell |
