ようやくうまくいきました。うまく行かなかったら【ゲーミングPCでWSL2でGPUを使う設定を試してみた
】とする予定でした。
設定がうまく行かず10回以上もUbuntu を入れたりDockerをいれたりとしていて、やっているうちにグダグダになり力尽きた感じになっているので割と淡白な内容になっています。
今回はゲーミングPCのGPUをTensorFlow
からも使用できないか試してみたというものです。Linuxを入れるというのも当然ありですが、今回はWSL2環境でのUbuntu
から使用しています。最近のWindows 10 Insider Program
のバージョンからWSL2
上のOSからもGPUが使用できるようになったようです。正式リリースまではまだあると思いますが、ちょっと試してみた。そして今回もハマったとなります。NVIDIAサイトにも情報があるのでこちらも参考にしてください。
今回使用したPC環境
- PC : DELL ALIENWARE M15 R3ゲーミング ノートパソコン
- OS : Windows 10 Home(64bit)
- GPU : NVIDIA GeForce RTX 2080 SUPER 8GB GDDR6 with Max-Q Design
WSL2のUbuntuイメージへ環境設定を行う
以下を参考にさせていただきました。
Windows 10 Insider Programの有効化(Windows 10 Insider Preview 20150以降)
既に行っているようであれば不要
自分が行ったときのバージョンをwinverコマンド
で表示すると以下の様になっていました(2021.02.20現在)。
WSL2の有効化
既に行っているようであれば作業は不要です。
過去にも同様の作業を行っているのでそちらを参考にして設定を行ってください。
Ubuntu のインストール
Microsoft Storeアプリ
からUbuntu
を検索してバージョン20.04LTSをインストールします。
18.04LTS(以下18.04)も表示されますが今回は20.04LTSをインストールします。バージョンによって必要になるドライバやライブラリの依存関係が異なるので注意してください。同じ手順では18.04ではTensorFlowは動作していません。
画面上部の【インストール】ボタンをクリックするとUbuntuがインストールされます。
インストールが完了したらボタンが【起動】と表示が変更になるのでそれをクリックするとコンソールが開きます。 スタートメニューにもUbuntu20.04LTSは表示されているのでそれをクリックしても同様にコンソールが開きます。
起動すると初期ユーザ名とパスワードを尋ねるので、入力をしておきましょう。
WSL の Ubuntu の更新の確認
Powershell
などで以下のように実行します。
PS > wsl uname -r
バージョンが4.9.121以降になっていることを確認します。今回確認したところ以下のような表示になっていました。
異なっていれば以下を実行して更新作業を行ってください。
PS > wsl --update
プレビュー版の NVIDIA グラフィックスドライバのインストール
一旦、Ubuntuを停止させるために以下をPowershell
から実行します。
PS > wsl --shutdown
つづいて、プレビュー版の NVIDIA グラフィックスドライバは以下よりダウンロードを行います。(要ユーザ登録)
ドライバは2つありますが、必ずGeForce用のものを使用することに注意をしてください。
※Ubuntu上ではドライバは必要ありませんのでインストールする作業は不要です。
インストール後にドライババージョンは以下のようになっていました。(バージョン465.42)
WSL2上のUbuntuでの初期設定
以下を行っておきます。apt
関係の初期化とパッケージのアップグレードです。また、この時点でPython3のバージョンアップを行っておきます。
$ sudo apt update $ sudo apt -yV upgrade $ sudo apt -y install python3-dev python3-pip python3-setuptools python3-numpy
NVIDIA CUDA ツールキットのインストール
以下のサイトからCUDAツールキットのダウンロードとインストールを行います。サイト上で、OSや入れるツールキットのバージョンを尋ねられるので、
それに答えると以下のような作業手順が表示されるのでこれを実行していきます。 今回はUbuntu20.04LTSに入れるTensorFlowがCUDAツールキットのバージョン11.0を必要とするので以下のようになっています。
作業手順
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin $ sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600 $ wget http://developer.download.nvidia.com/compute/cuda/11.0.2/local_installers/cuda-repo-ubuntu2004-11-0-local_11.0.2-450.51.05-1_amd64.deb $ sudo dpkg -i cuda-repo-ubuntu2004-11-0-local_11.0.2-450.51.05-1_amd64.deb $ sudo apt-key add /var/cuda-repo-ubuntu2004-11-0-local/7fa2af80.pub $ sudo apt-get update $ sudo apt-get -y install cuda
※参考にしたサイトのそのままを行うとバージョン10.1がインストールされます。そのまま作業を行ってもTensorFlowがライブラリバージョンを確定的に行っているようなのでそのままでは以降で失敗するようです。
$ sudo apt -y install nvidia-cuda-dev nvidia-cuda-toolkit nvidia-cuda-toolkit-gcc
TensorFlow 2.4.1 のインストール手順
事前にアプリケーションパッケージのアンインストール
インストールに先立ち、トラブルになりそうな現存のパッケージを一度消去します。
$ sudo apt -y remove python3-keras $ sudo pip3 uninstall -y tensorflow tensorflow-cpu tensorflow-gpu tensorflow_datasets tensorflow-hub keras
libcudnnをインストールする
必要となるcuDNNライブラリを、以下から環境に合わせてダウンロードを行います。
https://developer.nvidia.com/rdp/cudnn-download
認証が必要なのでwgetなどでは簡単に取得できないので、一旦Windowsにダウンロードしてから、WSL環境にコピーするほうが作業が楽です。 今回はCUDA11系に合わせて以下のものをダウンロードしていきます。
WSL環境に持ってきたら以下を実行してインストールを行います。
$ sudo dpkg -i libcudnn8_8.1.0.77-1+cuda11.2_amd64.deb
パス及びライブラリパスの環境変数設定
インストール時にライブラリの格納される場所がバージョンによってまちまちになるようです。今回は以下のようにコマンドラインから設定しました。
常用するのであれば.bashrc
や.profile
に追記しておくのが良いでしょう。
$ export PATH="/usr/local/cuda/bin:$PATH" $ export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
GPU 版 TensorFlow をインストール
あとはGPUを使用できるTensorFlow
をインストールしていきます。依存関係のあるライブラリも同じくインストールを行っています。testresources
に関してはaptでもインストールできるようなエラーメッセージが表示されますが、20.04ではインストール出来ないようです。そのためpipを使用してインストールしています。また、absl-py
はTensorFlowが0.10を要求するのでバージョンを指定してインストールしています。
$ sudo pip3 install testresources $ sudo pip3 install absl-py==0.10 $ sudo pip3 install tensorflow-gpu tensorflow_datasets
エラーなく終われば、インストール作業は完了します。
確認
TensorFlowの実行
$ python3 -c "import tensorflow as tf; print( tf.__version__ )"
実行結果
$ python3 -c "import tensorflow as tf; print( tf.__version__ )" 2021-02-23 02:55:04.207914: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0 2.4.1
メッセージが表示されますが、libcudart.so
が読み込まれたと表示されているので問題はないです。
GPUの認識
以下のコマンドで実行を行います。今回はGPU対応なので、CPUとGPUのどちらもが使用できるようになっているかを調べています。
$ python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
ログ抜粋
[name: "/device:CPU:0" device_type: "CPU" memory_limit: 268435456 locality { } incarnation: 8503975052678194352 , name: "/device:GPU:0" device_type: "GPU" memory_limit: 6889034240 locality { bus_id: 1 links { } } incarnation: 7826019862202533636 physical_device_desc: "device: 0, name: GeForce RTX 2080 Super with Max-Q Design, pci bus id: 0000:01:00.0, compute capability: 7.5" ]
GPUもちゃんと表示されています。
CPU版だけを使用する場合には…
CPUのみを使用する場合には先程のインストールのコマンドを少し修正すればOKです。
$ sudo pip3 install testresources $ sudo pip3 install absl-py==0.10 $ sudo pip3 install tensorflow-cpu tensorflow_datasets
とします。
CPUのみ対応のTensorflow
の実行確認
ログ抜粋
$ python3 -c "import tensorflow as tf; print( tf.__version__ )" 2.4.1 $ python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())" 2021-02-23 23:26:07.670924: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags. [name: "/device:CPU:0" device_type: "CPU" memory_limit: 268435456 locality { } incarnation: 17669417124090449221 ]
デバイス情報のGPUに関しては表示されていません。あと、表示されるログが少ないです。
ベンチマーク
ではベンチマークをしてみたいと思います。今回は以下のものを使用しました。適切なのかはちょっとわからないのですが、GPUがちゃんと動作しているかを 見るのであれば問題ないと思って採用しました。
こちらも参考にしています。
以下のようにリポジトリを取得してベンチマークを計測しています。
$ git clone https://github.com/tensorflow/benchmarks.git $ cd benchmarks/scripts/tf_cnn_benchmarks $ python3 tf_cnn_benchmarks.py --num_gpus=1 --batch_size=32 --model=resnet50 --variable_update=parameter_server
実行結果抜粋
Done warm up Step Img/sec total_loss 1 images/sec: 170.0 +/- 0.0 (jitter = 0.0) 7.765 10 images/sec: 171.2 +/- 0.3 (jitter = 0.5) 8.049 20 images/sec: 171.5 +/- 0.2 (jitter = 0.4) 7.808 30 images/sec: 171.4 +/- 0.2 (jitter = 0.6) 7.976 40 images/sec: 171.3 +/- 0.1 (jitter = 0.6) 7.591 50 images/sec: 171.2 +/- 0.1 (jitter = 0.7) 7.549 60 images/sec: 171.2 +/- 0.1 (jitter = 0.7) 7.818 70 images/sec: 171.1 +/- 0.1 (jitter = 0.6) 7.820 80 images/sec: 171.1 +/- 0.1 (jitter = 0.7) 7.849 90 images/sec: 171.0 +/- 0.1 (jitter = 0.7) 8.027 100 images/sec: 170.9 +/- 0.1 (jitter = 0.9) 8.030 ---------------------------------------------------------------- total images/sec: 170.76 ----------------------------------------------------------------
比較対象がよくわからないので困った感じですが、他の値と類似しているようなのでGPUはちゃんと動いているようです。 ノートPCに入っているGeForceのMax-Q Designシリーズはデスクトップ搭載のカードよりも動作が遅いようですが、今回の計測でも遅くなっているようです。
おわりに
ゲーミングPCに搭載されているGPUを、ゲーム以外でもしようしてみようというネタでした。DELLさんのモニターなのに全くゲームをやっていないというのは問題だよなあと思うのですが、 そこまで3Dのゲームをやっているというユーザでもないので、正直スマんという感じです。
とはいうものの、購入するユーザの中にはGPUを目的に購入する方も多いのかなと思いますし、そういう方の参考になればと思います。