01.05 DeepFace ~NVIDIA GPU~

★ 現在インストールされているモジュール

今回旧PCOASが使用していたpython 3.6環境から新しくpython3.9仮想環境に移行しつつありますが、開始当初のバージョンは下記のようにインストールしました。

仮想環境 py36 py39
python 3.6.10 3.9.18
deepface 0.0.75 0.0.86
tensorflow 1.14.0 2.16.0

次のような変遷により内容が変わっていきました。

・ DeepFace起動時エラー。                ↓
  エラー原因は tensorflowバージョン 2.16.0
                ↓
    「2.15.0」にグレードダウン
                ↓
・ 全モデル・バックエンド組み合わせ試験でモデル「DeepFace」がエラー
    原因がtensorflowバージョン2.15.0
                ↓
    「2.12.0」にグレードダウン
                ↓
・ モデル「DeepFace」「DeepID」は顔検索がすべて失敗
                ↓
    再び tensorflow 2.15.0に戻す
                ↓

仮想環境 py36 py39
python 3.6.10 3.9.18
deepface 0.0.75 0.0.86
tensorflow 1.14.0 2.15.0

★ GPU仕様うっかりミス

このように tensorflowのバージョンを簡単に変更していましたが、その前提としてdeepface.findメソッド試験でGPUの有無により処理時間に差がないことが確認されていたことが挙げられます。 ところが次回以降に行う試験で、全パターン実施すると予想終了時間が一か月程かかることが分かりました。
そこで、どうしてもGPUを使用して高速で処理させる必要が出てきたため、GPU付きPCに何か問題があって処理時間に差がないことを確認することにしました(問題があれば改修すれば速くなる可能性があるという意味)。

最初の確認事項は、システム環境変数CUDAで登録されているバージョンです。

CUDA_PATH v11.8
CUDA_PATH_V11_8 v11.8
CUDNN_PATH      v11.8

途中まで、「CUDA 10.1」をCUDA統一バージョンとしていましたが、OCR編途中で「CUDA 11.8」が必要になったため変更しました。 そこで思い出したのが、tensorflowとCUDAのバージョンマッチング問題です。

tensorflowをディープラーニングモデルで起動するとコンソールメッセージ内に使用しているCUDAのバージョンが表示されるように、tensorflowのバージョンによって最適CUDAバージョンが異なります。異なったバージョンを使用すると、該当のCUDA DLLが無いというメッセージが出るところから考えると、全く動作していないか、効率よくは動かないことが確認されています。
さらにややこしいことに前述のように使用モジュールで最適なtensorflowバージョンが異なるため変更する必要があるのですが、最適なtensorflowバージョンに対応するCUDAバージョンが異なります。そうした場合、CUDAやcuDNNは下記をシステム環境設定することで該当バージョンが設定可能になります。
    ・ CUDA_PATH
    ・ CUDA_PATH_V10_1
    ・ CUDNN_PATH
そうすると、「CUDA_PATH_V10_1」はバージョンの指定がありますが「CUDA_PATH」「CUDNN_PATH」は直接バージョンパス付きフォルダ名を指すため、複数のCUDAバージョンを同時に設定することができません。このため、我々は「CUDA統一バージョン」を設定し「CUDA 10.1」としていたわけです。

では具体的に、 本サイトでpython3.6を使用していた当時のtensorflowとCUDA、cuDNNのバージョン対応をみてみましょう。 tensorflowのGPU版は「tensorflow-gpu」と指定しインストールする必要がありましたが、「2.x」以降は特に「tensorflow-gpu」と指定する必要がないと公式サイトにあるため、最近まで特に考えず最後の「python3.6」「tensorflow-gpu1.15.0」「CUDA 10.1」「cuDNN 7.6」を保持してきたという訳です。

