🐧

WSL2+Ubuntu24.04+Docker+GPUでつくる機械学習環境

2024/05/17に公開

はじめに

WSL2(Windows Subsystem for Linux 2)は、Microsoft Windows上でLinuxカーネルを直接実行できるようにする機能です。
この記事ではWSL2環境にDockerを導入しGPUを用いた機械学習環境を構築する手順を紹介します。

構築イメージは以下の図の通りです。NvidiaGPUを搭載したマシンにWSL2環境を構築します。Dockerを用いてコンテナを用意し、CUDAは各コンテナ内のCUDA Toolkitを用いて利用します。

今回開発するPCのスペックは以下の通りです。

  • Windows 11
  • Windows version: 22H2
  • GPU:NVIDIA Geforce RTX 3060 12GB

設定

1. WSL2を有効化

デフォルトではWSL2環境が無効化されている可能性があるので、始めに有効化しておきましょう。

  1. 「コントロールパネル」→「プログラム」→「Windowsの機能の有効化または無効化」を選択
  2. 「Linux用Windowsサブシステム」と「仮想マシンプラットホーム」にチェックを入れてOKを選択
  3. 再起動が求められるので再起動を実施

2. WSL2インストール

まずwslをアップデートし最新のバージョンにします。

wsl --update

アップデートが完了したら、以下のコマンドでインストールできるディストリビューションを確認します。2024年5月13日時点では以下のような結果が返ってきました。

$ wsl --list --online
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl.exe --install <Distro>' を使用してインストールします。

NAME                                   FRIENDLY NAME
Ubuntu                                 Ubuntu
Debian                                 Debian GNU/Linux
kali-linux                             Kali Linux Rolling
Ubuntu-18.04                           Ubuntu 18.04 LTS
Ubuntu-20.04                           Ubuntu 20.04 LTS
Ubuntu-22.04                           Ubuntu 22.04 LTS
Ubuntu-24.04                           Ubuntu 24.04 LTS
OracleLinux_7_9                        Oracle Linux 7.9
OracleLinux_8_7                        Oracle Linux 8.7
OracleLinux_9_1                        Oracle Linux 9.1
openSUSE-Leap-15.5                     openSUSE Leap 15.5
SUSE-Linux-Enterprise-Server-15-SP4    SUSE Linux Enterprise Server 15 SP4
SUSE-Linux-Enterprise-15-SP5           SUSE Linux Enterprise 15 SP5
openSUSE-Tumbleweed                    openSUSE Tumbleweed

今回はUbuntu-24.04をインストールしていきます。

wsl --install -d Ubuntu-24.04

上手く行けばUbuntu環境用にユーザ名とパスワードを聞かれるので新規設定してください。

一応正常にインストールされているか確認してみましょう。
まずPowerShellでインストールされているWSL2環境一覧を確認することができます。

$ wsl --list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-24.04 (既定)

またエクスプローラーにはWSL2環境のディレクトリが作成されているはずです。

3. Nvidia Driverインストール

Nvidia製GPUを使用できるようにするためには、Nvidia Driverをインストール必要があります。
既製品のPCを購入した場合、すでにインストールされている可能性があります。以下のコマンドで確認してみましょう。

$ nvidia-smi
Mon May 13 19:19:00 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.51.01              Driver Version: 532.03       CUDA Version: 12.1     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                  Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf            Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 3060         On | 00000000:01:00.0  On |                  N/A |
|  0%   40C    P8               12W / 170W|    884MiB / 12288MiB |      6%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+

上記のような表が表示されたら既にインストールされているので問題ありません。
もし表示されない場合や、表示されたがバージョン等が古い場合は別途Nvidia Driverをインストールしましょう。

Nvidia Driverは以下のリンク先からインストールすることができます。
https://www.nvidia.co.jp/Download/index.aspx?lang=jp

  1. ダウンロード条件を入力(※ 以下画像はGeForce RTX3060の場合)
  2. 「探す」を選択してexeファイルをダウンロード。
  3. ダウンロードしたexeファイルを開きインストールを進める。色々と設定が聞かれますが特に変更する必要はありません。
  4. 最後にPCを再起動を実施しnvidia-smiコマンドを叩いて、Driverのバージョンが変更されていたら成功です。

4. Dockerインストール

Docker Engineのみインストールします。Docker Desktopを利用する方法もありますが、場合によっては有償になるので今回はインストールしません。

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

