Skip to content

AI: Intel GPU と CUDA を常駐プロセスで共存させるプロバイダ別推論ルーティング #686

Description

@hmjn023

概要

solid-imager 側で、推論プロバイダごとに常駐 worker process を起動し、通常のインタラクティブ推論とバッチ推論を別の ONNX Runtime へルーティングできるようにする。

想定する利用形態:

  • 通常の画面操作・単発推論: 内蔵 Intel GPU / OpenVINO
  • バッチタグ付け・大量の CCIP 抽出: NVIDIA GPU / CUDA

背景

現在は server プロセス内で一つの RustAiClientdghs-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 またはアプリケーション管理ディレクトリへ配置されている必要がある。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions