Windows上でGPUやGUIが使用できるUbuntu環境をセットアップ!

1月 3, 2022

機械学習で大変なことの一つにその環境構築があります. GPUとcudaのバージョンを合わせたり, 必要なpythonパッケージをインストールしなければなりません. それらをスクリプト一つで自動に実行してくれるのがdockerですが, docker内でGPUを利用できるのは現状Linuxのみになっています.
今回はWindows上でもLinux環境を構築し, dockerでGPUを利用できるようにするWindows Subsystem for LinuxやCuda on WSLを紹介します.

セットアップ

Windows上でのセットアップ

Windows Insider ProgramのDevチャネルに参加します. Windowsのタスクバー内の検索ボックスからWindows Insider Programを検索し, Devチャネルを選択します.

Visual Studio Codeのインストール

公式ページからVisual Studio Codeをインストールします.

Windows Subsystem for Linuxにアクセスするために, Visual Studio Codeの拡張機能"Remote Development"をインストールします.

またVisual Studio CodeからDockerコンテナにアクセスするために, 拡張機能"Docker"をインストールします.

Nvidia Driverのインストール

CUDA on WSL->Get CUDA Driver->GeForce DriverかQuadro Driverを選択し, インストールします.

Ubuntuのインストール

# install ubuntu
wsl --install -d Ubuntu-20.04

Ubuntu上でのセットアップ

Ubuntuのコンソールを立ち上げ, dockerをインストールします.

Windows Subsystem for Linux Console

Dockerのインストール

# install docker
curl https://get.docker.com | sh

NVIDIA Container Toolkitのインストール

Docker内でGPUが利用できるようにWindows Insider Programをインストールしていきます.

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/nvidia-container-runtime/experimental/$distribution/nvidia-container-runtime.list | sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker

sudoを付与することなく, dockerコマンドが使えるようにしておきます.

sudo usermod -aG docker $USER
sudo service docker restart

検証

TensorflowのDockerfileをpullし, runさせる.

docker pull tensorflow/tensorflow:2.5.0-gpu
docker run --gpus all -it tensorflow/tensorflow:2.5.0-gpu

Visual Studio Codeを立ち上げます.

code .

Visual Studio CodeのDockerタブからコンテナにアタッチします.

Docker内でGPUが認識されているか確認します.

# verify existence of GPU
python

# in python
from tensorflow.python.client import device_lib
device_lib.list_local_devices()

# the response
[name: "/device:CPU:0"
 device_type: "CPU"
 memory_limit: 268435456
 locality {
 }
 incarnation: 5894596360552558978,
 name: "/device:GPU:0"
 device_type: "GPU"
 memory_limit: 4128702464
 locality {
   bus_id: 1
   links {
   }
 }
 incarnation: 6180404691262226554
 physical_device_desc: "device: 0, name: NVIDIA GeForce RTX 2060, pci bus id: 0000:01:00.0, compute capability: 7.5"]

上記のような結果が返れば, うまくGPUを認識できています.

おわりに

WindowsからUbuntuを使用できるので, 多くのユーザーが機械学習を実施する際にDockerの恩恵を受けることができます. まだ試してない人はやってみてください.