GPU導入

ここではFACE01でGPUのパワーが引き出せるよう設定を行います。
作業はUbuntu20.04をベースに行いますが、Windows10の設定でもご参考になると思います。

まず(1)推奨される導入方法を記載します。この場合、自動判別されたバージョンのライブラリやディスプレイドライバがインストールされます。

次に、ディスプレイドライバや関連するライブラリを消去した上で、それらを(2)個別に正しくインストールする作業手順を記載します。
これはドライバのバージョンアップや強制再起動などの理由でまれにシステムに不具合が生じる可能性があり、対処として自動判別に頼らず人が正しく情報を整理して、不具合が起こらない組み合わせを選択する必要があるためです。
機器に搭載されているGPUチップの種類からディスプレイドライバのバージョンや必要なライブラリのバージョンを、複数の選択肢の中から正しく選択する作業手順となります。

記載している情報は私が推奨する作業手順であり、正確な情報は「NVIDIA Accelerated Linux Graphics Driver README and Installation Guide」にあります。ご参照ください。

(1) 推奨される導入方法

Ubuntu 20.04でのデバイスドライバ導入は以下のようになります。

公開鍵の取得とドライバ導入方法

$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.0-1_all.deb
$ sudo dpkg -i cuda-keyring_1.0-1_all.deb
$ sudo apt-get update
$ sudo apt-get -y install cuda

$ apt-get install -y nvidia-cuda-toolkit
$ apt-get install -y libcudnn8
$ apt-get install -y libcudnn8-dev
$ apt-get install -y libcublas

少し前とやり方が変わっています。(CUDA Toolkit 11.8 Downloadsを参照ください。)

参考のため少し前のやり方を載せます。

# wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin

# mv cuda-ubuntu2004.pin \
#   /etc/apt/preferences.d/cuda-repository-pin-600

# apt-key adv --fetch-keys \
#   https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub

# add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /"

# apt update && apt upgrade -y

# 推奨バージョンの確認
# ubuntu-drivers devices
# ドライバインストール
# ubuntu-drivers autoinstall

導入方法や公開鍵が変わっていますので注意してください。

ディスプレイドライバや関連するライブラリを消去する

# sudo apt-get purge *nvidia-*
# sudo apt-get purge cuda-*

(2) 個別に正しくインストールする作業手順

必要となるライブラリやディスプレイドライバのバージョンを個別に正しくインストールするには、以下に記載するステップを踏みます。

  1. 以下の情報を確認
    1. GPUカードのアーキテクチャ(microarchitecture)
    2. ディスプレイドライバのバージョン
    3. Compute Capabilityの数値
    4. CUDA Toolkitのバージョン
    5. cuDNNのバージョン
    6. 集めた情報を整理する
  2. 確認した情報をもとに導入
    1. ディスプレイドライバ
    2. CUDA Toolkit
    3. cuBLAS, cuDNN
  3. Pythonライブラリ再インストール

用語

簡単な用語の説明を記載します。正確な情報は上述の通り「NVIDIA Accelerated Linux Graphics Driver README and Installation Guide」をご参照ください。

アーキテクチャ

Nvidia社が出しているGPUの「世代」

アーキテクチャの例

GPU Compute Capability

そのGPUチップの性能を表した数値。「SM バージョン」というバージョン番号で表現されます。このバージョン番号は、GPUハードウェアでサポートされている機能を識別し現在のGPUカードで使用できるハードウェア機能や命令を判断するために使用されます。

Nvidia用ディスプレイドライバ

GPUを使用するためのドライバ

CUDA Toolkit

GPUを汎用目的に使用するために必要なライブラリ

cuDNN, cuBLAS

深層学習用ライブラリ, 行列計算用ライブラリ

情報を確認

アーキテクチャを調べるには

List of Nvidia graphics processing unitsからお使いのGPUカードを検索してください。例えばGeForce 1660tiならば以下の画像のように表示されますので「アーキテクチャ = Turing」と分かります。

アーキテクチャを確認する

ディスプレイドライバのバージョンを知るには

このURLにアクセスして持っているビデオカードやOSの種類を選択して検索ボタンを押すと、どのドライバが良いか結果を出してくれます。ダウンロードタイプは「製品ブランチ」を選んでください。

赤線が引いてある箇所をみると「515.76」であることが分かります。

GPU Compute Capabilityを知るには

