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

投稿者: | 2020年12月18日

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

WSL2のインストール

Hyper-Vの有効化

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

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

デフォルトをWSL2に変更

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

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

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

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

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から下記コマンドを実行する。

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

WSL2上での設定

Ubuntuホストでの設定

動作確認

結果

使用するコンテナは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をダウンロード・インストールする。

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は以下のようなコマンドで実行すれば良い。

VSCodeでリモートから開発

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

 

ref

コメントを残す

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