dlib.DLIB_USE_CUDA を有効にする
これはdlib.DLIB_USE_CUDA を有効にしたdlibがimportすらできず、
File "C:\Users***\lib\site-packages\dlib_init_.py", line 19, in
from _dlib_pybind11 import *
ImportError: DLL load failed while importing _dlib_pybind11: The specified module could not be found.
のエラーとなる原因が意外なところで失敗していた話。
答えはcuDNNのフォルダ構成にありました。
そのほかちょっと注意点もあるので備忘録もかねて書きます。
環境を整える
物
CUDAの使えるnVIDIAのグラフィックボード
Windows 10/11のPC
アプリ(最新でよいと思います)
Visual Studio Community 2022
Cmake 3.28.1
CUDA Toolkit 12.3 Update 2 for Windows
NVIDIA cuDNN v8.9.7.29
cudnn-windows-x86_64-8.9.7.29_cuda12-archive.zip
をダウンロードし、展開したファイルの中のフォルダをそのまま
C:\Program Files\NVIDIA\CUDNN\v8.9.7.29
の下に保存。cuDNNのインストールガイドでは、
Copy bin\cudnn*.dll to C:\Program Files\NVIDIA\CUDNN\v8.x\bin.
Copy include\cudnn*.h to C:\Program Files\NVIDIA\CUDNN\v8.x\include.
Copy lib\cudnn*.lib to C:\Program Files\NVIDIA\CUDNN\v8.x\lib.
と書いているけど、lib\x64...というフォルダ構成になっているため、 ここでx64フォルダを無視するとimport dlibで失敗する。
dlib 19.24.2
dlibをコンパイルする
ダウンロードしたdlibを展開(Program Filesなど権限が必要なフォルダはNG)し、buildフォルダを作成する。
他は下記のやり方でOK
https://www.linkedin.com/pulse/installing-dlib-cuda-support-windows-10-chitransh-mundra
注意点は、cuDNNが見つからないのでパスを指定する必要がある点。
下記の通り設定する。
ユーザ環境変数の設定
変数:CMAKE_PREFIX_PATH
値:C:\Program Files\NVIDIA\CUDNN\v8.9.7.29
システム環境変数の設定
cuDNNのインストールガイドに従うと下記を設定する必要がある
変数:PATH
値:C:\Program Files\NVIDIA\CUDNN\v8.9.7.29\bin
ここでパスを指定しないと、次のCmakeでエラーが出ます。
失敗例:https://github.com/davisking/dlib/issues/221
-- *** cuDNN V5.0 OR GREATER NOT FOUND. ***
-- *** Dlib requires cuDNN V5.0 OR GREATER. Since cuDNN is not found DLIB WILL NOT USE CUDA. ***
-- *** If you have cuDNN then set CMAKE_PREFIX_PATH to include cuDNN's folder. ***
-- Disabling CUDA support for dlib. DLIB WILL NOT USE CUDA
CMake
-
フォルダを指定
Where is the source code
Whete to build the binaries
のフォルダに、展開したdlib、dlib/buildを指定。 -
[Configure]ボタンを押す
-
DLIB_USE_CUDA_COMPUTE_CAPABILITIESを設定
Compute capabilitiesは下記で使っているグラフィックボードを選ぶと表示される。
https://developer.nvidia.com/cuda-gpus#compute
初期値が50なので、8.6なら86と指定すればよいらしい。
でも、参考2を見るとdlibの作者はcuDNNを使っているから、そのバージョンが適切なら大丈夫、と言っている。
参考1)https://github.com/davisking/dlib/discussions/2861
参考2)https://github.com/davisking/dlib/issues/1156 -
[Configure] 2回目
(1回目は設定が読み込まれ、赤い背景色になるので、上記☑)
build
powershellでbuildフォルダを開き
cmake .
すぐに処理が完了する。
これでインストールの準備は完了。
dlibをインストールする
dlibのフォルダにsetup.pyがあるので、Powershellで
python setup.py install
を実行。
かなり時間がかかるけれどインストールできるはず。
もし途中でcmakeがないというエラーが出た場合は
pip install Cmake
で対応可能。
cmakeの時にうまくいったとしても、環境変数を設定後にターミナルを開かないと環境変数が読まれないので失敗する。インストールの途中でよく見ているとcuDNN not foundというようなメッセージが出てCUDAを使わないバージョンがインストールされてしまう。
CUDAが有効になっていることのチェック
>>> import dlib
>>> dlib.DLIB_USE_CUDA
True
これがFalseだと、cuDNNのパスが見つからずに失敗しているはず。その際は
pip uninstall dlib
でアンインストールしてやり直し
失敗例
そもそもimport dlibができないパターンにはまった。
>>> import dlib
File "C:\Users\***\lib\site-packages\dlib\__init__.py", line 19, in <module>
from _dlib_pybind11 import *
ImportError: DLL load failed while importing _dlib_pybind11: The specified module could not be found.
エラーの出ている __init__.py
は下記。
~~
04 def add_lib_to_dll_path(path):
~~~
09 try:
~~~
12 except (AttributeError,KeyError,FileNotFoundError):
13 pass
14
15 if 'ON' == 'ON':
16 add_lib_to_dll_path('C:/Program Files/NVIDIA/CUDNN/v8.9.7.29/lib/cudnn.lib')
17 add_lib_to_dll_path('C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.3/lib/x64/cudart.lib')
18
19 from _dlib_pybind11 import *
20 from _dlib_pybind11 import __version__, __time_compiled__
CUDAが使える状態でインストールされていると、15行目が if 'ON' == 'ON' となっているはず。
どこでおかしいのか分からず、エラーメッセージどおり19行目の_dlib_pybind11 を調べたりしていたけれど、add_lib_to_dll_path関数のエラーをチェックすると
'C:/Program Files/NVIDIA/CUDNN/v8.9.7.29/lib/cudnn.lib'
このファイルが(存在するのに)読み取れていなかった。
cuDNNの展開したフォルダ構成の通りに
'C:/Program Files/NVIDIA/CUDNN/v8.9.7.29/lib/x64/cudnn.lib'
にファイルを移動するとエラーが解消した。
CUDAの効果
face_recognitionが高速化!
自作アプリAvatarian(アバタリアン)は人の顔を区別して画像に置き換えるのだが、人の検出と特徴量の計算に時間がかかってフレームレートが落ちていた。
5人が映っているYoutubeを例にとると、
CPU:Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz 2.90 GHz
メモリ:16GB
の2018年のノートPCで
顔の検出:face_recognition.face_locations(frame)
に2.0秒
顔の判別:face_recognition.face_encodings(frame, face_locations)
に3.5秒
かかっていたものが、RTX1070の外付けGPUでそれぞれ
0.8秒(2.5倍)
0.06秒(58倍!)
に短縮された。
Avatarian
GPUのある方はぜひAvatarianで遊んでみてください。
会議の相手全員を今話題の「笑い男」にできます(それだけならface_recognitionはいらないのですが)