CUDA on Docker on WSL2 ~ WSL2でDockerとCUDAを動かす(2020/12/20版)

投稿者: | 2020年12月18日

調子こいてRTX3080を買ってしまったので、Apexだけじゃなくて機械学習もちゃんとやろうと思い、環境構築しました。

WSL2のインストール

Hyper-Vの有効化

管理者権限でPowerShellを起動し、下記コマンドを実行

# 「Hyper-V」の有効化
dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V-All /all /norestart

# 「Windows Subsystem for Linux」の有効化
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

# 「仮想マシンプラットフォームのオプションコンポーネント」を有効化
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

コマンド実行後、設定を反映するためにWindowsを再起動。

デフォルトをWSL2に変更

再起動後、WSL2をデフォルトで使用するために下記コマンドを実行。

wsl --set-default-version 2

WSL2 Linuxカーネルのインストール

Windows 10 用 Windows Subsystem for Linux のインストール ガイドのページから「x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ」をダウンロード・インストールする。

この手順を忘れると以下のようなエラーが出る

Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x800701bc
Error: 0x800701bc WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel

Ubuntuのインストール

Microsoft StoreアプリからUbuntu20.04をダウンロードする。

Windows Insider Programの設定

設定→更新とセキュリティ→Windows Insider Programを開き、Devチャネルへ参加するように設定。

※2020年12月18日時点では、この操作はまだ必要でした。

CUDA Driverのインストール

CUDA on Windows Subsystem for Linux (WSL) – Public PreviewのページからCUDA Driverをダウンロード・インストールする。

※要ユーザ登録

WSLのバージョンの確認

WSL2が正しく使用されているかを確認するため、PowerShellから下記コマンドを実行する。

wsl -l -v

Ubuntu-20.04の欄のVERSIONが2と表示されていれば、WSL2が使用されている。

WSL2上での設定

Ubuntuホストでの設定

sudo apt update
sudo apt upgrade

# Install docker
curl https://get.docker.com | sh
sudo usermod -aG docker $USER

# sudoなしでdockerコマンド使えるように
sudo gpasswd -a $USER docker

# Install nvidia-container-toolkit
# ref: https://qiita.com/Hiroaki-K4/items/c1be8adba18b9f0b4cef
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

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit

sudo service docker restart

動作確認

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

結果

Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance.
        -fullscreen       (run n-body simulation in fullscreen mode)
        -fp64             (use double precision floating point values for simulation)
        -hostmem          (stores simulation data in host memory)
        -benchmark        (run benchmark to measure performance)
        -numbodies=<N>    (number of bodies (>= 1) to run in simulation)
        -device=<d>       (where d=0,1,2.... for the CUDA device to use)
        -numdevices=<i>   (where i=(number of CUDA devices > 0) to use for simulation)
        -compare          (compares simulation results running once on the default GPU and once on the CPU)
        -cpu              (run n-body simulation on the CPU)
        -tipsy=<file.bin> (load a tipsy model file for simulation)

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

> Windowed mode
> Simulation data stored in video memory
> Single precision floating point simulation
> 1 Devices used for simulation
MapSMtoCores for SM 8.6 is undefined.  Default to use 64 Cores/SM
GPU Device 0: "GeForce RTX 3080" with compute capability 8.6

> Compute 8.6 CUDA device: [GeForce RTX 3080]
69632 bodies, total time for 10 iterations: 75.221 ms
= 644.583 billion interactions per second
= 12891.655 single-precision GFLOP/s at 20 flops per interaction

使用するコンテナはNGC(nVIDIA GPU Cloud)に用意されている、CUDAインストール済みのコンテナ(nvcr.io/nvidia/cuda)を推奨する。
CUDA11.1のコンテナを動かそうとしたら「Win側のCUDAが古いからダメ」と言われてしまったので、筆者はUbuntu20.04 + CUDA11.0を使用している。

おまけ

Dockerのホスト側でCUDAを使う

dockerのホストとなるUbuntu20.04でCUDAを使用したい場合は、WSL2用のCUDA Toolkitをダウンロード・インストールする。

# Install CUDA Toolkit
# https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=WSLUbuntu&target_version=20&target_type=debnetwork

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
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/7fa2af80.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/ /"
sudo apt-get update
sudo apt-get -y install cuda
echo 'export PATH=/usr/local/cuda/bin:${PATH}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH}' >> ~/.bashrc

SSHでアクセスできるようにする

外部のPCからSSHでアクセスするには、WindowsからWSLのUbuntuマシンにポートフォワーディングしてやる必要がある。

ポートフォワーディングの設定とWindows側のファイアーウォール(Windows Defender等)でポートをOpenにする必要がある。
ただし、WSL側のIPアドレスが起動する毎に変わるため、いい感じにスクリプトで対応する必要があるらしい。

以下の記事を参考に設定した。

コンテナ内のJupyterLabを使う

SSHと同様に、ポートフォワーディングを設定してやればJupyterLabにもアクセス可能。
WSLのlocalhost:8888を8888に転送するように指定。さらにコンテナ内の8888をWSLの8888に転送するように多段でフォワーディングすることにより、Windows側のブラウザでhttp:localhost:8888にアクセスすればJupyterLabが使える。

NGCのPyTorchコンテナに含まれているJupyterLabにアクセスできるようにするには、docker runは以下のようなコマンドで実行すれば良い。

docker run --gpus all --rm --network host -p 8888:8888 -it nvcr.io/nvidia/pytorch:20.12-py3 jupyter-notebook --no-browser  --allow-root --NotebookApp.token=''

VSCodeでリモートから開発

MacからSSHで繋げるようにしたら、VSCodeからDockerを弄れるようにしたくなるので以下を参考に設定。

# 接続できるか確認(ユーザ名@IPアドレスで指定)
docker -H ssh://user@remote-host ps

# リモートの登録
docker context create remote --docker 'host=ssh://user@remote-host'
docker context use remote
docker ps

 

ref

コメントを残す

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