今日勉強したことを
つらつらと
logo

GPU有効なJupyter Notebook on Docker on WSL2 on Windowsで動かす

機械学習を始めます!そのまえの環境設定は大変。dockerならIaCで、コピーしてくるだけで環境構築!

機械学習にはもはやGPU必須になっています。 クラウド上に環境構築するのが手っ取り早いような気もしますが、家にGPUがあるなら使わない手はありません。

GPUを持っているということは、ゲーミングPCとして買った場合がほとんどだと思うのですが、ゲーミングPCだとLinuxにすると動かないゲームがたくさんあります。なので、機械学習もWindowsで動かそうとしました。

環境

Geforce GTX 1650

やり方

nvidiaのCUDA TOOLKIT DOCUMENTATIONのCUDA on WSLを読むのが手っ取り早いです。 https://docs.nvidia.com/cuda/wsl-user-guide/index.html

英語なので、この記事では軽く解説していきます。

1. Introduction(イントロダクション)

CUDA on WSLの概要を説明しています。図を眺めてみましょう。

OSとしてWindowsが動いていています。
その上にnvidiaのWindows用ドライバがあり、そこでGPUを仮想デバイスとして扱えるようにしています。
WSL環境があり、Linuxカーネルが動いています。
Linux上でNVIDIA CUDAが動いて、GPUを利用したプログラミングを可能にしています。
これらの環境がある上で、WSL上にdockerを動かします。この環境を作っておけばTensorFlowやPyTorech、mxnetなどの機械学習フレームワークでGPUを利用できるようになります。

新しいフレームワークを試すときも、セットアップは各フレームワークが用意してくれているdockerコンテナを使えるようになるので、超簡単になります。

2. Getting Started(はじめる)

下記の4つが必要になります。

  1. WSL 2
  2. Windows 11
  3. Nvidia Drivers for CUDA
  4. Linux Development Environment
  5. docker for windows

1. Windows 11

こちらのページを参考に、Windows11のプレビュービルドをインストールします。 https://news.mynavi.jp/article/20210630-1912120/

2. WSL 2

Microsoftの公式ドキュメントがわかりやすいです。 WSLは2が必要になります。

https://docs.microsoft.com/ja-jp/windows/wsl/install-win10

管理者特権でコマンド ウィンドウを開くには、Windowsボタンを右クリックして、Windowsターミナル(管理者)を開きます。

image-20210828170649404

プレビュービルドをインストールしているので、簡略化したインストールで終わりです。らくちん。

wsl --install

もしWSL2がインストール済みだった場合は、念のためupdateしておきましょう。

wsl --update

3. Nvidia Drivers for CUDA

https://developer.nvidia.com/cuda/wsl

からGet CUDA Driverをクリックして、GEFORCE DRIVERをインストールしましょう。WSL用のドライバを含む特別なドライバです。

4. Linux Development Environment

WSL上のUbuntuで、下記のコマンドを実行します。

wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.4.0/local_installers/cuda-repo-wsl-ubuntu-11-4-local_11.4.0-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-11-4-local_11.4.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-wsl-ubuntu-11-4-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

ここまで問題ないか確認する

ここまでのインストールが問題なければ、WSL上でCUDAを利用したプログラムが動きます。toolkitと一緒にサンプルプログラムがインストールされているので、ビルドして実行してみましょう。

cd /usr/local/cuda-11.4/samples/4_Finance/BlackScholes
make BlackScholes
./BlackScholes

次のような実行結果が表示されればOKです。

[./BlackScholes] - Starting...
GPU Device 0: "Turing" with compute capability 7.5

Initializing data...
...allocating CPU memory for options.
...allocating GPU memory for options.
...generating input data in CPU mem.
...copying input data to GPU mem.
Data init done.

Executing Black-Scholes GPU kernel (512 iterations)...
Options count             : 8000000
BlackScholesGPU() time    : 0.746732 msec
Effective memory bandwidth: 107.133424 GB/s
Gigaoptions per second    : 10.713342

BlackScholes, Throughput = 10.7133 GOptions/s, Time = 0.00075 s, Size = 8000000 options, NumDevsUsed = 1, Workgroup = 128

Reading back GPU results...
Checking the results...
...running CPU calculations.

Comparing the results...
L1 norm: 1.741792E-07
Max absolute error: 1.192093E-05

Shutting down...
...releasing GPU memory.
...releasing CPU memory.
Shutdown done.

[BlackScholes] - Test Summary

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

Test passed

表示されなかったら何か間違えているので、次のあたりを重点的に確認してみましょう。

  • そもそもGPUを持っているか
  • Windows11のDevチャネルがインストールされているか

  • CUDA on Windows Subsystem for Linux (WSL) - Public Previewのnvidiaドライバをインストールしたか
  • WSLは2になっているか

    • Linuxカーネルのバージョンを確認して、WSL2と入っていればOK
    • Ubuntuでuname -rを実行
  • 再起動する

    • Windowsの更新プログラムのインストール待ちを終わらせる
    • nvidiaドライバを再起動したあとに、WSLの再起動が必要だが、やってないかも?

5. docker for windows

docker desktopをインストールします。 https://www.docker.com/products/docker-desktop

インストールしたら、バックエンドとしてUbuntuを選択しておいたほうが幸せになれます。 https://nxdataka.netlify.app/docker-start/#%E6%89%8B%E9%A0%863docker%E5%B0%8E%E5%85%A5

おわり!

これでややこしいセットアップは終わりです! あとはdockerがなんとかしてくれます。

注意点ですが、WSL2はWindows上のファイルアクセスが非常に遅いです。もし機械学習で大量のデータにアクセスなら、WSL2上の仮想ディスクに配置したほうが良いです。

WindowsからWSL2の仮想ディスクへのアクセスは普通なので、\\wsl$\をエクスプローラで開けば普通のフォルダのように扱えます。裏ではWSLがパーミッションを管理しているので気をつけなければなりませんが。

まずはベンチマークを取るだけの軽いコンテナの動かしてみて、動作確認してみましょう。

docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark

動かしてみる

それでは早速jupyter-notebookを動かしてみます。

docker run -it --gpus all -p 8888:8888 tensorflow/tensorflow:latest-gpu-py3-jupyter
[I 09:12:15.824 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 09:12:15.830 NotebookApp]

    To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-1-open.html
    Or copy and paste one of these URLs:
        http://8b78f3fd34a1:8888/?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
     or http://127.0.0.1:8888/?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

といった表示が出ればOKです。 http://127.0.0.1から始まるURLにアクセスすると、Jupyter Notebookが出ます!tokenは毎回変わるので、必ず自分のコンソールに表示されたURLにアクセスしましょう。


© 2021 simodake