ONNX RuntimeでDirectMLを使ってdlshogiのモデルの推論を行い、処理時間を比較してみた。
DirectMLを使えばAMDのGPUでも推論が実行できるようになる。
DirectMLプロバイダの使用
NuGetからビルド済みバイナリが取得できる。
Microsoft.ML.OnnxRuntime.DirectMLをインストールする。
DirectMLプロバイダを使用するにはソースに以下の行を追加する。
#include <dml_provider_factory.h> session_options.DisableMemPattern(); session_options.SetExecutionMode(ORT_SEQUENTIAL); OrtSessionOptionsAppendExecutionProvider_DML(session_options, 0);
DisableMemPattern()とSetExecutionMode(ORT_SEQUENTIAL)が必要である点は、
https://github.com/microsoft/onnxruntime/blob/master/docs/execution_providers/DirectML-ExecutionProvider.md
に記載されている。
この記述がないとSessionの初期化でエラーが発生する。
これで、ビルドは通るが実行にOrtSessionOptionsAppendExecutionProvider_DMLでメモリアクセス違反のエラーになった。
issuesを調べたところ同様のエラーの報告があり、対処方法が記載されていた。
https://github.com/microsoft/onnxruntime/issues/3360
ONNX Runtimeが使用するDirectML.dllは、Windows 10のシステムにインストールされているdirectml.dllと互換性がないため発生するようだ。
PATHに設定していても、システムフォルダが優先されるため、DirectML.dllを.exeのあるフォルダにコピーする必要がある。
onnxruntime.dllはちゃんと.exeのフォルダにコピーされるので、NuGetのパッケージの不備ではないかと思うが、「packages\Microsoft.ML.OnnxRuntime.DirectML.1.3.0\runtimes\win-x64\native\DirectML.dll」を手動でコピーした。
自動化するならVisual Studioのプロジェクトのビルド後の処理に設定するのが良いだろう。