WSL2+Ubuntu24.04+Docker+GPUでつくる機械学習環境
はじめに
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環境が無効化されている可能性があるので、始めに有効化しておきましょう。
- 「コントロールパネル」→「プログラム」→「Windowsの機能の有効化または無効化」を選択
- 「Linux用Windowsサブシステム」と「仮想マシンプラットホーム」にチェックを入れてOKを選択
- 再起動が求められるので再起動を実施
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は以下のリンク先からインストールすることができます。
- ダウンロード条件を入力(※ 以下画像はGeForce RTX3060の場合)
- 「探す」を選択してexeファイルをダウンロード。
- ダウンロードしたexeファイルを開きインストールを進める。色々と設定が聞かれますが特に変更する必要はありません。
- 最後に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をご確認ください。
上記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バージョンが異なります。バージョン把握の手順は過去に記事を作成しているので、そちらを参照してください。
7. PytorchとCUDAが使えるDockerコンテナ起動
PytorchとCUDA環境が用意されているDockerコンテナを起動させて動作確認をします。
Pytorch公式のDockerHubから選択することができます。
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コマンド使用できるようにする
- dockerというグループを作成し、ユーザを登録
sudo groupadd docker
sudo usermod -aG docker <ユーザー名>
- WSL2環境を再起動
wsl --shutdown
Dockerを常時起動状態にする
PCやWSL2の再起動のたびにdockerを立ち上げるの面倒なので、常時自動でdockerエンジンが起動することも可能です。
- Ubuntuターミナルで以下を実行
sudo visudo
- 末尾に以下の内容を追加。この設定でパスワード無しでDockerを起動できるようになります。
※ ctrl+O(書き込み)
-> enter key(決定)
-> ctrl+X(閉じる)
で操作できます。
docker ALL=(ALL) NOPASSWD: /usr/sbin/service docker start
- 次に
~/.bashrc
を開き、以下の内容を追記。これでDockerが起動していないとき、起動させるようにします
if [[ $(service docker status | awk '{print $4}') = "not" ]]; then
sudo service docker start > /dev/null
fi
WSL2に割り当てるメモリサイズを増やす
デフォルトではWSL2が使用できるメモリ量が合計メモリ量の半分になっています。以下の設定を実施し増やしましょう。
-
C:\Users\<ユーザ名>\.wslconfig
を開く。もしファイルが存在しない場合は以下のコマンドで作成しましょう。
New-Item ~/.wslconfig
- メモリ使用量を追記(以下では64GBまで使用できるように設定)。
[wsl2]
memory=64GB
- WSLを再起動
wsl --shutdown
WSL2に割り当てるディスクサイズを増やす
- WSL2を再起動
wsl --shutdown
- DISKPARTを起動
PowerShellで以下のコマンドを実行
diskpart
- 仮想ディスクファイルを選択
以下のコマンドを実行すると現在の仮想サイズが表示される
select vdisk file="C:\Users\<ユーザ名>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx"
- 仮想サイズの割り当てを拡大
以下は1024GBに拡大する場合です。
expand vdisk maximum=1024000
- Ubuntu環境でのパーテーション変更
sudo resize2fs /dev/sdc 1024G
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