バージョン              Python Ver     コンパイラ   ビルドツール    cuDNN   CUDA
tensorflow-2.6.0        3.5~3.8        GCC 7.3.1   Bazel 3.7.2     8.1     11.2
tensorflow-2.5.0        3.5~3.8        GCC 7.3.1   Bazel 3.7.2     8.1     11.2
tensorflow-2.4.0        3.5~3.8        GCC 7.3.1   Bazel 3.1.0     8.0     11.0
tensorflow-2.3.0        3.5~3.8        GCC 7.3.1   Bazel 3.1.0     7.6     10.1
tensorflow-2.2.0        3.5~3.8        GCC 7.3.1   Bazel 2.0.0     7.6     10.1
tensorflow-2.1.0        2.7、3.5~3.7   GCC 7.3.1   Bazel 0.27.1    7.6     10.1
tensorflow-2.0.0        2.7、3.3~3.7   GCC 7.3.1   Bazel 0.26.1    7.4     10.0
tensorflow-gpu-1.14.0   2.7、3.3~3.7   GCC 4.8     Bazel 0.24.1    7.4     10.0
tensorflow-gpu-1.13.1   2.7、3.3~3.7   GCC 4.8     Bazel 0.19.2    7.4     10.0
tensorflow-gpu-1.12.0   2.7、3.3-3.6    GCC 4.8     Bazel 0.15.0    7       9
tensorflow-gpu-1.11.0   2.7、3.3-3.6    GCC 4.8     Bazel 0.15.0    7       9
tensorflow-gpu-1.10.0   2.7、3.3-3.6    GCC 4.8     Bazel 0.15.0    7       9
tensorflow-gpu-1.9.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.11.0    7       9
tensorflow-gpu-1.8.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.10.0    7       9
tensorflow-gpu-1.7.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.9.0     7       9
tensorflow-gpu-1.6.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.9.0     7       9
tensorflow-gpu-1.5.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.8.0     7       9
tensorflow-gpu-1.4.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.5.4     6       8
tensorflow-gpu-1.3.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.4.5     6       8
tensorflow-gpu-1.2.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.4.5     5.1     8
tensorflow-gpu-1.1.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.4.2     5.1     8
tensorflow-gpu-1.0.0    2.7、3.3-3.6    GCC 4.8     Bazel 0.4.2     5.1     8

うっかりしていたのは、使用していた「tensorflow1.15.0」や「python3.6」では動かないモジュールが出てきたたため変更した時点で、前述の最終が「tensorflow2.1」に対し、現在は「python3.9」「tensorflow2.16」と大幅に違うバージョンを使用したことに対し調査しなかったことにあります。

★ tensorflowとCUDA

そこで、tensorflow・CUDA・cuDNNのバージョン相関関係を再調査してみました。
https://www.tensorflow.org/install/source_windows?hl=ja#gpu

tensorflow 2024/03/21現在の最新版は
        tensorflow            2.16.1
        使用コンパイラ      MSVC2019

これってどういうことかというと、 前述表にあるように「tensorflow2.0.0」以上はGPUの区別なくインストールすると頭にあるため、当たり前といえば当たり前ですが 「pip install tensorflow」 でインストールすると最新版がインストールされ、そのバージョンが「tensorflow 2.16.1」だったということです。 最新tensorflowに適応するpythonバージョンは偶然3.9~3.12であったため、pythonバージョンを変更し現在に至っているというストーリーになります。



驚いたのはこれからです。

