概要
solid-imager 側で、推論プロバイダごとに常駐 worker process を起動し、通常のインタラクティブ推論とバッチ推論を別の ONNX Runtime へルーティングできるようにする。
想定する利用形態:
- 通常の画面操作・単発推論: 内蔵 Intel GPU / OpenVINO
- バッチタグ付け・大量の CCIP 抽出: NVIDIA GPU / CUDA
背景
現在は server プロセス内で一つの RustAiClient と dghs-imgutils-rs を共有している。
apps/server/src/infrastructure/ai/rust-ai-client.ts:54
apps/server/src/infrastructure/bootstrap.ts:85
packages/core/src/domain/interfaces/ai-client.ts:8
apps/server/src/infrastructure/jobs/tagging-jobs.ts:50
apps/server/src/infrastructure/jobs/job-worker.ts:50
ONNX Runtime の core library はプロセス内でグローバル状態を持つため、OpenVINO 用と CUDA 用の異なる libonnxruntime.so を同じ Bun プロセスへ読み込む構成は安全にサポートできない。
一方、Bun.spawn で別 OS process として起動すれば、worker ごとに異なる ORT_DYLIB_PATH / LD_LIBRARY_PATH を設定できる。統合 ONNX Runtime をビルドしなくても、アプリケーションレベルではプロバイダを切り替えられる。
この Issue の対象は solid-imager 側のプロセス管理・ルーティングであり、dghs-imgutils-rs の API 変更や統合 ONNX Runtime のビルドは対象外とする。
実装方針
- プロバイダごとの常駐 worker manager / pool を追加する
- worker は推論リクエストごとではなく、必要時に一度だけ
Bun.spawn する
- IPC で request id、操作種別、ファイルパス、device 情報を送受信する
- 画像本体は IPC で毎回コピーせず、既存の path API と一時ファイルを利用する
- タグ結果・CCIP embedding などの結果だけを IPC で返す
- worker ごとに専用の Runtime path と環境変数を設定する
- Intel/OpenVINO worker
- CUDA worker
- 通常の AI API と batch job が異なる worker を選択できるよう、現在の単一
IAiClient 共有構造に provider/profile routing を追加する
- worker 単位でキューと concurrency を管理し、バッチ処理が画面操作を待たせないようにする
- timeout、キャンセル、server shutdown、worker の異常終了を処理する
- native crash で worker が終了した場合は、in-flight request を失敗させて worker を再起動可能にする
- Runtime が見つからない場合は、選択した provider と探索済みパスを含む診断可能なエラーを返す
受け入れ条件
- Intel GPU worker と CUDA worker を同時に起動できる
- Intel GPU を使う単発推論中に CUDA の batch tagging を実行できる
- batch tagging の provider を明示的に CUDA へ指定できる
- 推論ごとに process を spawn せず、worker とモデルを再利用する
- IPC で大きな画像バッファを常時複製しない
- CUDA/OpenVINO worker の片方が native crash しても server 本体は終了しない
- worker の再起動後、後続ジョブを処理できる
- worker 未設定・Runtime 未導入時に既存の単一プロセス構成または明確なエラーへフォールバックできる
- unit test で routing、queue、timeout、再起動を検証する
- 実環境で Intel GPU の単発推論と NVIDIA GPU の batch tagging を確認する
非対象
- OpenVINO と CUDA を含む統合 ONNX Runtime のビルド
- 一つの process に複数の ONNX Runtime core をロードする実装
- 推論一回ごとの process 起動
- CUDA/OpenVINO の共有ライブラリそのものの配布パッケージ作成
備考
CUDA 用と OpenVINO 用の Runtime は、同一の /usr/lib/libonnxruntime.so を上書きしないよう、別 prefix またはアプリケーション管理ディレクトリへ配置されている必要がある。
概要
solid-imager 側で、推論プロバイダごとに常駐 worker process を起動し、通常のインタラクティブ推論とバッチ推論を別の ONNX Runtime へルーティングできるようにする。
想定する利用形態:
背景
現在は server プロセス内で一つの
RustAiClientとdghs-imgutils-rsを共有している。apps/server/src/infrastructure/ai/rust-ai-client.ts:54apps/server/src/infrastructure/bootstrap.ts:85packages/core/src/domain/interfaces/ai-client.ts:8apps/server/src/infrastructure/jobs/tagging-jobs.ts:50apps/server/src/infrastructure/jobs/job-worker.ts:50ONNX Runtime の core library はプロセス内でグローバル状態を持つため、OpenVINO 用と CUDA 用の異なる
libonnxruntime.soを同じ Bun プロセスへ読み込む構成は安全にサポートできない。一方、
Bun.spawnで別 OS process として起動すれば、worker ごとに異なるORT_DYLIB_PATH/LD_LIBRARY_PATHを設定できる。統合 ONNX Runtime をビルドしなくても、アプリケーションレベルではプロバイダを切り替えられる。この Issue の対象は solid-imager 側のプロセス管理・ルーティングであり、dghs-imgutils-rs の API 変更や統合 ONNX Runtime のビルドは対象外とする。
実装方針
Bun.spawnするIAiClient共有構造に provider/profile routing を追加する受け入れ条件
非対象
備考
CUDA 用と OpenVINO 用の Runtime は、同一の
/usr/lib/libonnxruntime.soを上書きしないよう、別 prefix またはアプリケーション管理ディレクトリへ配置されている必要がある。