NVIDIA Drivers for CUDA on WSL(WLS2)でTensorFlow-GPUが動くまでの構築手順
現時点で成功した手順と解決のヒントとなる情報をメモしました。
Windwos上で、UbuntuとDockerコンテナの開発環境にGPUが利用できるのは大きなメリットです。しかし、現時点での環境構築には、複数のドキュメントを参照するなど、統合的な事前知識と準備が不可欠です。
この記事は、WSL2(Windows Subsystem for Linux 2)上のUbuntu20.4に、TensorFlow の公式DockerイメージでGPUを利用するまでの手順を紹介します。すでにWindows上のWSL2でDockerを利用している状態から構築しています。また、手順を含めた情報は投稿時点のものです。
環境は以下のとおりです。
O S:Windows 10 Pro 64-bit (バージョン2004, Build 21277)
CPU:Intel Core i7-10875H
GPU:NVIDIA GeForce RTX 2080 Super with Max-Q Design
この記事は、WSL2上のLinuxディストリビューションにUbuntu20.4を導入した状態を前提としています。
※注意
ドライバーが更新されました。
詳しくは、朗報:NVIDIA Drivers for CUDA on WSL DRIVERアップデート(465.21)をご覧ください。WSL上のCUDA用のNVIDIAドライバー465.12(2020-11-16)は、モバイルプラットフォームで特定のインストールの問題が確認されています1。こちらの環境でも、インストール後にGPUが停止する現象が現れています。既知の回避策は、システムの起動時にデバイスマネージャーからGPUアダプターを無効にしてから再度有効にすることを提案されています。NVIDIAは、この問題の修正に取り組んでおり、まもなくドライバーが更新されると記載されています。

TOC
1.要件の確認
WSL上でGPUを使うには、以下の準備が必要となります。
-
- Windows Insider Previewに登録して、Dev Channelを選択する。
※注意
Windows Insider Previewは、新しい機能を利用できる反面、製品版ほど安定していません12。日常で利用するPCにインストールする場合は、自己責任でリスクを勘案のうえ利用してください。 - OSを更新する。
バージョン2004、ビルド20150以上と記載2されていますが、最新版が良さそうです3。
バージョンとビルド番号は、[Windowsロゴキー]+[Rキー]押下して、名前の枠内にwinver
と入力、[Enterキー]で確認できます。
- WSL2をインストールする。
4.19.121 以降のカーネルバージョンが必要です。
すでにインストールしている場合は、PowerShell で以下のコマンドを実行すると、バージョンを確認できます。
wsl cat /proc/versio
- gccをインストールする。
sudo apt update
sudo apt install build-essential
gcc --version
(LinuxディストリビューションごとのGCCバージョンは、NVIDIAの1.1. System Requirementsを参照)
- Windows側にDocker Desktopをインストールして、WSL2上で利用している場合は、連携を解除する。
DockerのSettings > [General] で [Use the WSL2 based engine]のチェックを外す4(後にUbuntu側のDockerを起動できず、アンインストールしました)
※注意
以降は、WSLとDockerの連携は利用せず、Ubuntu内のDockerを利用します(Dockerのアンインストール前に、利用しているDockerコンテナを保存5)。
- Windows Insider Previewに登録して、Dev Channelを選択する。
2.NVIDIAドライバーのインストール
WSLページのCUDAの ダウンロードセクションからNVIDIAドライバーをダウンロードします。
ドライバーのダウンロードには、アカウント登録が必要です。
ログイン後にページ中ほどの[ Get CUAD Driver ]からダウンロードページに移動して、PCに搭載されているNVIDIA GPUのタイプ(GeForceおよびQuadro)に応じたドライバーを選択します。
※注意
冒頭に記載した通り、ラップトップにインストールした場合に既知の不具合が認められます。それぞれの環境について、十分に検討のうえ実施してください。

3.CUDAツールキットのインストール
Table 2. CUDA Toolkit and Compatible Driver Versionsを確認して、NVIDIAドライバー側のバージョンに対応しているCUDAツールキットのバージョンをインストールします(NVIDIAドライバーのバージョンは、465.12でしたので、CUDA Toolkitの11.1を選択しました)。

