0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめてのアドベントカレンダーAdvent Calendar 2024

Day 21

OPENCVでONNXを利用できるようにONNX RUNTIMEをビルドする

Last updated at Posted at 2024-12-04

OPENCVでONNXが利用できるように、ONNX RUNTIMEをビルドしました。
ONNX RUNTIMEのEPの、CUDA、DirectMLもビルドしましたので、ご紹介します。

ONNX RUNTIME、OPENCVをビルドしたのは、C++で利用できるようするためです。

環境

Windows11
Python 3.11(Windowsストア版)
ONNX RUNTIME 1.21.0
CUDA 12.4
cuDNN 9.1
OPENCV 4.10
VisualStudio 2022 Version 17.12.2
CMAKE 3.31.1

1.ONNX RUNTIME(CPU)をビルドする。

基本的に公式onnxruntimeのチュートリアル通り実施しています。

1.gitで落としてくる。

git clone --recursive https://github.com/Microsoft/onnxruntime.git
cd onnxruntime

2.cmakeをpipで入れる

CMAKEはpythonでpipするような手順になっています。
cmakeは既にセットアップ済みでしたが、後の手順がバッチファイルからpythonで実行されるようなので念のため手順通りpipで入手しています。

  python -m pip install cmake
  where cmake

3.ビルド

バッチファイルのオプションをつけて実行します。
ONNX RUNTIME CPUをビルドするだけであれば公式に記載の通りで全く問題ないと思います。

.\build.bat --config RelWithDebInfo --build_shared_lib --parallel --compile_no_warning_as_error --skip_submodule_sync

以下の記事にビルドオプションの中でも有用そうなものについて紹介されています。

4.インストール

ビルドが終わって・・・で、どうしたらいいの?OPENCVのcmakeのビルドでONNX YESにならないけど?人間が欲しいファイルをピックアップする感じ??
とうろたえましたが、githubにはインストールが書いてありました。

以下を実行することで、C:\Program Files\onnxruntimeにいい感じでコピーしてくれます。

cmake --install .\build\Windows\RelWithDebInfo --config RelWithDebInfo

2.ONNX RUNTIME(CUDA)をビルドする

1.ビルド

こちらも基本的にonnxruntime公式に記載されている通りです。

.\build.bat --config Release --build_shared_lib --parallel --use_cuda --cudnn_home <cudnn home path> --cuda_home <cuda home path>

cuDNN、cudaのパスを記載するようになっています。
--parallelも利用可能です。ただ、かなりメモリを食います。利用しましたが途中のメモリ使用量は32GBかそれ以上だったかと思います。
CUDAのビルドはかなり時間がかかりました。1時間くらい?もっと??
そのためオプション--parallelを利用したいところですが、メモリが少ないPCではメモリ不足でエラーになるかもしれません。

他のオプションとして、アーキテクチャの指定ができるので、もし事前に対象とするGPUの想定があれば記載してもいいかもしれません
--cmake_extra_defines CMAKE_CUDA_ARCHITECTURES=80;86;89
他にもたくさんオプションがあるので、一度CUDAの説明ページを読んでいただくのがいいと思います。

CUDAでは--config RelWithDebInfoは使えませんでした。Releaseとdebugしかないのかもしれません。
わたしは--config Releaseでビルドしました。

2.インストール

基本的に先ほどと同じです。
わたしはReleaseだけインストールしました。

cmake --install .\build\Windows\Release --config Release

インストールすると、共通のファイルは上書きされます。
全部を確認していませんが、たぶん同じ内容そうなので、そのままでいいんじゃないかなと思っています。
もし違ったら記事修正します。違うよって教えてください。

configが異なる場合は分けておく方が無難です

3.ONNX RUNTIME(DirectML)をビルドする

1.ビルド

こちらも基本的にonnxruntime公式に記載されている通りです。

build.bat --config RelWithDebInfo --build_shared_lib --parallel --use_dml

こちらは、--config RelWithDebInfoが使えました。また、--parallelも利用できます。
ビルドは短いです。15分くらい?

2.インストール

cmake --install .\build\Windows\RelWithDebInfo --config RelWithDebInfo

インストールすると、共通のファイルは上書きされます。
全部を確認していませんが、たぶん同じ内容そうなので、そのままでいいんじゃないかなと思っています。
もし違ったら記事修正します。違うよって教えてください。

configが異なる場合は分けておく方が無難です

4.OPENCVでWith ONNX

GUIのCMAKEでビルドしています。
ONNXのパスの指定をするようになるので、C:\Program Files\onnxruntimeを指定すると、ちゃんと認識してくれます。
image.png

5.その他

CUDAはバージョンによってアプリ側から利用できる/利用できないがあって、もうちょっと何とかならないかとは思うのですが、CUDA 11.8、cuDNN 8.9.7が間違いないだろう、と思い、当初こちらで進めようとしていたのですが、CUDA 11.8は、VisualStudio 2022 Version 17.12.2 では、ビルドできないバージョンになってました(バージョンの上限側を過ぎている模様)
強制的にバージョン無視してビルドするオプションもありそうだったのですが、いまいちよくわからなかったので、最近使っていたCUDA 12.4、cuDNN 9.1で、ONNX、OPENCVともにビルドしました。
OPENCVのビルドでは、CMAKEのバージョンが上過ぎるよというワーニングがでますが、こちらは無視しています。

6.Visual Studio(C++)でONNXRUNTIMEを利用したい時

NuGetでONNXRUNTIMEを導入してください。
image.png

OPENCVなどと同様に、外部インクルードや追加の依存ファイルを設定すればビルドしたonnxruntimeが利用できるかと思いましたが、Windows11ではsystem32にonnxruntime.dllが存在し、windows起動時に既に読み込まれています。
そのため、外部インクルードなどを設定しても、dllは読み込み済みのsystem32のものが適用され、
The given version [21] is not supported, only version 1 to 10 is supported in this build.
などと表示され、ONNXRUNTIME初期化時に例外がスローされてします。
(21はビルドしプロジェクトに設定したONNXRUNTIME、1-10はsystem32のonnxruntime.dll)
image.png

EXEと同フォルダのDLLが優先されるとのことですが、ビルドしたONNXRUNTIME.DLLをプロジェクトと同フォルダに置いても既に読み込まれているsystem32のものが優先されてしまうようなので、VisualStudioでの開発では素直にNuGetを利用ください。

onnxruntime公式のGet StartedでもNuGetを使えと指示されます。
image.png

VisualStudio C++でONNXRUNTIMEのサンプルを動かすのは、こちらの記事が参考になりました。(Mnist画像はgithubにあります)

まとめ

  • ONNX RUNTIMEのビルドをご紹介しました
  • 公式に記載されている手順と同じなので、実はこの記事にあまり価値がn
  • インストールはgithub側にしか書いてなかったので、多少価値はあるかもしれません
    (なんで公式ウェブ側には書いてないのか?
  • windowsにおいてはONNXRUNTIMEのビルドはopencvなどで利用したい場合のみになるかと思います
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?