IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 富士通株式会社の特許一覧

特開2022-187116多重制御プログラム、情報処理装置および多重制御方法
<>
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図1
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図2
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図3
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図4
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図5
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図6
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図7
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図8A
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図8B
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図9
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図10
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図11
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図12A
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図12B
  • 特開-多重制御プログラム、情報処理装置および多重制御方法 図13
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2022187116
(43)【公開日】2022-12-19
(54)【発明の名称】多重制御プログラム、情報処理装置および多重制御方法
(51)【国際特許分類】
   G06F 9/48 20060101AFI20221212BHJP
【FI】
G06F9/48 300H
G06F9/48 300C
【審査請求】未請求
【請求項の数】6
【出願形態】OL
(21)【出願番号】P 2021094958
(22)【出願日】2021-06-07
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002147
【氏名又は名称】弁理士法人酒井国際特許事務所
(72)【発明者】
【氏名】豊永 慎也
(72)【発明者】
【氏名】鈴木 貴久
(72)【発明者】
【氏名】松倉 隆一
(57)【要約】
【課題】1台のGPUが複数の処理を多重で実行しても、処理の重複実行による処理時間の増加を抑制する。
【解決手段】推論処理にGPUを用いるサーバ1は、推論処理を実行するAIフレームワーク13から出力されるメッセージを監視する。サーバ1は、監視によって取得されるメッセージのパターンから、推論処理の中核を担うコア処理であってGPUを用いるコア処理の開始および終了のタイミングを判定する。サーバ1は、コア処理の開始のタイミングを判定した場合には、他のコア処理を実行しているプロセスがなければ、コア処理を開始し、他のコア処理を実行しているプロセスがあれば、コア処理のプロセスを識別するプロセス識別子をコア開始通知キュー218に蓄積する。
【選択図】図3
【特許請求の範囲】
【請求項1】
推論処理にGPU(Graphical Processing Unit)を用いる情報処理装置であって、
前記推論処理を実行するアプリケーションから出力されるメッセージを監視する監視部と、
前記監視部による監視によって取得されるメッセージのパターンから、前記推論処理の中核を担うコア処理であって前記GPUを用いるコア処理の開始および終了のタイミングを判定する判定部と、
前記コア処理の開始のタイミングを判定した場合には、他のコア処理を実行しているプロセスがなければ、前記コア処理を開始し、前記他のコア処理を実行しているプロセスがあれば、前記コア処理のプロセスを識別するプロセス識別子をキューに蓄積する制御部と、
を有することを特徴とする情報処理装置。
【請求項2】
前記制御部は、前記コア処理の終了のタイミングを判定した場合には、終了のタイミングを判定した前記コア処理を実行していたプロセスのプロセス識別子を前記キューから削除する
ことを特徴とする請求項1に記載の情報処理装置。
【請求項3】
前記コア処理の開始および終了の判定に用いるメッセージパターンを記憶する記憶部をさらに有し、
前記判定部は、前記記憶部に記憶されたメッセージパターンに基づいて、前記取得されるメッセージのパターンから前記コア処理の開始および終了のタイミングを判定する
ことを特徴とする請求項1または2に記載の情報処理装置。
【請求項4】
前記メッセージパターンは、前記GPUを利用する特定のメッセージを取得する場合、前記GPUを利用する特定のメッセージを実行して返り値を取得する場合、前記GPUを利用する特定のメッセージの前記GPUでの実行が完了した場合を含む
ことを特徴とする請求項1に記載の情報処理装置。
【請求項5】
GPU(Graphical Processing Unit)を用いて推論処理を実行する多重制御プログラムであって、
前記推論処理を実行するアプリケーションから出力されるメッセージを監視し、
監視によって取得されるメッセージのパターンから、前記推論処理の中核を担うコア処理であって前記GPUを用いるコア処理の開始および終了のタイミングを判定し、
前記コア処理の開始のタイミングを判定した場合には、他のコア処理を実行しているプロセスがなければ、前記コア処理を開始し、前記他のコア処理を実行しているプロセスがあれば、前記コア処理のプロセスを識別するプロセス識別子をキューに蓄積する、
処理をコンピュータに実行させる多重制御プログラム。
【請求項6】
GPU(Graphical Processing Unit)を用いて推論処理を実行する多重制御方法であって、
前記推論処理を実行するアプリケーションから出力されるメッセージを監視し、
監視によって取得されるメッセージのパターンから、前記推論処理の中核を担うコア処理であって前記GPUを用いるコア処理の開始および終了のタイミングを判定し、
前記コア処理の開始のタイミングを判定した場合には、他のコア処理を実行しているプロセスがなければ、前記コア処理を開始し、前記他のコア処理を実行しているプロセスがあれば、前記コア処理のプロセスを識別するプロセス識別子をキューに蓄積する
処理をコンピュータが実行する多重制御方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、多重制御プログラムなどに関する。
【背景技術】
【0002】
近年、GPU(Graphical Processing Unit)を使ってAI(Artificial Intelligence)処理を実行するシステムが増加している。例えば、映像のAI処理により物体検知等を行うシステムがある。
【0003】
このようなシステムでは、1台のGPUが1台のカメラから転送される映像を処理していたが、映像は一定周期で送られるため、処理の隙間でGPUが空く時間が生じる。そこで、1台のGPUが複数台のカメラから転送される映像を収容して処理することで、相互に隙間を埋めて効率よく利用することが期待される。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開平10-301793号公報
【特許文献2】特開2019-121185号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、1台のGPUが複数の処理を多重で実行すると、処理同士の干渉により処理時間が増加する場合がある。
【0006】
ここで、処理同士の干渉により処理時間が増加する場合について、図13を参照して説明する。図13は、処理同士の干渉による処理時間の増加を説明する図である。図13に示すように、1台のGPUは、複数のタスクを多重で処理することが可能である。ここでは、タスクの処理は、映像の推論処理であり、4個の処理が並列で実行されている。
【0007】
GPUは、単体で映像の推論処理を実行する場合には、予め定められた一定周期で推論処理を実行する。ところが、GPUが、4並列で映像の推論処理を実行する場合には、推論処理同士が干渉してしまい、処理時間が増加する場合がある。処理時間の増加の程度は、推論処理の内容や重なり方によって異なる。例えば、推論処理間の重なりが大きく、推論処理の重なる数が多い方が、処理時間の増加の程度は大きくなる。推論処理の開始タイミングは別々であるため、偶々開始が近い推論処理が多いと、推論処理の重なる数が多くなり、処理時間の増加の程度が大きくなり、推論処理の処理時間が一定周期を超過してしまう。すなわち、処理同士の干渉により処理時間が増加してしまう。
【0008】
本発明は、1つの側面では、1台のGPUが複数の処理を多重で実行しても、処理の重複実行による処理時間の増加を抑制することを目的とする。
【課題を解決するための手段】
【0009】
1つの態様では、情報処理装置は、推論処理にGPU(Graphical Processing Unit)を用いる情報処理装置であって、前記推論処理を実行するアプリケーションから出力されるメッセージを監視する監視部と、前記監視部による監視によって取得されるメッセージのパターンから、前記推論処理の中核を担うコア処理であって前記GPUを用いるコア処理の開始および終了のタイミングを判定する判定部と、前記コア処理の開始のタイミングを判定した場合には、他のコア処理を実行しているプロセスがなければ、前記コア処理を開始し、前記他のコア処理を実行しているプロセスがあれば、前記コア処理のプロセスを識別するプロセス識別子をキューに蓄積する制御部と、を有する。
【発明の効果】
【0010】
1実施態様によれば、1台のGPUが複数の処理を多重で実行しても、処理の重複実行による処理時間の増加を抑制することが可能となる。
【図面の簡単な説明】
【0011】
図1図1は、多重制御を実行するサーバの参考例を示す図である。
図2図2は、実施例に係る多重制御を実行するサーバの一例を示す図である。
図3図3は、実施例に係るサーバの機能構成の一例を示す図である。
図4図4は、パス-モデル対応表の一例を示す図である。
図5図5は、推論回数DBの一例を示す図である。
図6図6は、コア開始通知キューの一例を示す図である。
図7図7は、遷移パターンDBの一例を示す図である。
図8A図8Aは、GPUでの実行完了の監視を説明する図(1)である。
図8B図8Bは、GPUでの実行完了の監視を説明する図(2)である。
図9図9は、実施例に係る状態管理部のフローチャートの一例を示す図である。
図10図10は、サーバのハードウェア構成の一例を示す図である。
図11図11は、実施例に係るサーバの各モジュール単位のシーケンスの一例を示す図である。
図12A図12Aは、複数プロセスの推論のシーケンスの一例を示す図(1)である。
図12B図12Bは、複数プロセスの推論のシーケンスの一例を示す図(2)である。
図13図13は、処理同士の干渉による処理時間の増加を説明する図である。
【発明を実施するための形態】
【0012】
以下に、本願の開示する多重制御プログラム、情報処理装置および多重制御方法の実施例を図面に基づいて詳細に説明する。なお、本発明は、実施例により限定されるものではない。
【0013】
[多重制御を実行するサーバ]
まず、1台のGPUが複数の推論処理を多重で実行する場合における多重制御を実行するサーバの参考例を、図1を参照して説明する。図1は、多重制御を実行するサーバの参考例を示す図である。サーバ8は、例えば動画像(映像)に関し、推論処理するプロセス80をGPU(Graphics Processing Unit)87を用いて実行する。サーバ8は、1台のGPU87上で複数のプロセス80を実行することを想定する。ここでいう推論処理するプロセス80とは、例えば、映像から不審者を推定したり、交通量を推定したりするアプリケーションのことをいう。プロセス80は、CUDA(Compute Unified Device Architecture)85の所定のライブラリを組み込み、推論モデルを用いて推論処理を実行する。
【0014】
推論処理は、3つのフェーズを含む。3つのフェーズは、前処理、畳込み処理および後処理であり、各処理の特性は異なる。前処理は、例えば、データソース等の処理データを用意するCPU処理と、CPUからGPU87へデータを転送するデータ転送処理とを含む。畳込み処理は、例えば、ディープラーニングの中核部分である、GPU87を利用したデータ処理であり、畳込みニューラルネットワーク(Convolutional neural network)を用いて実行される。後処理は、例えば、GPU87からCPUへ処理結果を転送するデータ転送処理と処理結果を取り出して加工するCPU処理とを含む。なお、畳込み処理のことを、以降、コア処理またはGPU処理というものとする。
【0015】
サーバ8は、複数の推論処理を同時に行う際に、コア処理が重複して実行されないように実行タイミングを制御する。例えば、サーバ8は、直前に実行された推論処理の開始時刻から閾値以上遅らせて後続の他のアプリケーションの推論処理を開始させる。
【0016】
ここでいう推論処理するプロセス(推論プロセス)80は、アプリケーション81、Wrapper部82、AIフレームワーク83およびCUDA(Compute Unified Device Architecture)85を含む。サーバ8は、アプリケーション81とAIフレームワーク83との間のWrapper部82と別のプロセス90で実行するスケジューラ部91とのインターフェースを利用して、GPU87を利用したコア処理の実行タイミングを制御する。
【0017】
AIフレームワーク83は、推論を実行するためのライブラリであり、CUDA85のライブラリを使うためのGPU処理(コア処理)を呼び出す。CUDA85は、GPU87を使うためのライブラリである。GPUドライバ86は、GPU87を動かすためのソフトウェアである。
【0018】
アプリケーション81は、推論モデルのモデルロードの開始をWrapper部82に要求したり、各フレームの推論をWrapper部82に要求したりする。
【0019】
Wrapper部82は、アプリケーション81からの推論要求を受け付けると、スケジューラ部91からの指示に基づいて、推論処理を実行すべく、AIフレームワーク83に推論処理を実行させる。
【0020】
スケジューラ部91は、複数の推論プロセス80を多重で実行させる場合には、所定の閾値だけ後続の推論プロセスの開始タイミングを遅延させるべく、後続の推論プロセス80のWrapper部82に推論開始を指示する。所定の閾値は、一例では、推論プロセス80で使用される推論モデルが同じである場合には、畳込み処理(コア処理)のフェーズの処理時間の値を示す。推論モデルが同じであれば、畳込み処理の処理時間は略同じとなるからである。別の例では、所定の閾値は、推論プロセス80で使用される推論モデルが異なる場合には、前処理と畳込み処理(コア処理)とを加算した処理時間の値を示す。
【0021】
所定の閾値は、事前に、計測されたり、ベンチマークなどで調査されたりして、プロファイル情報92に記憶される。そして、スケジューラ部91が、2つの推論プロセス80が近いタイミングで実行される場合には、プロファイル情報92を参照して推論モデルに対応する所定の閾値を取得する。そして、スケジューラ部91は、先行の推論プロセス80の開始タイミングから所定の閾値だけ後続の推論プロセス80の開始タイミングを遅延させて開始指示することで、干渉による処理時間の増加を抑制することができる。
【0022】
ところが、参考例で説明したサーバ8は、コア処理の干渉による処理時間の増加を抑制することができるが、所定の閾値を求めるための事前調査にかかるコストが大きいという問題がある。そこで、以降で説明する実施例では、事前調査にかかるコストを不要とし、コア処理の干渉による処理時間の増加を抑制する場合を説明する。
【実施例0023】
図2は、実施例に係る多重制御を実行するサーバの一例を示す図である。実施例に係るサーバ1は、コア処理を呼び出すメッセージ(命令)を監視し、メッセージパターンから推論処理のコア処理の開始、終了のタイミングを判別する。そして、サーバ1は、コア処理を実行しているプロセスがなければ推論処理を開始し、実行中のプロセスがあれば開始通知を待機させる。
【0024】
ここでいう推論処理するプロセス(推論プロセス)10は、アプリケーション11、第1のWrapper部12、AIフレームワーク13、第2のWrapper部14およびCUDA15aを含む。サーバ1は、AIフレームワーク13とCUDA15aとの間の第2のWrapper部14を利用して、コア処理を呼び出すメッセージ(命令)を監視し、メッセージパターンから推論処理のコア処理の開始、終了のタイミングを判別する。
【0025】
AIフレームワーク13は、推論を実行するためのライブラリであり、第2のWrapper部14に対して、CUDA15aのライブラリを使うためのGPU処理(コア処理)を呼び出す。CUDA15aは、GPU17を使うためのライブラリである。GPUドライバ16は、GPU17を動かすためのソフトウェアである。
【0026】
アプリケーション11は、推論モデルのモデルロードの開始を第1のWrapper部12に要求したり、各フレームの推論を第1のWrapper部12に要求したりする。
【0027】
第1のWrapper部12は、アプリケーション11からのモデルロードの開始要求に応じて、別のプロセス20で実行するスケジューラ部21にモデルロードの開始を通知するとともに、推論モデルを生成する。また、第1のWrapper部12は、アプリケーション11からの推論要求に応じて、推論開始通知とモデル名をスケジューラ部21に通知する。そして、第1のWrapper部12は、スケジューラ部21からの推論開始指示に基づいて、推論処理を開始する。
【0028】
第2のWrapper部14は、AIフレームワーク13からのGPU処理の呼び出しメッセージ(命令)をフックし、遷移パターンを用いて呼び出しメッセージのパターンから推論の状態を管理する。推論の状態には、前処理の状態、コア処理の状態、後処理の状態が挙げられる。第2のWrapper部14は、推論の状態が前処理のときにコア処理の開始の遷移パターンを判定し、推論の状態がコア処理のときにコア処理の終了の遷移パターンを判定し、推論の状態が後処理のときにはいずれも判定しない。第2のWrapper部14は、コア処理の開始を検知したとき、スケジューラ部21にコア処理の開始を通知し、スケジューラ部21からのコア処理の開始の指示を待機する。そして、第2のWrapper部14は、スケジューラ部21からコア処理の開始指示を受信したとき、コア処理のGPU利用を開始する。また、第2のWrapper部14は、コア処理の終了を検知したとき、スケジューラ部21にコア処理の終了を通知し、後続の後処理を続行する。
【0029】
スケジューラ部21は、第1のWrapper部12から初回の推論開始通知を受信すると、第1のWrapper部12に推論開始指示を送信する。スケジューラ部21は、第1のWrapper部12から二回目以降の推論開始通知を受信すると、第2のWrapper部14に状態管理を初期化させ、第2のWrapper部14から状態管理初期化通知を受信すると、第1のWrapper部12に推論開始指示を送信する。
【0030】
また、スケジューラ部21は、第2のWrapper部14からコア処理の開始通知を受信すると、他にコア処理を実行している推論プロセス10がなければ、第2のWrapper部14にコア処理の開始を指示する。スケジューラ部21は、他にコア処理を実行している推論プロセス10があれば、当該推論プロセス10のプロセスIDを蓄積する。そして、スケジューラ部21は、第2のWrapper部14からコア処理の終了通知を受信すると、プロセスIDが蓄積されていれば、蓄積されたプロセスIDのうち一つのプロセスIDが示す推論プロセス10の第2のWrapper部14にコア処理の開始を指示する。
【0031】
[サーバの機能構成の一例]
このような多重制御を実行するサーバ1の機能構成の一例を、図3を参照して説明する。図3は、実施例に係るサーバの機能構成の一例を示す図である。図3に示すように、サーバ1は、推論処理を行うプロセス10と、プロセス10と異なるプロセス20とを有する。推論処理を行うプロセス10は、複数存在する。また、サーバ1は、GPUドライバ16と、GPU17とを有する。
【0032】
プロセス10は、アプリケーション11、第1のWrapper部12、AIフレームワーク13、第2のWrapper部14およびCUDAライブラリ15を有する。プロセス20は、スケジューラ部21を有する。なお、CUDAライブラリ15は、図2で示したCUDA15aと同義である。
【0033】
第1のWrapper部12は、モデルロードフック部121、モデル識別部122、フック用モデル生成部123、プロセス間通信部124、パス-モデル対応表125およびフック用モデル126を有する。
【0034】
モデルロードフック部121は、アプリケーション11からのモデルロード命令をフックし、モデル識別部122にモデルロード命令およびロード対象のモデルのパスを返す。
【0035】
モデル識別部122は、後述するパス-モデル対応表125とロード対象のモデルのパスから、ロード対象のモデル名を取得する。そして、モデル識別部122は、スケジューラ部21に対して、モデルロード開始通知、自身のプロセス10のプロセスID、取得したモデル名を送信する。そして、モデル識別部122は、フック用モデル生成部123にロード対象のモデルのパスを渡す。
【0036】
パス-モデル対応表125は、モデルオブジェクトが配置されているパスと、モデル名を対応付けたリスト(DB:DataBase)であり、例えば管理者によって登録される。ここで、パス-モデル対応表125の一例を、図4を参照して説明する。図4は、パス-モデル対応表の一例を示す図である。図4に示すように、パス-モデル対応表125は、パスと、モデル名とを対応付けた表である。図4の例では、パス-モデル対応表125は、csv形式であるが、これに限定されるものではない。パスは、モデルが存在するパスを示す。モデル名は、モデルの名称である。一例として、“yolo”というモデル名のモデルは、“/home/usr/models/saved_model/Yolo”のパス配下に記憶されている。
【0037】
図3に戻って、フック用モデル生成部123は、AIフレームワーク13のモデルロードAPI(APplication Interface)を利用し、ロード対象のモデルのモデルオブジェクトをロードする。そして、フック用モデル生成部123は、モデルオブジェクトにフック用モデルAPI(111)とモデル名の情報を追加して、フック用モデル126を生成する。そして、フック用モデル生成部123は、フック用モデルAPI(111)を、モデル識別部122およびモデルロードフック部121を経由してアプリケーション11に返す。
【0038】
フック用モデル126は、アプリケーション11からフック用モデルAPI(111)を用いて推論が実行されたとき、推論開始命令をフックする。そして、フック用モデル126は、推論開始通知、プロセスIDおよびモデル名をスケジューラ部21に送信して、スケジューラ部21からの指示を待機する。フック用モデル126は、スケジューラ部21からの推論開始指示を受信したとき、モデルオブジェクトを用いて推論を実行する。そして、フック用モデル126は、実行結果をアプリケーション11に返す。
【0039】
プロセス間通信部124は、自身のプロセス10における第1のWrapper部12とプロセス20におけるスケジューラ部21とのプロセス間の通信を行う。
【0040】
AIフレームワーク13は、モデルロード部131、推論実行部132およびモデルオブジェクト133を有する。
【0041】
モデルロード部131は、第1のWrapper部12の要求に応じて、ロード対象のモデルのモデルオブジェクト133を取得する。推論実行部132は、第1のWrapper部12の要求に応じて、推論を実行する。例えば、推論実行部132は、推論を実行するために、CUDAライブラリ15に対するAPIを示すCUDA APIを第2のWrapper部14に送信する。
【0042】
第2のWrapper部14は、CUDAAPIフック部141、状態管理部142、API呼び出し制御部143、プロセス間通信部144および遷移パターンDB145を有する。なお、CUDAAPIフック部141は、監視部の一例である。状態管理部142は、判定部の一例である。
【0043】
CUDAAPIフック部141は、CUDA APIをフックする。例えば、CUDAAPIフック部141は、AIフレームワーク13からのCUDA APIをフックすると、状態管理部142にCUDA APIおよび引数を渡す。
【0044】
状態管理部142は、推論状態を管理する。
【0045】
例えば、状態管理部142は、スケジューラ部21からモデル名を含む状態管理初期化指示を受信したとき、後述する遷移パターンDB145からモデル名に対応する遷移パターンをロードし、状態管理用の内部変数を初期化する。そして、状態管理部142は、状態管理初期化完了通知をスケジューラ部21に送信する。ここでいう遷移パターンDB145は、遷移パターンを保持するDBであり、例えば管理者によって登録される。遷移パターンには、モデル名、コア開始パターン、コア終了パターンの情報が含まれる。なお、遷移パターンDB145の説明は、後述する。
【0046】
また、状態管理部142は、ロードした遷移パターンに基づき、CUDA APIがフックされた際に渡されるCUDA APIおよび引数から状態等の内部変数を更新する。ここでいう状態は、現在の状態のことをいい、前処理の状態、コア処理の状態、後処理の状態が含まれる。一例として、遷移パターンに示される遷移条件にCUDA APIを実行した時の返り値が含まれる場合には、状態管理部142は、CUDAライブラリ15にCUDA API実行命令を送信して、実行命令に対する返り値に基づいて状態等の内部変数を更新する。例えば、状態管理部142は、実行命令に対する返り値を受信すると、状態を、前処理からコア処理に更新する。
【0047】
また、状態管理部142は、ロードした遷移パターンに基づき、コア開始パターンを検知した場合には、スケジューラ部21にコア開始通知および自身のプロセス10のプロセスIDを送信する。この後、状態管理部142は、内部変数の更新時に、CUDA APIが実行されていない場合には、API呼び出し制御部143にCUDA APIおよび引数を渡す。状態管理部142は、内部変数の更新時に、既にCUDA APIが実行されている場合には、API呼び出し制御部143にCUDA APIの実行に対応する返り値を渡す。
【0048】
また、状態管理部142は、ロードした遷移パターンに基づき、コア終了パターンを検知した場合には、スケジューラ部21にコア終了通知および自身のプロセス10のプロセスIDを送信する。この後、状態管理部142は、内部変数の更新時に、CUDA APIが実行されていない場合には、CUDA APIを実行し、実行に対応する返り値を、CUDAAPIフック部141を経由してAIフレームワーク13に返す。状態管理部142は、内部変数の更新時に、既にCUDA APIが実行されている場合には、実行に対応する返り値を、CUDAAPIフック部141を経由してAIフレームワーク13に返す。
【0049】
また、状態管理部142は、コア開始、コア終了のいずれも検知しない場合には、以下の処理を行う。状態管理部142は、内部変数の更新時に、CUDA APIが実行されていない場合には、CUDA APIを実行し、実行に対応する返り値を、CUDAAPIフック部141を経由してAIフレームワーク13に返す。状態管理部142は、内部変数の更新時に、既にCUDA APIが実行されている場合には、実行に対応する返り値を、CUDAAPIフック部141を経由してAIフレームワーク13に返す。
【0050】
API呼び出し制御部143は、CUDA APIの呼び出しを制御する。例えば、API呼び出し制御部143は、状態管理部142からCUDA APIおよび引数、または、返り値を受信すると、スケジューラ部21からのコア開始指示を待機する。API呼び出し制御部143は、スケジューラ部21からコア開始指示を受信したとき、CUDA APIおよび引数を受信している場合には、当該CUDA APIを実行する。そして、API呼び出し制御部143は、実行に対応する返り値を、状態管理部142に返す。また、API呼び出し制御部143は、スケジューラ部21からコア開始指示を受信したとき、返り値を受信している場合には、状態管理部142に当該返り値を返す。
【0051】
プロセス間通信部144は、自身のプロセス10における第2のWrapper部14とプロセス20におけるスケジューラ部21とのプロセス間の通信を行う。
【0052】
スケジューラ部21は、推論回数カウント部211、処理判定部212、推論開始制御部213、状態管理初期化指示部214、コア実行スケジュール部215およびプロセス間通信部216を有する。また、スケジューラ部21は、推論回数DB217およびコア開始通知キュー218を有する。なお、コア実行スケジュール部215は、制御部の一例である。コア開始通知キュー218は、記憶部の一例である。
【0053】
推論回数カウント部211は、推論回数をカウントする。例えば、推論回数カウント部211は、第1のWrapper部12からモデルロード開始通知、プロセスIDおよびモデル名を受信すると、プロセスIDおよびモデル名の組み合わせに対し、推論回数を0回として、後述する推論回数DB217に登録する。また、推論回数カウント部211は、第1のWrapper部12から推論開始通知、プロセスIDおよびモデル名を受信すると、推論回数DB217からプロセスIDおよびモデル名の組み合わせに対応する推論回数を取得し、取得した推論回数に1加えて、推論回数DB217を更新する。そして、推論回数カウント部211は、プロセスID,モデル名、登録または更新した推論回数を処理判定部212に渡す。ここでいう推論回数DB217は、プロセスIDおよびモデル名の組み合わせごとに推論回数を保持するDBである。
【0054】
ここで、推論回数DB217の一例を、図5を参照して説明する。図5は、推論回数DBの一例を示す図である。図5に示すように、推論回数DB217は、プロセスID,モデル名および回数を対応付けて記憶する。図5の例では、推論回数DB217は、csv形式であるが、これに限定されるものではない。プロセスIDは、プロセス10を識別するIDである。モデル名は、モデルの名称である。回数は、推論回数を示す。一例として、プロセスIDが“pid1”であり、モデル名が“yolo”である場合に、推論回数として「3」と記憶している。
【0055】
図3に戻って、処理判定部212は、推論回数カウント部211からプロセスID、モデル名、推論回数を受信すると、以下の処理を行う。処理判定部212は、推論回数が「1」である場合には、推論開始指示を送信させるべく、推論開始制御部213にプロセスIDを送信する。また、処理判定部212は、推論回数が2以上である場合には、状態管理初期化指示を送信させるべく、状態管理初期化指示部214にプロセスIDおよびモデル名を送信する。そして、処理判定部212は、状態管理初期化指示部214から状態管理初期化完了通知を受信すると、推論開始指示を送信させるべく、推論開始制御部213にプロセスIDを送信する。
【0056】
状態管理初期化指示部214は、処理判定部212からプロセスIDおよびモデル名を受信すると、プロセスIDが示すプロセス10の第2のWrapper部14にモデル名を含む状態管理初期化指示を送信する。そして、状態管理初期化指示部214は、第2のWrapper部14からの応答を待機する。そして、状態管理初期化指示部214は、第2のWrapper部14から状態管理初期化完了通知を受信すると、状態管理初期化完了通知を処理判定部212に返す。
【0057】
推論開始制御部213は、処理判定部212からプロセスIDを受信すると、プロセスIDが示すプロセス10の第1のWrapper部12に推論開始指示を送信する。
【0058】
コア実行スケジュール部215は、コア処理の実行をスケジュールする。例えば、コア実行スケジュール部215は、第2のWrapper部14からコア開始通知およびプロセスIDを受信すると、以下の処理を行う。コア実行スケジュール部215は、後述するコア開始通知キュー218が空である場合には、コア処理を実行しているプロセス10がないので、プロセスIDが示すプロセス10の第2のWrapper部14にコア開始通知を送信する。そして、コア実行スケジュール部215は、コア開始通知キュー218にプロセスIDを追加する。コア実行スケジュール部215は、コア開始通知キュー218が空でない場合には、コア処理を実行中のプロセス10があるので、コア開始通知キュー218にプロセスIDを追加する。コア実行スケジュール部215は、第2のWrapper部14からコア終了通知およびプロセスIDを受信すると、コア開始通知キュー218から当該プロセスIDを削除する。そして、コア実行スケジュール部215は、コア開始通知キュー218からいずれかのプロセスIDを選択し、選択したプロセスIDが示すプロセス10の第2のWrapper部14にコア開始指示を送信する。
【0059】
ここでいうコア開始通知キュー218は、コア開始を検知したプロセス10のプロセスIDを蓄積するキューである。コア開始通知キュー218に蓄積されたプロセスIDの一つが現にコア処理を実行中のプロセス10のプロセスIDであり、それ以外に蓄積されたプロセスIDがコア処理の実行を待機しているプロセス10のプロセスIDである。ここで、コア開始通知キュー218の一例を、図6を参照して説明する。図6は、コア開始通知キューの一例を示す図である。図6に示すように、コア開始通知キュー218には、コア処理を実行中または実行を待機しているプロセスのプロセスIDが蓄積される。一例として、プロセスIDとして“pid1”、“pid2”、“pid4”および“pid3”が蓄積されている。
【0060】
プロセス間通信部216は、自身のプロセス20におけるスケジューラ部21とプロセス10とのプロセス間の通信を行う。
【0061】
ここで、遷移パターンDB145の一例を、図7を参照して説明する。図7は、遷移パターンDBの一例を示す図である。図7に示すように、遷移パターンDB145は、モデル名、コア開始パターンおよびコア終了パターンを対応付けて記憶する。図7の例では、遷移パターンDB145は、json形式であるが、これに限定されるものではない。
【0062】
符号a1、b1で示される“models”フィールドが、遷移パターンが対応するモデル名のリストである。符号a2、b2が示される“core_start”フィールドが、コア開始と判定するCUDA APIのコア開始パターンである。符号a3、b3が示される“core_end”フィールドが、コア終了と判定するCUDA APIのコア終了パターンである。
【0063】
また、“if”フィールドは、コア開始またはコア終了と判定される判定条件である。「“if”:[[A,B],[C],[D]]」である場合には、「(A and B) orC orD」であることを示す。また、「“○○_hook”」は、フックするCUDA APIが〇○であることが条件であることを示す。また、「“stream=main_stream”」は、フックするCUDA APIの引数のストリームがメインストレームと一致することが条件であることを示す。また、「“return=0”」は、CUDA APIを実行した返り値が「0」であることが条件であることを示す。また、“synchronized”は、フックしたCUDA APIのGPU17での実行が完了することが条件であることを示す。このように、遷移パターンDB145では、コア開始またはコア終了と判定される判定条件として、特定のCUDA_APIをフックしたとき、特定のCUDA_APIを実行して返り値を取得したとき、特定のCUDA_APIのGPU17での実行が完了したときの3パターンを定義することができる。
【0064】
また、“action”フィールドは、actionを起こすために用いられるフィールドである。例えば、「“main_stream=stream”」は、内部変数に含まれるメインストリーム変数に、フックしたCUDA_APIの引数のストリームの番号をセットすることを意味する。
【0065】
一例として、“models”フィールドが“resnet”または“yolo”である場合に、“core_start”フィールドとして“if”フィールドが“cuLaunchKernel_hook”と記載されている。“cuLaunchKernel_hook”は、フックするCUDA APIがcuLaunchKernelであることが条件であることを示す。加えて、“action”フィールドが“main_stream=stream”と記載されている。また、“core_end”フィールドとして“if”フィールドが[“cuMemcpyDtoHAsync_hook”,“stream=main_stream”,“synchronized”]と記載されている。
【0066】
別の例として、“models”フィールドが“cpn”である場合に、“core_start”フィールドとして“if”フィールドが“cuLaunchKernel_hook”と記載されている。“cuLaunchKernel_hook”は、フックするCUDA APIがcuLaunchKernelであることが条件であることを示す。また、“core_end”フィールドとして“if”フィールドが[“cuCtxSynchronize_hook”,“return=0”]と記載されている。「“return=0”」が記載されているので、CUDA APIを実行した返り値が「0」であることが条件であることを示す。
【0067】
ここで、遷移パターンに基づく状態管理部142の処理の一例を説明する。例えば、状態管理部142は、スケジューラ部21からモデル名を含む状態管理初期化指示を受信したとき、遷移パターンDB145からモデル名に対応する遷移パターンをロードする。遷移パターンDB145に記憶された“models”フィールドの中のモデル名と受信モデル名とが一致する遷移パターンがロードされる。そして、状態管理部142は、状態管理用の内部変数を初期化する。内部変数には、状態、メインストリーム変数、監視対象ストリーム変数、監視対象イベント変数が含まれる。状態には、前処理、コア処理、後処理の三状態が含まれ、初期化時には前処理がセットされる。そして、状態管理部142は、状態管理初期化完了通知をスケジューラ部21に送信する。
【0068】
そして、状態管理部142は、ロードした遷移パターンに基づき状態管理を開始する。現在の状態が前処理である場合には、状態管理部142は、CUDAAPIフック部141からCUDA APIと引数が渡されるたびに、コア開始パターンを識別する。具体的には、状態管理部142は、遷移パターンの“core_start”フィールドの条件を判定する。一例として、“if”フィールドに“synchronized”が含まれる場合には、“if”フィールド内のそれ以外の条件を満たすCUDA APIがフックされた時に、状態管理部142は、当該CUDA APIのGPU17での実行完了までを監視する。状態管理部142は、GPU17での実行完了を検知したとき、条件を満たしたと判定する。なお、GPU17での実行完了の監視については、後述する。また、条件に“action”フィールドが含まれる場合には、“if”フィールドの条件を満たした時に、状態管理部142は、内部変数を更新する。
【0069】
そして、状態管理部142は、コア開始パターンを検知したとき、現在の状態を前処理からコア処理に更新する。そして、状態管理部142は、API呼び出し制御部143にCUDA APIと引数を送信する。この後、状態管理部142は、スケジューラ部21にコア開始を通知する。そして、状態管理部142は、API呼び出し制御部143から返り値を受信したとき、CUDAAPIフック部141に返り値を返す。
【0070】
現在の状態がコア処理である場合には、状態管理部142は、CUDAAPIフック部141からCUDA APIと引数が渡されるたびに、コア終了パターンを識別する。具体的には、状態管理部142は、遷移パターンの“core_end”フィールドの条件を判定する。一例として、“if”フィールドに“synchronized”が含まれる場合には、“if”フィールド内のそれ以外の条件を満たすCUDA APIがフックされた時に、状態管理部142は、当該CUDA APIのGPU17での実行完了までを監視する。状態管理部142は、GPU17での実行完了を検知したとき、条件を満たしたと判定する。なお、GPU17での実行完了の監視については、後述する。
【0071】
そして、状態管理部142は、コア終了パターンを検知したとき、現在の状態をコア処理から後処理に更新する。この後、状態管理部142は、スケジューラ部21にコア終了を通知する。
【0072】
なお、状態管理部142は、上記以外のとき、CUDAAPIフック部141から渡されたCUDA APIを実行し、返り値をCUDAAPIフック部141に返す。
【0073】
ここで、GPU17での実行完了の監視について、図8Aおよび図8Bを参照して説明する。図8Aおよび図8Bは、GPUでの実行完了の監視を説明する図である。なお、図8Aでは、監視の中で“cuStreamWaitEvent”がフックされない場合を説明し、図8Bでは、監視の中で“cuStreamWaitEvent”がフックされた場合を説明する。
【0074】
図8Aに示すように、監視の中で“cuStreamWaitEvent”がフックされない場合が表わされている。まず、“if”フィールドに“synchronized”が含まれる場合には、“if”フィールド内のそれ以外の条件を満たすCUDA APIがフックされた時に、状態管理部142は、以下の処理を行う。状態管理部142は、状態管理用の内部変数としての監視対象ストリーム変数に当該CUDA APIの引数のストリーム番号をセットする。ここでは、監視対象のCUDA APIは“cuMemcpyDtoHAsync”、引数は“Stream 1”である。かかる場合には、内部変数としての監視対象ストリーム変数に引数“Stream”の“1”がセットされる。
【0075】
次に、“cuEventRecord”のCUDA APIがフックされた時、引数のストリーム番号が監視対象ストリーム変数と同じであれば、状態管理部142は、以下の処理を行う。状態管理部142は、状態管理用の内部変数としての監視対象イベントに当該CUDA APIの引数のイベント番号をセットする。ここでは、フックされるCUDA APIは“cuEventRecord”、引数は“Stream 1”および“Event 1”である。かかる場合には、引数のストリーム番号が監視対象ストリーム変数と同じであるので、内部変数としての監視対象イベント変数に引数“Event”の“1”がセットされる。
【0076】
次に、“cuEventQuery”のCUDA APIがフックされた時、引数のイベント番号が監視対象イベント変数と同じであり、当該CUDA APIの実行の返り値が「0」であれば、状態管理部142は、監視対象のCUDA APIのGPU17での実行が完了したと判定する。ここでは、フックされるCUDA APIは“cuEventQuery”、引数は“Event 1”である。かかる場合には、引数のイベント番号が監視対象イベント変数と同じであるので、実行の返り値が「0」であれば、監視対象のCUDA APIのGPU17での実行が完了したと判定される。
【0077】
図8Bに示すように、監視の中で“cuStreamWaitEvent”がフックされる場合が表わされている。まず、“if”フィールドに“synchronized”が含まれる場合には、“if”フィールド内のそれ以外の条件を満たすCUDA APIがフックされた時に、状態管理部142は、以下の処理を行う。状態管理部142は、状態管理用の内部変数としての監視対象ストリーム変数に当該CUDA APIの引数のストリーム番号をセットする。ここでは、監視対象のCUDA APIは“cuMemcpyDtoHAsync”、引数は“Stream 1”である。かかる場合には、内部変数としての監視対象ストレーム変数に引数“Stream”の“1”がセットされる。
【0078】
次に、“cuEventRecord”のCUDA APIがフックされた時、引数のストリーム番号が監視対象ストリーム変数と同じであれば、状態管理部142は、以下の処理を行う。状態管理部142は、状態管理用の内部変数としての監視対象イベント変数に当該CUDA APIの引数のイベント番号をセットする。ここでは、フックされるCUDA APIは“cuEventRecord”、引数は“Stream 1”および“Event 1”である。かかる場合には、引数のストリーム番号が監視対象ストリーム変数と同じであるので、内部変数としての監視対象イベント変数に引数“Event”の“1”がセットされる。
【0079】
次に、“cuStreamWaitEvent”のCUDA APIがフックされた時、引数のイベント番号が監視対象イベント変数と同じであれば、状態管理部142は、以下の処理を行う。状態管理部142は、状態管理用の内部変数としての監視対象ストリーム変数に引数のストリーム番号をセットする。ここでは、フックされるCUDA APIは“cuStreamWaitEvent”、引数は“Event 1”および“Stream 2”である。かかる場合には、引数のイベント番号が監視対象イベント変数と同じであるので、内部変数としての監視対象ストリーム変数に引数“Stream”の“2”がセットされる。
【0080】
次に、“cuEventRecord”のCUDA APIがフックされた時、引数のストリーム番号が監視対象ストリーム変数と同じであれば、状態管理部142は、以下の処理を行う。状態管理部142は、状態管理用の内部変数としての監視対象イベント変数に当該CUDA APIの引数のイベント番号をセットする。ここでは、フックされるCUDA APIは“cuEventRecord”、引数は“Stream 2”および“Event 2”である。かかる場合には、引数のストリーム番号が監視対象ストリーム変数と同じであるので、内部変数としての監視対象イベント変数に引数“Event”の“2”がセットされる。
【0081】
この後、引数のイベント番号が監視対象イベント変数と同じである“cuStreamWaitEvent”がフックされた時、状態管理部142は、前述した“cuStreamWaitEvent”のCUDA APIがフックされた時の処理に戻る。
【0082】
そして、“cuEventQuery”のCUDA APIがフックされた時、引数のイベント番号が監視対象イベント変数と同じであり、当該CUDA APIの実行の返り値が「0」であれば、状態管理部142は、監視対象のCUDA APIのGPU17での実行が完了したと判定する。ここでは、フックされるCUDA APIは“cuEventQuery”、引数は“Event 2”である。かかる場合には、引数のイベント番号が監視対象イベント変数と同じであるので、実行の返り値が「0」であれば、監視対象のCUDA APIのGPU17での実行が完了したと判定される。
【0083】
[状態管理部のフローチャート]
次に、実施例に係る状態管理部のフローチャートの一例を、図9を参照して説明する。図9は、実施例に係る状態管理部のフローチャートの一例を示す図である。
【0084】
状態管理部142は、スケジューラ部21から状態管理初期化指示とモデル名とを受信する(ステップS51)。状態管理部142は、遷移パターンDB145からモデル名に対応する遷移パターンを取得する。状態管理部142は、状態を前処理にセットする(ステップS52)。取得した遷移パターンには、コア開始パターンおよびコア終了パターンが含まれる。コア開始パターンには、コア開始判定条件が含まれる。コア終了パターンには、コア終了判定条件が含まれる。
【0085】
状態管理部142は、スケジューラ部21に状態管理初期化完了通知を送信する(ステップS53)。状態管理部142は、AIフレームワーク13からCUDA APIをフックする(ステップS54)。
【0086】
状態管理部142は、状態が前処理であるか否かを判定する(ステップS55)。状態が前処理であると判定した場合には(ステップS55;Yes)、状態管理部142は、コア開始判定条件に返り値が必要であるか否かを判定する(ステップS56)。例えば、コア開始判定条件に“return=0”が設定されている場合である。コア開始判定条件に返り値が必要であると判定した場合には(ステップS56;Yes)、状態管理部142は、フックしたCUDA APIを実行する(ステップS57)。
【0087】
状態管理部142は、実行した結果、コア開始判定条件を満たすか否かを判定する(ステップS58)。コア開始判定条件を満たさないと判定した場合には(ステップS58;No)、状態管理部142は、ステップS65に移行する。
【0088】
一方、コア開始判定条件を満たすと判定した場合には(ステップS58;Yes)、状態管理部142は、スケジューラ部21にコア開始を通知する。そして、状態管理部142は、返り値をAPI呼び出し制御部143に送信する(ステップS59)。そして、状態管理部142は、API呼び出し制御部143から返り値を受信して、状態をコア処理にセットする(ステップS60)。そして、状態管理部142は、ステップS65に移行する。
【0089】
一方、コア開始判定条件に返り値が必要でないと判定した場合には(ステップS56;No)、状態管理部142は、コア開始判定条件を満たすか否かを判定する(ステップS61)。コア開始判定条件を満たすと判定した場合には(ステップS61;Yes)、状態管理部142は、スケジューラ部21にコア開始を通知する。そして、状態管理部142は、フックしたCUDA APIと引数をAPI呼び出し制御部143に送信する(ステップS62)。そして、状態管理部142は、API呼び出し制御部143から返り値を受信して、状態をコア処理にセットする(ステップS63)。そして、状態管理部142は、ステップS65に移行する。
【0090】
一方、コア開始判定条件を満たさないと判定した場合には(ステップS61;No)、状態管理部142は、フックしたCUDA APIを実行する(ステップS64)。そして、状態管理部142は、ステップS65に移行する。
【0091】
ステップS65において、状態管理部142は、返り値をAIフレームワーク13に返す(ステップS65)。そして、状態管理部142は、次のCUDA APIをフックすべく、ステップS54に移行する。
【0092】
ステップS55において、状態が前処理でないと判定した場合には(ステップS55;No)、状態管理部142は、状態がコア処理であるか否かを判定する(ステップS66)。状態がコア処理であると判定した場合には(ステップS66;Yes)、状態管理部142は、コア終了判定条件に返り値が必要であるか否かを判定する(ステップS67)。例えば、コア終了判定条件に“return=0”が設定されている場合である。コア終了判定条件に返り値が必要であると判定した場合には(ステップS67;Yes)、状態管理部142は、フックしたCUDA APIを実行する(ステップS68)。
【0093】
そして、状態管理部142は、実行した結果、コア終了判定条件を満たすか否かを判定する(ステップS69)。コア終了判定条件を満たさないと判定した場合には(ステップS69;No)、状態管理部142は、ステップS74に移行する。
【0094】
一方、コア終了判定条件を満たすと判定した場合には(ステップS69;Yes)、状態管理部142は、スケジューラ部21にコア終了を通知して、状態を後処理にセットする(ステップS70)。そして、状態管理部142は、ステップS74に移行する。
【0095】
一方、コア終了判定条件に返り値が必要でないと判定した場合には(ステップS67;No)、状態管理部142は、コア終了判定条件を満たすか否かを判定する(ステップS71)。コア終了判定条件を満たすと判定した場合には(ステップS71;Yes)、状態管理部142は、スケジューラ部21にコア終了を通知して、状態を後処理にセットする(ステップS72)。そして、状態管理部142は、ステップS73に移行する。
【0096】
一方、コア終了判定条件を満たさないと判定した場合には(ステップS71;No)、状態管理部142は、ステップS73に移行する。ステップS73において、状態管理部142は、フックしたCUDA APIを実行する(ステップS73)。そして、状態管理部142は、ステップS74に移行する。
【0097】
ステップS74において、状態管理部142は、返り値をAIフレームワーク13に返す(ステップS74)。そして、状態管理部142は、次のCUDA APIをフックすべく、ステップS54に移行する。
【0098】
一方、状態がコア処理でないと判定した場合には(ステップS66;No)、状態管理部142は、フックしたCUDA APIを実行して、返り値をAIフレームワーク13に返す(ステップS75)。そして、状態管理部142は、次のCUDA APIをフックすべく、ステップS54に移行する。
【0099】
[サーバのハードウェア構成]
図10は、サーバのハードウェア構成の一例を示す図である。図10に示すように、サーバ1は、CPU31に加えてGPU32を有する。そして、サーバ1は、メモリ33、ハードディスク34およびネットワークインターフェイス35を有する。図10に示した各部は、例えばバス36で相互に接続される。
【0100】
ネットワークインターフェイス35は、ネットワークインターフェイスカード等であり、ストレージサーバ(図示しない)等の他の装置との通信を行う。ハードディスク34は、図3に示した機能を動作させるプログラムや遷移パターンDB145等を記憶する。
【0101】
CPU31は、図3に示した各処理部と同様の処理を実行するプログラムをハードディスク34等から読み出してメモリ33に展開することで、図3等で説明した各機能を実行するプロセスを動作させる。例えば、このプロセスは、サーバ1が有する各処理部と同様の機能を実行する。具体的には、CPU31は、プロセス10、プロセス20およびGPUドライバ16等と同様の機能を有するプログラムをハードディスク34等から読み出す。そして、CPU31は、プロセス10、プロセス20およびGPUドライバ16等と同様の処理を実行するプロセスを実行する。
【0102】
GPU32は、推論処理の中のGPU処理を実行するプログラムをハードディスク34等から読み出してメモリ33に展開することで、当該プログラムを実行するプロセスを動作させる。GPU32は、複数のプロセス10を多重で動作させる。
【0103】
[サーバの各モジュール単位のシーケンス]
次に、実施例に係るサーバの各モジュール単位のシーケンスの一例を、図11を参照して説明する。図11は、実施例に係るサーバの各モジュール単位のシーケンスの一例を示す図である。
【0104】
まず、アプリケーション11は、モデルロード命令およびロード対象のモデルのパスを第1のWrapper部12に送信する(S11)。すると、第1のWrapper部12は、アプリケーション11からのモデルロード命令をフックする。そして、第1のWrapper部12は、パス-モデル対応表125とロード対象のモデルのパスから、ロード対象のモデル名を取得し、スケジューラ部21にモデルロード開始通知、プロセスIDおよびモデル名を送信する(S12)。
【0105】
モデルロード開始通知、プロセスIDおよびモデル名を受信したスケジューラ部21は、プロセスIDとモデル名の組み合わせに対し、推論回数のカウントを初期化する(S13)。
【0106】
第1のWrapper部12は、AIフレームワーク13のモデルロードAPIを利用し、ロード対象のモデル名のモデルオブジェクトをロードする(S14~S16)。この後、第1のWrapper部12は、ロードしたモデルオブジェクトにフック用APIとモデル名の情報を追加し、フック用モデルを生成する(S17)。そして、第1のWrapper部12は、フック用モデルAPI(111)をアプリケーション11に返す(S18)。
【0107】
アプリケーション11が、フック用モデルAPI(111)を用いて初回の推論を実行する(S19)。すると、第1のWrapper部12は、フック用モデルが推論開始命令をフックし、推論開始通知、プロセスID、モデル名をスケジューラ部21に送信する(S20)。この後、第1のWrapper部12は、スケジューラ部21からの指示を待機する。
【0108】
推論開始通知、プロセスID、モデル名を受信したスケジューラ部21は、プロセスIDとモデル名の組み合わせに対する推論回数のカウントを1加えた値「1」に更新する(S21)。そして、スケジューラ部21は、推論回数が「1」(初回)であるので、プロセスIDが示すプロセス10の第1のWrapper部12に推論開始指示を送信する(S22)。
【0109】
推論開始指示を受信した第1のWrapper部12は、モデルオブジェクトを用いて、推論を実行する(S23)。AIフレームワーク13は、推論処理を、GPU17を利用して実行する(S23A,S24)。そして、第1のWrapper部12は、推論結果を受信すると、アプリケーション11に返す(S25,S26)。
【0110】
次に、アプリケーション11が、フック用モデルAPI(111)を用いて二回目以降の推論を実行する(S27)。すると、第1のWrapper部12は、フック用モデルが推論開始命令をフックし、推論開始通知、プロセスID、モデル名をスケジューラ部21に送信する(S28)。この後、第1のWrapper部12は、スケジューラ部21からの指示を待機する。
【0111】
推論開始通知、プロセスID、モデル名を受信したスケジューラ部21は、プロセスIDとモデル名の組み合わせに対する推論回数のカウントを1加えた値に更新する(S29)。そして、スケジューラ部21は、推論回数が「2」以上であるので、プロセスIDが示すプロセスの第2のWrapper部14に状態管理初期化指示とモデル名を送信する(S30)。そして、スケジューラ部21は、第2のWrapper部14からの応答を待機する。
【0112】
状態管理初期化指示とモデル名を受信した第2のWrapper部14は、遷移パターンDBからモデル名に対応する遷移パターンをロードし、内部変数を初期化する(S31)。この後、第2のWrapper部14は、状態管理初期化完了通知をスケジューラ部21に送信する(S32)。
【0113】
状態管理初期化完了通知を受信したスケジューラ部21は、送信元のプロセスIDが示すプロセスの第1のWrapper部12に推論開始指示を送信する(S33)。
【0114】
推論開始指示を受信した第1のWrapper部12は、モデルオブジェクトを用いて、推論を実行する(S34)。AIフレームワーク13は、推論処理を、GPU17を利用すべく、第2のWrapper部14を経由してCUDAライブラリ15を実行する(S34A,S35)。
【0115】
そして、第2のWrapper部14は、AIフレームワーク13からCUDA APIをフックしたとき(S36)、ロードした遷移パターンに基づき、CUDA API、引数から状態等の内部変数を更新する。そして、第2のWrapper部14は、コア開始のパターンを検知すると(S37)、スケジューラ部21にコア開始通知とプロセスIDを送信する(S38)。
【0116】
スケジューラ部21は、コア開始通知キュー218が空であれば、コア開始指示をプロセスIDが示すプロセス10の第2のWrapper部14に送信する(S39)。なお、スケジューラ部21は、コア開始通知キュー218が空でなければ、コア開始通知キュー218にプロセスIDを追加する。
【0117】
コア開始指示を受信した第2のWrapper部14は、GPU17を利用すべく、CUDAライブラリ15を実行する(S40)。
【0118】
そして、第2のWrapper部14は、コア終了のパターンを検知すると(S42)、スケジューラ部21にコア終了通知とプロセスIDを送信する(S43)。なお、コア終了通知とプロセスIDを受信したスケジューラ部21は、コア開始通知キュー218の当該プロセスIDを削除する。この後、スケジューラ部21は、コア開始通知キュー218内のプロセスIDの一つを選択し、選択したプロセスIDが示すプロセス10の第2のWrapper部14にコア開始指示を送信する。
【0119】
この後、第2のWrapper部14は、内部変数の更新時に、CUDA APIを実行していない場合には、GPU17を利用すべく、CUDAライブラリ15を実行する(S44~S46)。そして、第2のWrapper部14は、CUDA APIを実行して返り値をAIフレームワーク13に返す。推論実行したAIフレームワーク13は、推論結果を第1のWrapper部12を経由してアプリケーション11に返す(S47,S48)。
【0120】
ここで、二回目以降の推論の場合には、第2のWrapper部14は、AIフレームワーク13からCUDA APIをフックしたとき、モデル名に対応する遷移パターンに基づいて、コア開始およびコア終了を検知する。そして、第2のWrapper部14およびスケジューラ部21は、コア処理が他のコア処理と重ならないようにコア処理の実行を制御する。ところが、初回推論の場合には、第2のWrapper部14は、AIフレームワーク13からCUDA APIをフックしても、そのままコア処理を実行する。これは、以下の理由による。AIフレームワーク13が推論を実行する場合、初回推論のとき推論処理を実行しながらGPU17を利用する際の無駄をなくすためにGPU利用パターンを最適化する。このため、初回推論では、秒オーダーで処理されるのに対して、二回目以降の推論では、数十~数百ミリ秒のオーダーで処理される。すなわち、初回推論が二回目以降の推論より長い処理となる。したがって、初回推論では、他のコア処理を秒オーダーでブロックしないようにするために、他の推論処理との並列実行を許可すべく、第2のWrapper部14は、そのままコア処理を実行するようにする。
【0121】
[複数プロセスの推論のシーケンス]
ここで、複数のプロセス10の推論のシーケンスの一例を、図12Aおよび図12Bを参照して説明する。図12Aおよび図12Bは、複数プロセスの推論のシーケンスの一例を示す図である。推論を実行するプロセスは、プロセスa(10a)およびプロセスb(10b)であるとする。スケジューラ部21は、プロセスc(20)であるとする。
【0122】
図12Aに示すように、まず、プロセスaは、モデルロード開始通知、プロセスIDおよびモデル名をスケジューラ部21に送信する(S101)。例えば、プロセスaにおいて、アプリケーション11は、モデルロード命令およびロード対象のモデルのパスを第1のWrapper部12に送信する。すると、第1のWrapper部12は、アプリケーション11からのモデルロード命令をフックする。そして、第1のWrapper部12は、パス-モデル対応表125とロード対象のモデルのパスから、ロード対象のモデル名を取得し、スケジューラ部21にモデルロード開始通知、プロセスIDおよびモデル名を送信する。
【0123】
モデルロード開始通知、プロセスIDおよびモデル名を受信したスケジューラ部21は、プロセスIDとモデル名の組み合わせに対し、推論回数のカウントを初期化する(S102)。そして、スケジューラ部21は、プロセスIDおよびモデル名の組み合わせに対し、推論回数を0回として、推論回数DB217に登録する。
【0124】
また、プロセスbは、モデルロード開始通知、プロセスIDおよびモデル名をスケジューラ部21に送信する(S103)。なお、S103を実施する際のプロセスb内での実施内容は、プロセスaのS101の場合と同様であるので、その説明を省略する。プロセスaのモデルロード開始通知、プロセスIDおよびモデル名を受信したスケジューラ部21は、プロセスIDとモデル名の組み合わせに対し、推論回数のカウントを初期化する(S104)。そして、スケジューラ部21は、プロセスIDおよびモデル名の組み合わせに対し、推論回数を0回として、推論回数DB217に登録する。
【0125】
続いて、プロセスaは、推論開始通知、プロセスID、モデル名をスケジューラ部21に送信する(S105)。例えば、第1のWrapper部12は、AIフレームワーク13のモデルロードAPIを利用し、ロード対象のモデル名のモデルオブジェクトをロードする。この後、第1のWrapper部12は、ロードしたモデルオブジェクトにフック用APIとモデル名の情報を追加し、フック用モデルを生成する。そして、第1のWrapper部12は、フック用モデルAPI(111)をアプリケーション11に返す。アプリケーション11がフック用モデルAPI(111)を用いて初回の推論を実行すると、第1のWrapper部12では、フック用モデルが推論開始命令をフックし、推論開始通知、プロセスID、モデル名をスケジューラ部21に送信する。この後、第1のWrapper部12は、スケジューラ部21からの指示を待機する。
【0126】
推論開始通知、プロセスID、モデル名を受信したスケジューラ部21は、推論回数DB217から、プロセスIDとモデル名の組み合わせに対する推論回数のカウントを取得する。そして、スケジューラ部21は、推論回数のカウントを1加えた値「1」に更新し(S106)、推論回数DB217に登録する。そして、スケジューラ部21は、推論回数が「1」(初回)であるので、プロセスIDが示すプロセス10aの第1のWrapper部12に推論開始指示を送信する(S107)。
【0127】
推論開始指示を受信したプロセスaは、初回推論を実行する(S107A)。例えば、推論開始指示を受信した第1のWrapper部12は、モデルオブジェクトを用いて、推論を実行する。AIフレームワーク13は、推論処理を、GPU17を利用して実行する。そして、第1のWrapper部12は、推論結果を受信すると、アプリケーション11に返す。
【0128】
また、プロセスbは、推論開始通知、プロセスID、モデル名をスケジューラ部21に送信する(S108)。なお、S108を実施する際のプロセスb内での実施内容は、プロセスaのS105の場合と同様であるので、その説明を省略する。推論開始通知、プロセスID、モデル名を受信したスケジューラ部21は、推論回数DB217から、プロセスIDとモデル名の組み合わせに対する推論回数のカウントを取得する。そして、スケジューラ部21は、推論回数のカウントを1加えた値「1」に更新し(S109)、推論回数DB217に登録する。そして、スケジューラ部21は、推論回数が「1」(初回)であるので、プロセスIDが示すプロセスbの第1のWrapper部12に推論開始指示を送信する(S110)。
【0129】
推論開始指示を受信したプロセスbは、初回推論を実行する(S110A)。例えば、推論開始指示を受信した第1のWrapper部12は、モデルオブジェクトを用いて、推論を実行する。AIフレームワーク13は、推論処理を、GPU17を利用して実行する。そして、第1のWrapper部12は、推論結果を受信すると、アプリケーション11に返す。
【0130】
初回推論を終了したプロセスaは、二回目以降の推論を実行すべく、推論開始通知、プロセスID、モデル名をスケジューラ部21に送信する(S111)。例えば、アプリケーション11が、フック用モデルAPI(111)を用いて二回目以降の推論を実行する。すると、第1のWrapper部12は、フック用モデルが推論開始命令をフックし、推論開始通知、プロセスID、モデル名をスケジューラ部21に送信する。この後、第1のWrapper部12は、スケジューラ部21からの指示を待機する。
【0131】
推論開始通知、プロセスID、モデル名を受信したスケジューラ部21は、プロセスIDとモデル名の組み合わせに対する推論回数のカウントを1加えた値に更新して(S112)、推論回数DB217に登録する。そして、スケジューラ部21は、推論回数が「2」以上であるので、プロセスIDが示すプロセスaの第2のWrapper部14に状態管理初期化指示とモデル名を送信する(S113)。そして、スケジューラ部21は、第2のWrapper部14からの応答を待機する。
【0132】
プロセスaでは、状態管理初期化指示とモデル名を受信した第2のWrapper部14は、遷移パターンDBからモデル名に対応する遷移パターンをロードし、内部変数を初期化し、状態管理初期化完了通知をスケジューラ部21に送信する(S114)。
【0133】
状態管理初期化完了通知を受信したスケジューラ部21は、送信元のプロセスIDが示すプロセスaの第1のWrapper部12に推論開始指示を送信する(S115)。
【0134】
プロセスaでは、推論開始指示を受信した第1のWrapper部12は、モデルオブジェクトを用いて、前処理を実行する(S115A)。
【0135】
初回推論を終了したプロセスbは、二回目以降の推論を実行すべく、推論開始通知、プロセスID、モデル名をスケジューラ部21に送信する(S116)。なお、S116を実施する際のプロセスb内での実施内容は、プロセスaのS111の場合と同様であるので、その説明を省略する。
【0136】
推論開始通知、プロセスID、モデル名を受信したスケジューラ部21は、プロセスIDとモデル名の組み合わせに対する推論回数のカウントを1加えた値に更新して(S117)、推論回数DB217に登録する。そして、スケジューラ部21は、推論回数が「2」以上であるので、プロセスIDが示すプロセスbの第2のWrapper部14に状態管理初期化指示とモデル名を送信する(S118)。そして、スケジューラ部21は、第2のWrapper部14からの応答を待機する。
【0137】
プロセスbでは、状態管理初期化指示とモデル名を受信した第2のWrapper部14は、遷移パターンDBからモデル名に対応する遷移パターンをロードし、内部変数を初期化し、状態管理初期化完了通知をスケジューラ部21に送信する(S119)。
【0138】
状態管理初期化完了通知を受信したスケジューラ部21は、送信元のプロセスIDが示すプロセスbの第1のWrapper部12に推論開始指示を送信する(S120)。
【0139】
プロセスbでは、推論開始指示を受信した第1のWrapper部12は、モデルオブジェクトを用いて、前処理を実行する(S120A)。
【0140】
図12Bに示すように、前処理を実行中のプロセスaでは、第2のWrapper部14が、コア開始のパターンを検知すると、スケジューラ部21にコア開始通知とプロセスIDを送信する(S131)。
【0141】
プロセスaからコア開始通知とプロセスIDを受信したスケジューラ部21は、コア開始通知キュー218からキュー長を取得する(S132)。ここでは、キュー長が0であるとする。すると、スケジューラ部21は、コア開始通知キュー218が空であるので、コア開始指示をプロセスIDが示すプロセスaの第2のWrapper部14に送信する(S133)。加えて、スケジューラ部21は、コア開始通知キュー218にプロセスaのプロセスIDを追加する(S134)。そして、コア開始指示を受信したプロセスaの第2のWrapper部14は、コア処理を実行する(S133A)。
【0142】
また、前処理を実行中のプロセスbでは、第2のWrapper部14が、コア開始のパターンを検知すると、スケジューラ部21にコア開始通知とプロセスIDを送信する(S135)。
【0143】
プロセスbからコア開始通知とプロセスIDを受信したスケジューラ部21は、コア開始通知キュー218からキュー長を取得する(S136)。ここでは、キュー長が1である。すると、スケジューラ部21は、コア開始通知キュー218が空でないので、コア開始通知キュー218にプロセスbのプロセスIDを追加する(S137)。
【0144】
コア処理を実行中のプロセスaでは、第2のWrapper部14が、コア終了のパターンを検知すると、スケジューラ部21にコア終了通知とプロセスIDを送信する(S138)。そして、第2のWrapper部14は、引き続き、後処理を実行する(S138A)。
【0145】
プロセスaからコア終了通知とプロセスIDを受信したスケジューラ部21は、コア開始通知キュー218の当該プロセスIDを削除する(S139)。そして、スケジューラ部21は、コア開始通知キュー218の先頭のプロセスIDを取得する(S140)。ここでは、取得されたプロセスIDは、プロセスbのプロセスIDである。すると、スケジューラ部21は、コア開始指示をプロセスIDが示すプロセスbの第2のWrapper部14に送信する(S141)。そして、コア開始指示を受信したプロセスbの第2のWrapper部14は、コア処理を実行する(S141A)。
【0146】
コア処理を実行中のプロセスbでは、第2のWrapper部14が、コア終了のパターンを検知すると、スケジューラ部21にコア終了通知とプロセスIDを送信する(S142)。そして、第2のWrapper部14は、引き続き、後処理を実行する(S142A)。
【0147】
プロセスbからコア終了通知とプロセスIDを受信したスケジューラ部21は、コア開始通知キュー218の当該プロセスIDを削除する(S143)。そして、スケジューラ部21は、引き続き、コア開始通知キュー218の先頭のプロセスIDを取得する(S144)。そして、スケジューラ部21は、プロセスIDを取得できれば、次のコア開始指示を該当するプロセスIDが示すプロセス10に指示することになる。
【0148】
[実施例の効果]
このようにして、上記実施例では、サーバ1は、GPU17を用いる推論処理の中核を担うコア処理であって前記GPU17を用いるコア処理の開始および終了の判定に用いるメッセージパターンを遷移パターンDB145に記憶する。サーバ1は、推論処理を実行するアプリケーションから出力されるメッセージを監視する。サーバ1は、遷移パターンDB145に記憶されたメッセージパターンを用いて、監視して得られたメッセージのパターンから、コア処理の開始および終了のタイミングを判定する。サーバ1は、コア処理の開始のタイミングを判定した場合には、他のコア処理を実行しているプロセスがなければコア処理を開始し、他のコア処理を実行しているプロセスがあれば、コア処理のプロセスを識別するプロセス識別子をコア開始通知キュー218に蓄積する。かかる構成によれば、サーバ1は、1台のGPU17が複数の推論処理を多重で実行しても、推論処理の重複実行による処理時間の増加を抑制することが可能となる。特に、サーバ1は、遷移パターンDB145を用いてコア処理の開始および終了のタイミングを判定することで、コア処理の時間を事前に調査する事前調査にかかるコストを不要とし、コア処理の干渉による処理時間の増加を抑制できる。
【0149】
また、上記実施例では、サーバ1は、コア処理の終了のタイミングを判定した場合には、終了のタイミングを判定したコア処理を実行していたプロセスのプロセス識別子をコア開始通知キュー218から削除する。かかる構成によれば、サーバ1は、コア処理の終了のタイミングをリアルタイムに得ることができ、直ぐに次のコア処理を開始することができ、推論処理の重複実行による処理時間の増加を確実に抑制できる。
【0150】
また、上記実施例では、コア処理の開始および終了の判定に用いるメッセージパターンは、GPU17を利用する特定のメッセージを取得する場合、GPU17を利用する特定のメッセージを実行して返り値を取得する場合、GPU17を利用する特定のメッセージのGPU17での実行が完了した場合を含む。かかる構成によれば、サーバ1は、各種におけるコア処理の開始パターン、終了パターンを用いることで、多様な推論処理の重複実行による処理時間の増加を確実に抑制できる。
【0151】
[その他]
なお、図示したサーバ1に含まれる第1のWrapper部12、第2のWrapper部14およびスケジューラ部21の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、状態管理部142を、状態管理を初期化する初期化部と、コア開始パターンを検知した際の処理部と、コア終了パターンを検知した際の処理部と、コア開始、コア終了のいずれも検知しない場合の処理部とに分散しても良い。また、モデル識別部122とフック用モデル生成部123とを1つの部として統合しても良い。また、遷移パターンDB145などを記憶する記憶部(図示しない)をサーバ1の外部装置としてネットワーク経由で接続するようにしても良い。
【符号の説明】
【0152】
1 サーバ
10,20 プロセス
11 アプリケーション
12 第1のWrapper部
13 AIフレームワーク
14 第2のWrapper部
15 CUDAライブラリ
16 GPUドライバ
17 GPU
21 スケジューラ部
111 フック用モデルAPI
121 モデルロードフック部
122 モデル識別部
123 フック用モデル生成部
124,144,216 プロセス間通信部
125 パス-モデル対応表
126 フック用モデル
131 モデルロード部
132 推論実行部
133 モデルオブジェクト
141 CUDAAPIフック部
142 状態管理部
143 API呼び出し制御部
145 遷移パターンDB
211 推論回数カウント部
212 処理判定部
213 推論開始制御部
214 状態管理初期化指示部
215 コア実行スケジュール部
217 推論回数DB
218 コア開始通知キュー
図1
図2
図3
図4
図5
図6
図7
図8A
図8B
図9
図10
図11
図12A
図12B
図13