【WSL2 + docker + CUDA】Kaggle docker imageでGPU環境構築
前提
Microsoftのインストールガイド
を参考に
は済んでいるものとします。
1.実行環境
- OS:Windows10 Home (OSビルド:21376.1)
- Windows Insider Program:Devチャンネル
- CPU:AMD Ryzen 7 3700X 8-Core Processor
- GPU:NVIDIA GeForce RTX 2070 super -Linux ディストリビューション:Ubuntu-18.04 -CUDA driver version:470.14 -CUDA tool kit version:11.3
2.Linuxディストリビューションのインストール
コマンドプロンプトを開いて以下のコマンドを入力するとUbuntu-18.04がインストールされます。
$ wsl --install -d Ubuntu-18.04
終了すると、Ubuntu-18.04のターミナルが自動的に起動するのでユーザー名とパスワードを入力してください。
このコマンドで以下の処理が実行されます。
- 「Linux 用 Windows サブシステム (WSL)」と「仮想マシン プラットフォーム」の有効化
- 最新の Linux カーネルのダウンロード・インストール
- WSL 2 を既定値として設定
- 指定の Linux ディストリビューション (この場合 Ubuntu 20.04) のダウンロード・インストール
3. CUDA on WSLのインストール
以下のリンクからお手持ちのGPUのシリーズ(Gerforce or Quadro)に合わせたインストーラーをダウンロードできます。
GPU in Windows Subsystem for Linux (WSL) | NVIDIA Developerdeveloper.nvidia.com
これが済んだら、インストーラーを開くとインストールされていきます。
※ゲーミングPCなどを持っていて最初からNVIDIAまわりのソフトが入っている場合はカスタムインストールを選択してクリーンインストールを選ぶと上手くいきます。
4.CUDA Toolkitのインストール
2でインストールしたUbuntu18.04で以下のコマンドを実行していきます。
ここで、cuda-toolkitのバージョンはPower Shellなどを開いてnvidia-smiから確認してください。
$ apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub $ sh -c 'echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/cuda.list' $ sudo apt-get update $ sudo apt-get install -y cuda-toolkit-11-3
5.CUDAアプリケーションの実行
ここまでの作業でWSL上でCUDAプログラムを動かせる確認するために以下のコマンドを実行してください。
$ cd /usr/local/cuda/samples/4_Finance/BlackScholes $ sudo make $ ./BlackScholes
図のようにTest passedと出れば問題なく実行できています。
5.dockerのインストール
以下のコマンドでdockerがインストールされます。
$ curl https://get.docker.com | sh
実行すると、docker desktop for windowsをおススメします的な文が表示されますが無視してください。
NVIDIAのドキュメントによると。docker desktopはWSLはサポートしていますが、GPU関連はまだサポートしていないようです。
6. NVIDIA Container Toolkitのインストール
普通にインストールすると、GPGキーが安定版を選んでしまうのでプレビュー版をインストールするように以下のコマンドを実行します。
$ 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 $ sudo apt-get update $ sudo apt-get install -y nvidia-docker2
7.CUDAコンテナのビルド
これでdocker上でGPUが使えるはずなので、試しにCUDAコンテナを実行してみます。
$ sudo service docker start $ sudo docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
普通はこれで無事にビルドされるのですが、私の場合は以下のエラーがでました。。。
$ sudo docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"process_linux.go:432: running prestart hook 0 caused \\\"error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: initialization error: driver error: failed to process request unknown. ERRO[0000] error waiting for container: context canceled
このエラーはNVIDIA側も認知しているようで、CUDA on WSL2フォーラムを読みまくったところ次のようにすれば無事にビルドできました。
$ apt-get install \ libnvidia-container1=1.3.3~rc.2-1 \ libnvidia-container-tools=1.3.3~rc.2-1 \ nvidia-container-toolkit=1.4.1-1 \ nvidia-container-runtime=3.4.1-1 \ nvidia-docker2=2.5.0-1 $ sudo docker service stop $ sudo docker service start $ sudo docker run -it --gpus all --env NVIDIA_DISABLE_REQUIRE=1 nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
8.Kaggle docker imageのビルド
ここまでくれば後は簡単です。次のコマンドで最新のkaggle notebookと同様の環境構築ができます。
$ sudo docker run -it --gpus all --env NVIDIA_DISABLE_REQUIRE=1 gcr.io/kaggle-gpu-images/python:latest