GPU有効なJupyter Notebook on Docker on WSL2 on Windowsで動かす
機械学習にはもはや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つが必要になります。
- WSL 2
- Windows 11
- Nvidia Drivers for CUDA
- Linux Development Environment
- 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ターミナル(管理者)を開きます。
プレビュービルドをインストールしているので、簡略化したインストールで終わりです。らくちん。
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チャネルがインストールされているか
- 2021/08/28現在でOS ビルド 22000.178なので、これより大きい番号かどうか
- https://faq.nec-lavie.jp/qasearch/1007/app/servlet/relatedqa?QID=019101
- 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にアクセスしましょう。