tensorflow公式サイトで「Linux/macOS(https://www.tensorflow.org/install/source?hl=ja)」「windows(https://www.tensorflow.org/install/source_windows?hl=ja)」の区別があり、さらにマッチング表のタイトルは「CPU」「GPU」に分かれます。「CPU」はGPUを使用しないtensorflowのバージョンを示し、「GPU」がGPUを使用するバージョンを示します。 深読みすると、「CPU」「GPU」の区別があるということは、python3.6をインストールした当時とは異なり、インストール時にGPUの有無によって区別があるということ。裏を返すとGPUがあっても使用できない場合があることを示しています。

実際に別ページにある MacやLinux版の最終バージョンは、
【CPU】
        tensorflow            2.16.1
        使用コンパイラ      MSVC2019
【GPU】
        tensorflow            2.16.1
        python                 3.9~3.12
        コンパイラ            Clang 17.0.6
        cuDNN                 8.9
        CUDA                  12.3

windows版のCPU版ではtensolflow 2.16.1ですが、GPU版(下記表)最後は次のようになっています。
【GPU】
        tensorflow            2.10.0
        python                 3.9~3.10
        コンパイラ            MSVC 2019
        cuDNN                 8.1
        CUDA                  11.2

tesorflow2.10.0、CUDAバージョン「11.2」以降サポートされていないことになっています。

その理由も見えてきました。
下記表は「Linux・macOS」版に「GPU」先頭部分です。 tensorflowやKerasはGoogle社、windowsはMicrosoft社で、GoogleとMicorSoftは、以前よりAppleのiOSやMacOS上のデフォルト検索エンジンのポジショニングをめぐって争いが激化している背景があります。

話を元に戻しますが、Microsoft系列のコンパイラというとVisualStudio(以降「VS」)が使用するため一般的には外に出ませんが、各バージョンVSの「ビルドツール」というのをインストールする機会があったように、コンパイラのみをインストールすることができます。ここで広く一般的に従来使用されたコンパイラは本来Linux用に普及した(すべてのUNIX系OSに移植された)「GCC(GNU Compiler Collection)」を使用しています。これが「Min-GW(Minimalist GNU For Windows) 」gccをWin32に移植した環境ですが、windowsのVSで主に使用されるため下記表では「MSVC」(MicroSoft Visual C++ Compiler)という記載になっています。
「tensorflow2.10.0」までは、Linux・macOS版も「GCC」、windows版も「MSVC」でやってきましたが、それ以降コンパイラを「Clang(クラン)」に変えてしまいました。



「Clang(クラン)」はLLVM上で起動することを念頭に置いた新しいコンパイラで、特にApple社がLLVM(Low Level Virtual Machine・(低水準仮想機械))システムを開発システムに取り入れたことから考えると、前述の熾烈な争いによりwindowsで普及が遅れている「クラン」を使用したのだと考えられます。
憶測の背景はともかく、Clang(クラン)はwindowsでも使用できなくないですが、少なくともCUDAデベロッパーはそこまで行きついておらず、MSVCコンパイラを使用する最終版までのバージョン


    tensorflow    2.10.0
    CUDA          11.2
    python         3.7~3.10


という縛りをうけることになりました。
このため、GPU仕様PCは現在「CUDA 11.8」から「CUDA 11.2」へ、tensorflowは「tensorflow2.15.0」から「tensorflow-gpu 2.10.0」へ変更しないとGPUは最適には動作しないことになります。但し、GPUを使用していないPCは最新版「2.15.0」で対応が可能です。



★ GPU使用PCのtensorflow/CUDA/cuDNN再インストール

これはwindowsデベロッパーには大きな痛手です。
仕方がないので、GPU仕様tensorflowを使用する仮想環境py39(python3.9)は、一部を再インストールします。但し、現状動作している仮想環境py36はバージョンが異なるため、CPUのみ使用して動作することになります。

再インストール対象は「tesorflow」「CUDA」「cuDNN」となります。
繰り返しになりますが、GPUを使用する場合は「tesorflow」と「tesorflow-gpu」と区別する必要が出てきました。その際の教訓として「tesorflow」と「tesorflow-gpu」とが同時にインストールされているという状態を観たことがあります。
それでは意味がないため、GPUを使用する場合は旧tesorflowは最初に削除し、「pip list」で「tesorboard」等が残っていないかを確認し完全に削除しておいてください。

次にGPU付きwindows版は「tensorflow-gpu 2.10.0」をインストールします。

pip install tensorflow-gpu==2.10.0

次に「CUDA」「cuDNN」をインストールしますが、詳細は下記サイトを参照してください。
教訓として、GGE宅ではサイトからダウンロードしたデータは保存されており、該当バージョンのものもありましたが、少しずつ変化しているため、面倒でも必ず最新版を使用してください。

 ・ 01. tensorflowインストール
 ・ 02. CUDAインストール

前述のようにコンパイラ「MSVC 2019」は、「MicroSoft Visual studio C++ 2019」のことを意味します。旧CUDAインストール時は「MSVC 2015」を使用していましたので、VisualStudio本体ではなく、C++2019ビルドツールがあればいいことになります。「MicroSoft Visual C++ 2019」本体をインストールした場合は、「C++2019ビルドツール」にチェックが入っていることを確認しインストールする必要があります。
また「CUDA 11.2」に対する「cuDNN」は、現在「11.x」にまとめられており、事実上「cuDNN8」のみとなります。


★ 再インストール結果

再インストール後、CPUメータで確認するとGPUが使用されていることが確認されました。
次回詳しくお話ししますが、 1つの例として次回行いますメソッド試験結果を先にお見せします。

【CPU】 opencv ssd dlib mtcnn retinaface mediapipe yolov8 yunet fastmtcnn
VGG-Face 3.9340 1.5454 1.4186 1.2605 1.4126 1.2191 1.2086 1.2317 1.2399
Facenet 1.3440 1.2147 1.2293 1.3092 1.2535 1.6547 1.3125 1.2662 1.4909
Facenet512 1.2009 1.2322 1.1786 1.3709 1.2868 1.2242 1.2441 1.2295 1.2523
OpenFace 1.3400 1.1475 1.2312 1.2564 1.3442 1.2336 1.2898 1.3227 1.2734
DeepFace 1.3322 1.2613 1.2814 1.2638 1.2208 1.1972 1.2850 1.2228 1.2328
DeepID 1.2454 1.2628 1.2246 1.3060 1.2288 1.2488 1.2553 1.1658 1.3816
ArcFace 1.2307 1.2480 1.1774 1.3031 1.2756 1.2638 1.2081 1.2416 1.2569
Dlib 1.2117 1.2372 1.3040 1.2825 1.2215 1.2280 1.2184 1.2615 1.2497
SFace 1.2324 1.2282 1.2827 1.2578 1.3558 1.1664 1.2847 1.2511 1.4687
【GPU】 opencv ssd dlib mtcnn retinaface mediapipe yolov8 yunet fastmtcnn
VGG-Face 2.953999 1.022237 1.089695 1.012285 1.000408 1.004324 1.194793 1.002211 1.074068
Facenet 1.075152 1.072132 1.068144 1.190822 1.004436 1.078084 1.162901 0.998339 1.079103
Facenet512 1.13098 1.008338 1.195801 1.005293 1.179839 1.002935 1.082573 1.159928 1.006279
OpenFace 1.156904 1.001772 1.072123 1.085098 1.132328 1.065116 1.085127 1.085098 1.188395
DeepFace 1.001697 1.184828 1.004594 1.079226 1.157899 1.001324 1.085095 1.137324 1.074206
DeepID 1.073564 1.031246 1.089531 1.134312 1.028282 1.108093 1.07349 1.187143 1.012744
ArcFace 1.090506 1.073529 1.074212 1.200805 1.009291 1.082075 1.148927 1.07085 1.06636
Dlib 1.010303 1.18383 1.003666 1.175851 1.071142 1.063485 1.179833 1.012538 1.190873
SFace 1.001548 1.157308 1.004309 1.081111 1.184831 1.00431 1.091865 1.08111 1.07557
【gpu-cpu】 opencv ssd dlib mtcnn retinaface mediapipe yolov8 yunet fastmtcnn
VGG-Face 0.9800 0.5232 0.3289 0.2482 0.4122 0.2147 0.0138 0.2295 0.1659
Facenet 0.2688 0.1425 0.1612 0.1183 0.2490 0.5766 0.1496 0.2678 0.4118
Facenet512 0.0699 0.2239 -0.0172 0.3656 0.1070 0.2213 0.1615 0.0696 0.2460
OpenFace 0.1830 0.1457 0.1591 0.1713 0.2119 0.1685 0.2047 0.2376 0.0850
DeepFace 0.3305 0.0764 0.2768 0.1845 0.0629 0.1959 0.1999 0.0855 0.1586
DeepID 0.1718 0.2316 0.1351 0.1717 0.2005 0.1407 0.1818 -0.0213 0.3689
ArcFace 0.1402 0.1745 0.1032 0.1023 0.2663 0.1817 0.0592 0.1707 0.1905
Dlib 0.2014 0.0534 0.3003 0.1066 0.1503 0.1645 0.0386 0.2490 0.0588
SFace 0.2308 0.0709 0.2784 0.1767 0.1709 0.1621 0.1928 0.1700 0.3932

DeepFace Findメソッドでモデル「DeepFace」「DeepID」は機能していませんでしたが、次回行うメソッドでは、GPUフルパワーで使用していることが確認されました。上記一番下 3つ目の表である差分をみると、モデル「Facenet512」と「DeepID」で逆転現象が見られ、従来のディープラーニング学習のように10倍近い差が確認できず、精々1~2割程度速くなっています。
1つの原因として、今回実施している試験はpythonが苦手とするモデル・バックエンドを「For」ループで繰り返しており、それに対しGPU処理負荷が小さいため、CPU⇔GPUデータ交換比率が高くなったことが原因と考えられます。

但し、モデル「DeepFace」「DeepID」のみにした試験では、GPU100%使用が確認されて機能し始めたため、高速化が期待されます。


≪清須電脳倶楽部メインページへ戻る場合はここをクリックしてください≫
Copyright(c)2018 GGE Kiyosu Cyber Club Allrights Reserved
inserted by FC2 system