以下のコマンドを叩き、バージョンが表示されればOKです

$ docker -v
Docker version 26.1.1, build 4cf5afa

WSL2を再起動

wsl --shutdown

5. NVIDIA Dockerインストール

DockerコンテナからNVIDIA GPUを扱うためにnvidia-container-toolkitを入れます。詳細は以下のURLをご確認ください。

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installing-with-apt

上記URLに記載された内容に従い、以下のコマンドを入力します。

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
    && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker

最後にdockerデーモンを再起動

sudo systemctl restart docker

6. 使用できるCUDAバージョンを把握

GPUの型番によって使用できるCUDAバージョンが異なります。バージョン把握の手順は過去に記事を作成しているので、そちらを参照してください。

https://zenn.dev/yumizz/articles/73d6c7d1085d2f

7. PytorchとCUDAが使えるDockerコンテナ起動

PytorchとCUDA環境が用意されているDockerコンテナを起動させて動作確認をします。
Pytorch公式のDockerHubから選択することができます。

https://hub.docker.com/r/pytorch/pytorch

PytorchやCUDAのバージョン毎にたくさんのDockerイメージが用意されているので、前項で調べた使用可能なCUDAバージョンに気を付けながら適切なDockerイメージを選択しましょう。

docker run -it --gpus all pytorch/pytorch:2.2.1-cuda12.1-cudnn8-runtime

Pythonを起動し、CUDAを利用してpytorchが使用できるか確認します

$ python
Python 3.10.13 (main, Sep 11 2023, 13:44:35) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.cuda.is_available())
True

Trueの表示が出ればOKです。

その他設定

必須ではないが、設定しておくと良い項目を紹介します。

sudoなしでdockerコマンド使用できるようにする

  1. dockerというグループを作成し、ユーザを登録
sudo groupadd docker
sudo usermod -aG docker <ユーザー名>
  1. WSL2環境を再起動
wsl --shutdown

https://zukucode.com/2021/11/wsl2-docker-startup.html

Dockerを常時起動状態にする

PCやWSL2の再起動のたびにdockerを立ち上げるの面倒なので、常時自動でdockerエンジンが起動することも可能です。

  1. Ubuntuターミナルで以下を実行
sudo visudo
  1. 末尾に以下の内容を追加。この設定でパスワード無しでDockerを起動できるようになります。

ctrl+O(書き込み)-> enter key(決定) -> ctrl+X(閉じる)で操作できます。

docker ALL=(ALL)  NOPASSWD: /usr/sbin/service docker start
  1. 次に~/.bashrcを開き、以下の内容を追記。これでDockerが起動していないとき、起動させるようにします
if [[ $(service docker status | awk '{print $4}') = "not" ]]; then
  sudo service docker start > /dev/null
fi

https://zukucode.com/2021/11/wsl2-docker-startup.html

WSL2に割り当てるメモリサイズを増やす

デフォルトではWSL2が使用できるメモリ量が合計メモリ量の半分になっています。以下の設定を実施し増やしましょう。

  1. C:\Users\<ユーザ名>\.wslconfigを開く。もしファイルが存在しない場合は以下のコマンドで作成しましょう。
New-Item ~/.wslconfig
  1. メモリ使用量を追記(以下では64GBまで使用できるように設定)。
[wsl2]
memory=64GB
  1. WSLを再起動
wsl --shutdown

https://snowsystem.net/other/windows/wsl2-fixed-memory-allocation/

WSL2に割り当てるディスクサイズを増やす

  1. WSL2を再起動
wsl --shutdown
  1. DISKPARTを起動

PowerShellで以下のコマンドを実行

diskpart
  1. 仮想ディスクファイルを選択

以下のコマンドを実行すると現在の仮想サイズが表示される

select vdisk file="C:\Users\<ユーザ名>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx"
  1. 仮想サイズの割り当てを拡大

以下は1024GBに拡大する場合です。

expand vdisk maximum=1024000
  1. Ubuntu環境でのパーテーション変更
sudo resize2fs /dev/sdc 1024G

https://ascii.jp/elem/000/004/075/4075005/
https://zenn.dev/rchiji/articles/5a7216f33136f2

PC起動時にWSL2を自動起動する

C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup.batファイルを作成(ファイル名は何でも大丈夫です。私はwsl_startup.batとしました。)

その.batファイルを記載。

@echo off
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "Start-Process -WindowStyle Hidden -FilePath 'wsl'"

参考

Discussion