GPUs supportedの項のテーブルから検索します。

Compute capabilityのテーブル

たとえばGeForce GTX 1660 Tiなら「7.5」であることが分かります。

CUDA Toolkitのバージョンを知るには

cuDNN Support Matrixを参照してアーキテクチャから調べます。下の図は「Turing」で調べた結果です。CUDA Compute CapabilityはGPU Compute Capabilityのことです。上述したとおり「7.5」なのでここでは複数のバージョンを選べるよということになります。

どれを選ぶかは上述した「ドライバのバージョン」を参考にします。

Table 3. CUDA Toolkit and Corresponding Driver Versionsを参照してください。

2022年10月30日時点のドキュメンテーション

ちなみにこのページは頻繁に更新されリンクも途切れやすくなっています。もしご自身のブックマークがリンク切れになった場合は「CUDA Toolkit Documentation」をキーワードとして検索してください。

リンク切れになった以前のドキュメンテーション
LINUX用ドライバとCUDA Toolkitのバージョン関係

上の図より、ディスプレイドライバ「515.76」に対応するCUDA ToolkitのバージョンはCUDA 11.7であることが分かりました。

参考として2022年10月30日時点での対応表を下に転載します。

CUDA Toolkit Toolkit Driver Version
Linux x86_64 Driver Version Windows x86_64 Driver Version
CUDA 11.8 GA >=520.61.05 >=522.06
CUDA 11.7 Update 1 >=515.48.07 >=516.31
CUDA 11.7 GA >=515.43.04 >=516.01
CUDA 11.6 Update 2 >=510.47.03 >=511.65
CUDA 11.6 Update 1 >=510.47.03 >=511.65
CUDA 11.6 GA >=510.39.01 >=511.23
CUDA 11.5 Update 2 >=495.29.05 >=496.13
CUDA 11.5 Update 1 >=495.29.05 >=496.13
CUDA 11.5 GA >=495.29.05 >=496.04
CUDA 11.4 Update 4 >=470.82.01 >=472.50
CUDA 11.4 Update 3 >=470.82.01 >=472.50
CUDA 11.4 Update 2 >=470.57.02 >=471.41
CUDA 11.4 Update 1 >=470.57.02 >=471.41
CUDA 11.4.0 GA >=470.42.01 >=471.11
CUDA 11.3.1 Update 1 >=465.19.01 >=465.89
CUDA 11.3.0 GA >=465.19.01 >=465.89
CUDA 11.2.2 Update 2 >=460.32.03 >=461.33
CUDA 11.2.1 Update 1 >=460.32.03 >=461.09
CUDA 11.2.0 GA >=460.27.03 >=460.82
CUDA 11.1.1 Update 1 >=455.32 >=456.81
CUDA 11.1 GA >=455.23 >=456.38
CUDA 11.0.3 Update 1 >= 450.51.06 >= 451.82
CUDA 11.0.2 GA >= 450.51.05 >= 451.48
CUDA 11.0.1 RC >= 450.36.06 >= 451.22
CUDA 10.2.89 >= 440.33 >= 441.22
CUDA 10.1 (10.1.105 general release, and updates) >= 418.39 >= 418.96
CUDA 10.0.130 >= 410.48 >= 411.31

cuDNNのバージョンを知るには

上述の「Table 1. Supported NVIDIA Hardware and CUDA Version」からcuDNNのバージョンは「8.6.0」ということが分かります。

Table 1. Supported NVIDIA Hardware and CUDA Version

集めた情報のまとめ

以上の作業から必要となるバージョンはこのようになります。

  • ディスプレイドライバのバージョン
    • 515.76
  • CUDA Toolkitのバージョン
    • 11.7
  • cuDNNのバージョン
    • 8.6.0

これをもとにそれぞれのインストールを行います。

もしインストールをした後で再び問題が発生するならディスプレイドライバのバージョンを下げてみてください。実際私の場合は以下の条件でインストールし直しました。

  • ディスプレイドライバのバージョン
    • 510.85.02
  • CUDA Toolkitのバージョン
    • 11.6
  • cuDNNのバージョン
    • 8.6.0

それぞれのインストール

それぞれのインストールはUbuntuであればSynapticから簡単に行うことが出来ます。

synapticの画面例

インストールが終わったら下のようにして確認しておくと良いでしょう。

nvidia-smi コマンドによる確認

Pythonライブラリの再インストール