選択すると、ページ下部にインストール用のコマンドが表示されます。これを、1行ずつターミナルにペーストして実行します(詳しく調べずにRunfileパッケージを選択しました)。
※注意
NVIDIAのドキュメントでは、ディストリビューション固有(この記事ではUbuntu)のパッケージ(RPM、Debパッケージ)と、ディストリビューションに依存しないパッケージ(runfileパッケージ)の2種類があり、ディストリビューション固有のパッケージは、ディストリビューションのネイティブパッケージ管理システムと接続するため、こちらを推奨すると書かれています6。
4.CUDA アプリケーションの実行
3までの作業が完了したら、UbuntuからCUDAを利用したGPUの演算ができるようになります。
試しにサンプルを実行してみます。
$ cd /usr/local/cuda/samples/4_Finance/BlackScholes
$ sudo make
$ ./BlackScholes
CUDAツールキットでrunfileパッケージを選択したため心配でしたが、問題なく動作しているようです。次回の環境構築では、debパッケージを選択してみたいと思います(今のところ支障がないので、このまま進めてみます)。

5.Dockerのインストール
Ubuntu側にDockerをインストールします7。
これまでは、Windows側のDocker DesktopとWSLを連携させていましたが、今後については、RStudioを含めてUbuntu側のDockerを利用します(一度目は起動できず、アンインストール8してから実行しました)。
$ curl https://get.docker.com | sh
$ # バージョンを確認
$ docker -v
Docker version 20.10.0, build 7287ab3
6.NVIDIA Container Toolkitのインストール
このツールキットには、NVIDIA GPUを活用するためのコンテナを自動的に設定するコンテナランタイムライブラリとユーティリティが含まれています9。
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container-experimental.list | sudo tee /etc/apt/sources.list.d/libnvidia-container-experimental.list
パッケージリストを更新した後、NVIDIAランタイムパッケージ(およびそれらの依存関係)をインストールします。
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
別のWSL 2ウィンドウを開き、以下のコマンドを使用して再度Dockerデーモンを起動してインストールを完了させます。
$ sudo service docker stop
$ sudo service docker start
7.Dockerコンテナの実行
NIVIDIAのドキュメント10に従ってWSL2環境でGPUコンテナーを実行してみます。
$ docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
問題なく動作すれば、イメージのダウンロードの開始とサンプルのシミュレーションが実行されます。

7.1.TensorFlowDockerイメージ11
TensorFlowのイメージを起動して、Jupyterから付属のチュートリアルノートブックを実行してみます(以下のDockerコマンドは、それぞれの環境に合わせて変更してください)。
$ cd /mnt/c/Users/(USER_NAME)/(YOUR_WORKING_DIR)
$ docker run -it --gpus all -v $(pwd):/tf/notebooks -p 8888:8888 --name tfnote tensorflow/tensorflow:latest-gpu-jupyter --gpus all -v $(pwd):/tf/notebooks -p 8888:8888 tensorflow/tensorflow:latest-gpu-jupyter
表示された、 http://127.0.0.1:8888/?token= ...
の127.0.0.1をlocalhostに置きかえてから任意のブラウザでアクセスすると、Jupyter notebookが起動して以下のような画面になります。

tensorflow-tutorialsのclassification.ipynbを開いて実行します。
サンプルのデータセットは、衣料品10カテゴリ、70,000件のグレースケール画像を含むFashionMNISTデータセットを使用します。FashionMNISTデータセットは、60,000件のトレーニングセットと10,000件のテストセットで構成されています。
まず、60,000件のデータセットでモデルを学習して、残りの10,000件について分類の正確さを確認します。
上から順に実行して、モデルの学習を開始します。

-
- テスト用のデータセットを使用したモデルの性能


