Fermi Dの学問&技術ブログ

物理、機械学習、プログラミングについて書きます

【WSL2 + docker + CUDA】Kaggle docker imageでGPU環境構築

前提

Microsoftのインストールガイド

docs.microsoft.com

を参考に

  • Windows Insider Program への参加
  • Windows 10 のpreview build (OS ビルド 20262 以降) のインストール

は済んでいるものとします。

1.実行環境

2.Linuxディストリビューションのインストール

コマンドプロンプトを開いて以下のコマンドを入力するとUbuntu-18.04がインストールされます。

$ wsl --install -d Ubuntu-18.04

終了すると、Ubuntu-18.04のターミナルが自動的に起動するのでユーザー名とパスワードを入力してください。

f:id:chozoko:20210502232200p:plain
ユーザー名とパスワード入力

このコマンドで以下の処理が実行されます。

f:id:chozoko:20210520140352p:plain

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

f:id:chozoko:20210520140143p:plain
CUDAアプリケーションの実行

図のように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

参考記事

docs.nvidia.com forums.developer.nvidia.com github.com