GPUに対応させるためPythonライブラリの再インストールを行います。

requirements.txtから一括インストールする前にdlibが正しくインストールできるかチェックしてください。dlibが正しくインストールできればGPU関連ライブラリ・ドライバの導入が成功した証明になります。

# Deactivate
deactivate

# Remove venv dirs
rm -rf ~/bin/FACE01/bin
rm -rf ~/bin/FACE01/share
rm -rf ~/bin/FACE01/lib64
rm -rf ~/bin/FACE01/include
rm -rf ~/bin/FACE01/lib

# Remove pip cache dir
rm -rf ~/.cache/pip

# Re-Make virtual environment
python3 -m venv ./

# Activate
. bin/activate

# Upgrade modules pip, setuptools, wheel
pip install -U pip setuptools wheel

# Install dlib
pip install dlib

dlibが正しくインストールできたかチェックします。

$ cd bin/FACE01

$  ~/bin/FACE01  . bin/activate

(FACE01) 
$  ~/bin/FACE01  python
Python 3.8.10 (default, Jun 22 2022, 20:18:18) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import dlib
>>> dlib.DLIB_USE_CUDA
True
>>> 

「True」と表示されたらOKです。

dlib.DLIB_USE_CUDAによるチェック

Falseと表示された場合はインストールしたバージョンが正しく動作していません。ディスプレイドライバのバージョンを下げてその場合の正しい組み合わせを試してみてください。

dlibのインストールチェックが正しく終了したら一括インストールを行います。

$ ~/bin/FACE01  pip install -r requirements.txt 
一括インストールの様子
Successfully built GPUtil memory-profiler pyqrcode
Installing collected packages: PySimpleGUI, pyqrcode, mpmath, mojimoji, GPUtil, flatbuffers, urllib3, typing_extensions, tornado, sympy, six, pyparsing, psutil, protobuf, Pillow, numpy, kiwisolver, idna, humanfriendly, fonttools, cycler, charset-normalizer, certifi, attrs, absl-py, snakeviz, requests, python-dateutil, packaging, opencv-python, opencv-contrib-python, nptyping, memory-profiler, contourpy, coloredlogs, onnxruntime, matplotlib, mediapipe
Successfully installed GPUtil-1.4.0 Pillow-9.1.1 PySimpleGUI-4.60.1 absl-py-1.3.0 attrs-22.1.0 certifi-2022.9.24 charset-normalizer-2.0.12 coloredlogs-15.0.1 contourpy-1.0.6 cycler-0.11.0 flatbuffers-22.10.26 fonttools-4.38.0 humanfriendly-10.0 idna-3.4 kiwisolver-1.4.4 matplotlib-3.6.1 mediapipe-0.8.10 memory-profiler-0.60.0 mojimoji-0.0.12 mpmath-1.2.1 nptyping-2.2.0 numpy-1.22.4 onnxruntime-1.12.0 opencv-contrib-python-4.6.0.66 opencv-python-4.6.0.66 packaging-21.3 protobuf-3.20.1 psutil-5.9.1 pyparsing-3.0.9 pyqrcode-1.2.1 python-dateutil-2.8.2 requests-2.28.0 six-1.16.0 snakeviz-2.1.1 sympy-1.11.1 tornado-6.2 typing_extensions-4.2.0 urllib3-1.26.9
(FACE01) 

上のように表示されたら一括インストール終了です。

サンプルスクリプトの実行

FACE01ライブラリが正しく動作するかサンプルスクリプトの動作検証をしてください。

~/bin/FACE01/ $ cd example/

(FACE01) 
~/bin/FACE01/example $ python ~/bin/FACE01/example/display_GUI_window.py
[2022-10-31 07:39:46,273] [face01lib.load_priset_image] [load_priset_image.py] [INFO] Loading npKnown.npz
菅義偉 
         similarity              99.1% 
         coordinate              (138, 240, 275, 104) 
         time                    2022,10,31,07,39,47,935344 
         output                   
 -------

麻生太郎 
         similarity              99.6% 
         coordinate              (125, 558, 261, 422) 
         time                    2022,10,31,07,39,47,935344 
         output                   
 -------

まとめ

GPUを使った開発環境を整えるのはとっつきにくいと思われるかもしれませんが、慣れてしまえば突然のトラブルにも対処できます。ぜひ挑戦してみてください。

最後までお読み頂きありがとうございました。