これで、目的のコンテナを使用してモデル開発を行うことができます。
ENJOY‼
8.FAQ
構築の過程で遭遇した複数のエラーについて、ヒントとなった記事です。
-
- WLSディストリビューションの再インストール方法
Microsoft docs:ディストリビューションの登録解除と再インストール
@IT:Windows 10のWSL環境を初期化してクリーンな状態に戻す - Ubuntuに導入したLinuxbrewでは、古いGCC(gcc version 5.5.0)がインストールされてしまう
がぶろぐ:MinGWからWSL上のubuntuのgccに乗り換えた
- 古いCUDAのアンインストール方法
たこ104のブログ:Ubuntu16.4 でCUDA9をアンインストールしてCUDA8を入れる
- UbuntuのDockerを
sudo
無しで操作する
dockerdocs:rootユーザー以外でdockerを管理する
- WLSディストリビューションの再インストール方法
8.1.エラーメッセージに関する対処
-
- Dockerが動いていない
# エラーメッセージ
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
- Dockerが動いていない
対処 sudo service docker start
コマンドを実行してみる。
Dockerをアンインストール後に、再度インストールする。
-
- Dockerコマンド実行時にGPUが認識されない
# エラーメッセージ
docker: Error response from daemon: linux runtime spec devices: could not select device driver "" with capabilities: [[gpu]].
- Dockerコマンド実行時にGPUが認識されない
対処
以下の記事を参考にして、Ubuntuの再インストールからやり直した。
参考記事
・Qiita:WSL2でdocker と CUDAを綺麗に使うためには
・Qiita:Docker(19.03)でgpu有効化してpytorchで訓練するまでやる(Ubuntu18.04)
・Qiita:[エラー対処法]Dockerが動かない[Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?]
9.参考文献
9. 1.公式
-
-
- TensorFlow
TensorFlow Dockerの要件(Link)
- TensorFlow
-
-
-
- dokcerhub
tensorflow/tensorflow(Link)
- dokcerhub
-
9.2.先人の有益な知見
-
-
- Qiita:WSL上でDockerを動かす際に躓いたこと(Link)
- Qiita:TensorFlowでGPU学習させるためにCUDA周りではまったときの対処法(Link)
- Qiita:待ってました CUDA on WSL 2(Link)
- 金子邦彦研究室:WSL2でGPUを使う(Link)
- ともやん・どっと・ねっと:Windows Subsystem for Linux 2 (WSL 2) – WSL 2 の systemd 問題(Link)
- Ginpen.com:WSL 2でCannot connect to the Docker daemonと言われたら、デフォルトを確認する。(Link)
-
10.引用文献
- NVIDIA.(2020). CUDA Toolkit Documentation v11.1.1: Installing NVIDIA Drivers. Retrieved from https://docs.nvidia.com/cuda/wsl-user-guide/index.html#installing-nvidia-drivers
- Microsoft. (2020). Docs: Enable NVIDIA CUDA in WSL 2. Retrieved from https://docs.microsoft.com/en-us/windows/win32/direct3d12/gpu-cuda-in-wsl
- Kuninobu SASAKI. (2020). Qiita: 待ってました CUDA on WSL 2. Retrieved from https://qiita.com/ksasaki/items/ee864abd74f95fea1efa#windows-10-insider-preview-build-20150-%E4%BB%A5%E9%99%8D-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
- Microsoft. (2020). Docs: Windows 10 用 Windows Subsystem for Linux のインストール ガイド. Retrieved from https://docs.microsoft.com/ja-jp/windows/wsl/install-win10
- 杜甫々.(2019). Docker export/import/save/loadコマンド. Retrieved from http://www.tohoho-web.com/docker/docker_export.html
- NVIDIA.(2020). CUDA Toolkit Documentation v11.1.1: Installation Guide Linux – 2.5. Choose an Installation Method. Retrieved from https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#choose-installation-method
- NVIDIA.(2020). CUDA Toolkit Documentation v11.1.1: CUDA on WSL – Install Docker. Retrieved from https://docs.nvidia.com/cuda/wsl-user-guide/index.html#installing-docker
- docker. dokcer docs: Install Docker Engine on Ubuntu – Uninstall Docker EngineRetrieved from https://docs.docker.com/engine/install/ubuntu/#uninstall-docker-engine
- NVIDIA. NVIDIA CONTAINER TOOLKIT: Overview. Retrieved from https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/overview.html#overview
- NVIDIA.(2020). CUDA Toolkit Documentation v11.1.1: CUDA on WSL – Install Docker. Retrieved from https://docs.nvidia.com/cuda/wsl-user-guide/index.html#running-containers
- dockerhub. tensorflow / tensorflow Retrieved from https://hub.docker.com/r/tensorflow/tensorflow/
- Microsoft. (2020). Docs: フライティングの詳細 Dev チャネル. Retrieved from https://docs.microsoft.com/ja-jp/windows-insider/flighting#dev-%E3%83%81%E3%83%A3%E3%83%8D%E3%83%ABdev-channel