TensorFlow2.11とGPUの設定

DeepLearning

はじめに

TensorFlowをGPUで使うためにUbuntu18で環境を構築しました。

環境

GPU版のTensorFlow対応表ではTensorFlow2.11.0に対してCUDA11.2とcuDNN8.1となっていますが、最新版でも動作しました。

ソースからビルドする  |  TensorFlow
Ubuntu 18.04.3 LTS

Tesla P40
  - NVIDIA Driver Version: 520.61.05

TensorFlow
  - tensorflow-gpu 2.11.0

CUDA 11.8.0-1

cuDNN 8.7.0.84-1+cuda10.2

NVIDIAドライバのインストール

対応するドライバを確認します。

ubuntu-drivers devices

recommendedのドライバをインストールします。
必要ならば再起動します。

sudo apt install --no-install-recommends nvidia-driver-520

GPUが認識できているか確認します。
以下のコマンドは、5秒ごとにリアルタイム監視します。

nvidia-smi -l 5

表示されているCUDAのバージョンは、NVIDIA Driverが対応するCUDAの最大バージョンです。
計算途中のScreenshotなので使用率が63%となっています。

NVIDIA DriverとCUDAの対応

以下でバージョンの対応を調べます。
今回はNVIDIA Driverの最新バージョンを使うので、CUDAも最新バージョンを使います。

1. Why CUDA Compatibility — CUDA Compatibility r555 documentation

CUDAなどのインストール

以下のURLには、様々なOSが掲載されているのでURLの参照先を変更すればUbuntu、Dbian、fedoraなどの各バージョンに対応できます。

Index of /compute/cuda/repos

下記のURLを見て、日付の新しいrepoファイルをダウンロードします。

Index of /compute/cuda/repos/ubuntu1804/x86_64
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.2.89-1_amd64.deb

ダウンロードしたrepoファイルをインストールしてkeyを登録します。

sudo dpkg -i cuda-repo-ubuntu1804_10.2.89-1_amd64.deb
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub

今回は「cuda-11-8」でも上手くいきました。
おそらくcuda-11-8に含まれるNVIDIAのドライバー(cuda-drivers-520)が、上でインストールした「nvidia-driver-520」と同じバージョン(520.61.05)だったからと思われます。
本来はcuda-11-8でなく、cuda-toolkit-11-8をインストールするべきだと思います。

sudo apt install --no-install-recommends cuda-11-8

以下の方が良いと思われます。

sudo apt install --no-install-recommends cuda-toolkit-11-8

cuDNNをインストールします。

sudo apt install --no-install-recommends libcudnn8 libcudnn8-dev

TensorRTをインストールします。

sudo apt install --no-install-recommends libnvinfer8 libnvinfer-dev
sudo apt install --no-install-recommends libnvinfer-plugin8 libnvinfer-plugin-dev

環境変数の設定

vi .bashrc

以下の内容を記載します。

export PATH="/usr/local/cuda-11.8/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"

反映させます。

. .bashrc

または

source .bashrc

追加の作業

ここまでの作業を行ってからGPUを確認するスクリプトを動かすとエラーになります。

2022-10-09 21:42:23.724135: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu
2022-10-09 21:42:23.724151: I tensorflow/compiler/xla/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
2022-10-09 21:42:24.380296: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu
2022-10-09 21:42:24.380357: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu
2022-10-09 21:42:24.380366: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.

libnvinfer8をインストールしましたが、実際にはlibnvinfer7を参照するようなのでシンボリックリンクを作成します。
はじめにlibnvinfer8とlibnvinfer-plugin8に含まれるファイルがインストールされたディレクトリを探します。

dpkg -L libnvinfer8
dpkg -L libnvinfer-plugin8

libnvinferのシンボリックリンクを作成します。

cd /usr/lib/x86_64-linux-gnu
sudo ln -s libnvinfer.so.8.5.1 libnvinfer.so.7
sudo ln -s libnvinfer_plugin.so.8.5.1 libnvinfer_plugin.so.7

libcublasLtとlibcublasのファイルもバージョン違いを参照するようなので、findで探してシンボリックリンクを作成します。

sudo find /usr/* -name libcublasLt*
sudo find /usr/* -name libcublas*

cd /usr/local/cuda-11.8/targets/x86_64-linux/lib/
sudo ln -s libcublasLt.so.11.11.3.6 libcublasLt.so.10
sudo ln -s libcublas.so.11.11.3.6 libcublas.so.10

CUDAのバージョン

インストールしたCUDAのバージョンをnvccで確認します。

nvcc -V

CUDA11.8がインストールされていることが確認できます。

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0

TensorFlowのインストール

pipenvなどで仮想環境を作成してからインストールした方が良いと思います。

pip install tensorflow-gpu

GPUの確認

pythonを起動します。

python

GPUを認識できているかを確認します。

from tensorflow.python.client import device_lib
device_lib.list_local_devices()

または以下の方法でも良いです。

import tensorflow as tf
print("Num GPUs Available: ", len(tf.config.list_physical_devices('GPU')))

Comments