#CUDA対応したWSL2+VSCodeでディープラーニングの開発環境を作ってみる
概要
WSLことWindows Subsystem for Linuxは、Windowsで社内システムに繋ぎつつLinuxのシステム開発を行う我々サラリーエンジニアの強い味方です。
そんなWSLがWindows Insider Preview 20150.1000からCUDAに対応したという話を聞きつけました。1
今回はWSL2とVSCodeを使ってディープラーニングの開発環境を作ってみようと思います。2
導入環境にはGPUが刺さっていることが前提です。
この記事でやってみること
- Windows上にWSL2でUbuntuを導入する
- WSL2のUbuntuでNvidia Driver for CUDAを認識する
- VSCodeからWSL2の環境を触れるようにする
- WSL2上にDockerをインストールして実行環境を構築する
- TensorFlow on Dockerの環境をWSL上に構築する
やってみる
1. Insider Previewに参加して最新のPreview Buildを導入する
要はWindows Updateで導入できるのですが、Insider Previewに参加することでプレビュー用の特殊なUpdateを入手することができます。
手順は簡単ですが、そこそこ時間がかかります。
ポイントは、Insiderをファストに設定すること。あとはいつもどおりにWindows Updateを実行するだけで、天から神(Cuda対応のWSL2)が降りてきます。
一晩寝かせたら無事に新しいバージョンが手に入りました。
PS C:\Users\hirose.tomoki> wsl --update
更新をチェック中...
利用できる更新はありません。
カーネル バージョン: 4.19.121
カーネルバージョンが4.19.121以上になっていない場合は、Windows Updateの適用が不十分です。
Windows Updateメニューの詳細オプションから他のMicrosoft製品の更新プログラムを受け取るを選択して、改めて更新がないかチェックしてみてください。
2. WSL2を有効化してUbuntuをインストールする
ここの作業は管理者権限のPowerShell上で実行していきます。
この手順に入る前にLinuxカーネルの更新をしておくと安心です。
https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel
手順1. WSL1を有効化
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
展開イメージのサービスと管理ツール
バージョン: 10.0.20150.1000
イメージのバージョン: 10.0.20150.1000
機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。
手順2. WSL2を有効化
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
展開イメージのサービスと管理ツール
バージョン: 10.0.20150.1000
イメージのバージョン: 10.0.20150.1000
機能を有効にしています
[==========================100.0%==========================]
操作は正常に完了しました。
有効化できたら一旦Windowsを再起動します。
手順3. WSL2をデフォルトに設定する
wsl.exe --set-default-version 2
コマンドが実行できたらWSL2が有効化されたので、Ubuntuのインストールを行っていきます。
手順4. Ubuntu on WSLをインストールする
Windows StoreにアクセスしてUbuntuを検索します。今回は仕事でも使っているので18.04LTSにしました。
Windows Storeのアクセス方法がわからない……という方はWin+Rを開いて**ms-windows-store:**を実行するとURIスキームからStore起動が着火します。
インストールが終わったらスタートメニューからUbuntuを起動します。
手順5. Ubuntuのセットアップ
無事にUbuntuが起動したのでセットアップを行います。
ユーザ名とPWを設定していきますが、ここでのユーザ名はWindowsと独立している点は注意事項です。
ユーザとパスワードを設定したのでWindows Terminalから開いてみました。
Windows上からunameコマンドが叩けています!
3. NVIDIA Drivers for CUDA on WSLをインストールする
この作業は特に悩むこともないと思いますので、下記URLから辿ってドライバのインストールを進めていきます。
https://developer.nvidia.com/cuda/wsl
今回はver455.41がインストールされました。
4. VSCodeからWSLの環境へアクセスする
とりあえずUbuntu on WSL2とCUDA on WSL2(Preview)が整ったので、続いてはVSCode on WindowsでLinuxの開発ができる環境を作っていきます。
VSCodeをインストールしていない方は、今すぐこちらからどうぞ。
手順1. 拡張機能[Remote -WSL]をインストールする
Windows側のVSCodeにこちらをインストールしていきます。
WSLが有効化されているのでレコメンドしてくれているのでしょうか。
手順2. WSLからVSCodeを起動する
拡張機能を入れたのはWindowsでしたが、実際に開発するにあたってはWSLから起動していきます。
とりあえずホームディレクトリで起動してみます。
すると、新しくVSCodeのウィンドウが立ち上がります。
立ち上がったVSCodeは、下の図のようにWSL:Ubuntu-18.04とあるので、連携がうまく行っていることがわかります。
何が起きているかというと、WSL2上で起動したVSCodeへWindows上でリモートアクセスしています。
なので、ここで起動したVSCodeでコンソールを開くとPowerShellではなくbashにアタッチします。こうなれば後はただのUbuntuです。
一度起動させると、WSLを起動してcode .せずとも、Ctr+Shift+PのコマンドパレットやCtr+Rの最近使用した項目からwslを検索すると、ショートカットすることができます。
5. ディープラーニング用の環境構築
ここまで来たらもう一息です。
ようやく本題ですが、ディープラーニング用の環境を作っていきましょう。
手順1. WSL2上にDockerをインストールする
詳しくは解説しませんが、Dockerはここにあるとおりです。
手順がスクリプトにまとまっているので、ダウンロードして実行すればOKです。
手順2. NVIDIA Container Toolkitをインストールする
詳しくは解説しませんので、下記を参考にインストールしてください。
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 update
sudo apt install -y nvidia-docker2
インストールできたらdockerを起動しておきます。
# WSLの仕様でsystemctlだと動かないので注意
sudo service docker start
手順3. WSL + Docker + CUDA環境の動作確認
うまく動くかどうか試していきます。
今回はDockerHubのTensorFlowリポジトリからv2.2.0-gpuを利用していきます。
$ docker run --gpus all -it --rm tensorflow/tensorflow:2.2.0-gpu /bin/bash
________ _______________
___ __/__________________________________ ____/__ /________ __
__ / _ _ \_ __ \_ ___/ __ \_ ___/_ /_ __ /_ __ \_ | /| / /
_ / / __/ / / /(__ )/ /_/ / / _ __/ _ / / /_/ /_ |/ |/ /
/_/ \___//_/ /_//____/ \____//_/ /_/ /_/ \____/____/|__/
$ python
Python 3.6.9 (default, Apr 18 2020, 01:56:04)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from tensorflow.python.client import device_lib
>>> device_lib.list_local_devices()
name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 3225865422
locality {
bus_id: 1
links {
}
}
無事に認識されているようです。
出来上がり
開発画面
開発画面はこんな感じです。
下のカラムでbashにつないで、Dockerで作った開発環境へアクセスしています。
今回は省略していますが、VSCode上だけでDockerへのアクセスとGitリポジトリへのアクセスができる上、GPUを搭載したLinux環境での動きも確認できる様になっています。
学習させてみる
MNISTだしFC層をちょろと繋いだだけだしで、あまり恩恵受けられていないですね……。
GPUはちゃんと使われていて、CUDA周りのライブラリが読み込まれているので、きちんと動作しているのはわかると思います。
まとめ
CUDA対応したWSL2を利用して、UbuntuのインストールとDocker+VSCodeを使った開発環境の構築まで一気通貫で紹介してきました。
まだプレビュー版ということもあり、nvidia-smiコマンドでログが取れなかったりなど不便な点もありますが、WSLのCUDA対応はかなり凄い更新だと思います。
商品としてAIの導入をするにあたって、Linuxサーバを用意せずにスタンドアロンでローカルマシンで動かせる可能性があるって考えると、ちょっと楽しくなりませんか?
サラリーエンジニアとしては資産管理する物理マシンが減る可能性を想像するだけで震えが止まりません……。
それでは、良いディープラーニングライフを!!