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は、この問題の修正に取り組んでおり、まもなくドライバーが更新されると記載されています。

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
      また、Ubuntuにインストールされているgccのバージョンを確認するには、次のようにコマンドを入力します。
      gcc --version
      Ubuntu20.4なら、gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)と表示されていればOKです。
      (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)。

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


構築の過程で遭遇した複数のエラーについて、ヒントとなった記事です。

8.1.エラーメッセージに関する対処

    • Dockerが動いていない
      # エラーメッセージ
      Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

対処
 sudo service docker start  コマンドを実行してみる。
Dockerをアンインストール後に、再度インストールする。

    • Dockerコマンド実行時にGPUが認識されない
      # エラーメッセージ
      docker: Error response from daemon: linux runtime spec devices: could not select device driver "" with capabilities: [[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.公式

      • Microsoft docs
        Microsoft – docs:Windows 10 用 Windows Subsystem for Linuxのインストールガイド(Link)
          
        WSL 2 で NVIDIA CUDA を有効にする(Link)
           
        WSL2でのDockerリモートコンテナーの概要(Link)
         
        WSL コマンドと起動構成(Link)
      • Docker docs
        Docker Desktop WSL 2 backend(Link)
          
        Docker-docs-ja – Docker Desktop WSL 2 バックエンド(Link)
          
        docker-docs – Install Docker Engine on Ubuntu(Link)
      • TensorFlow
        TensorFlow Dockerの要件(Link)
      • NVIDIA
        NVIDIA CONTAINER TOOLKIT(Link)
         
        CUDA Toolkit v11.1.1 -NVIDIA CUDA Installation Guide for Linux(Link)
         
        CUDA Toolkit v11.1.1 – Release Notes(Link)
         
        CUDA ツールキットと互換性のあるドライバのバージョン(Link)
         
        NVIDIA Japan – NVIDIA Docker って今どうなってるの? (20.09 版)(Link)
         
        NVIDIA/nvidia-docker – Frequently Asked Questions(Link)
      • dokcerhub
        tensorflow/tensorflow(Link)

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.引用文献


  1. 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
  2. Microsoft. (2020).  Docs: Enable NVIDIA CUDA in WSL 2. Retrieved from https://docs.microsoft.com/en-us/windows/win32/direct3d12/gpu-cuda-in-wsl
  3. 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
  4. Microsoft. (2020). Docs: Windows 10 用 Windows Subsystem for Linux のインストール ガイド. Retrieved from https://docs.microsoft.com/ja-jp/windows/wsl/install-win10
  5. 杜甫々.(2019). Docker export/import/save/loadコマンド. Retrieved from http://www.tohoho-web.com/docker/docker_export.html
  6. 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
  7. 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
  8. docker.  dokcer docs: Install Docker Engine on Ubuntu – Uninstall Docker EngineRetrieved from https://docs.docker.com/engine/install/ubuntu/#uninstall-docker-engine
  9. NVIDIA. NVIDIA CONTAINER TOOLKIT:  Overview. Retrieved from https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/overview.html#overview
  10. 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
  11. dockerhub. tensorflow / tensorflow Retrieved from https://hub.docker.com/r/tensorflow/tensorflow/
  12. 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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です