Windows11 WSL2 Ubuntu-20.04 LTSでTensorflow/PyTorchのGPU機械学習環境(Anaconda使用)

スポンサーリンク
Win11 WSL2 CPU Machine Learning

機械学習目的でNVIDIA GPU搭載PCを買ったものの、うまく環境構築ができずに悩んでいる方も多いのではないかと思います。(私もかなり苦労しました・・・)

Tensorflow/PyTorchのGPU機械学習、USBカメラ入力の環境構築について、2022年2月現在、うまくいく方法を紹介します。

Windows11になってWSL2が進化し、GUIや音声出力は何も設定しなくても問題なく動きました。

Windows10時代のWSL2では、GUIはMobaXterm、音声出力はPulseAudioを使用する必要があり面倒でしたが、Windows11になって格段に便利になりました。

USBカメラ入力はusbipd経由で使えましたが、私の場合、WSL2カーネルの再ビルドをしないとうまく認識できませんでした。

PC内蔵のカメラも使用したかったのですが、実現する方法を見つけられておらず、上記USBカメラ入力で代用しています。

また、USB接続のゲームパッドについても現状は使えない(参考)ようで、PyGameによるゲームパッド使用はうまくいきませんでした。

本記事の内容は以下の動画にも収めていますので、ご覧ください。

動作環境

使用PC

MSIゲーミングノートPC 15.6インチ GF65-10UE Core-i7-10750H RTX3060 16GB 512GB

ツールバージョン

項目内容
WSL2Ubuntu-20.04 LTS
Anaconda4.10.3 (conda -Vの値)
CUDA11.6(Windows用)/11.5 (WSL2用)
CuDNN8.3
Tensorflow2.4.2
PyTorch1.10.2+cu113

WSL2 Ubuntu-20.04 LTSのインストール

Windowsマークを右クリック→Windowsターミナル(管理者)を立ち上げ、以下のコマンドでWSL2 Ubuntu-20.04 LTSをインストールします。

PS> wsl --install -d Ubuntu-20.04

本記事では、WindowsターミナルのPower Shellのコマンド実行には、コマンドの頭にPS>をつけて区別します。

PS>は入力する必要はありませんのでご注意ください。

PS>が付かないコマンド表記は、WSL2 Ubuntu 20.04のターミナルでの実行になります。

NVIDIAドライバのインストール

NVIDIAのダウンロードサイトから、以下のように選択してダウンロードします。

Windowsターミナルでnvidia-smiを実行します。

PS> nvidia-smi

以下のように表示されれば、ドライバのインストールが正常にできています。

Wed Feb 23 23:09:59 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.06       Driver Version: 510.06       CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ... WDDM  | 00000000:01:00.0 Off |                  N/A |
| N/A    0C    P0    20W /  N/A |    122MiB /  6144MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

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

機械学習環境構築

Windowsターミナル(管理者)を立ち上げ、下図のようにプルダウンメニューからUbuntu-20.04を起動します。

インストール用シェルスクリプトをGitHubからダウンロードします。

git clone https://github.com/tak6uch1/wsl2_pytorch_tf_gpu.git
cd wsl2_pytorch_tf_gpu

CUDAのインストール

以下のコマンドでCUDA 11.5をインストールします。

bash 1_install_cuda.sh

2022年2月時点で最新のCUDAバージョンは11.6でしたが、11.6ではうまく動作しませんでした。

続くCuDNNがCUDA 11.5を前提としているためと思われます。

ここでのCUDAはWSL2 Ubuntu用なので、Windows用の「NVIDIAドライバのインストール」の章でインストールしたCUDAドライバとは別のものになります。

Windows用のCUDAドライバは11.6であっても問題無いようです。

CuDNNのインストール

NVIDIAのCuDNNダウンロードサイトをブラウザで開き、I Agree~にチェックを入れ、CUDA 11.5の方を選択します。

Local Installer for Ubuntu20.04 x86_64 [Deb]をクリックするとダウンロードが始まります。

ダウンロードフォルダにcudnn-local-repo-ubuntu2004-8.3.2.44_1.0-1_amd64.debができるので、現在のフォルダ(wsl2_pytorch_tf_gpu)に移動して3_install_cudnn.shを実行します。

mv /mnt/c/Users/user_name/Downloads/cudnn-local-repo-ubuntu2004-8.3.2.44_1.0-1_amd64.deb .
bash 2_install_cudnn.sh

上記3_install_cudnn.shは、ダウンロードした.debファイルの名前がcudnn-local-repo-ubuntu2004-8.3.2.44_1.0-1_amd64.debであることを前提としています。

バージョンが更新され、ファイル名が変わった場合は、3_install_cudnn.sh内のファイル名を書き換えてお使いください。

Anacondaのインストール

Anacondaのサイトの下記リンクからインストール用スクリプトをダウンロードします。

インストール用スクリプトを実行します。

bash /mnt/c/Users/user_name/Downloads/Anaconda3-2021.11-Linux-x86_64.sh

user_nameの部分はお使いのアカウント名で置き換えてください。

Anacondaインストーラが~/.bashrcに設定を書き足すので、sourceして有効にします。(次回以降はターミナル立ち上げると~/.bashrcの設定が有効になるので、sourceする必要はありません)

source ~/.bashrc

Tensorflow

Anacondaをインストールするとcondaコマンドが使えるようになるので、Tensorflow用の仮想環境をpython 3.8でtfとして作成し、アクティベートします。

conda create -n tf python=3.8
conda activate tf

Tensorflow 2.4.2とJupyter Notebookをインストールします。

pip install -U pip
pip install tensorflow==2.4.2
pip install notebook

pip installの途中でTime outしてしてしまう場合は、以下のように--default-timeoutオプションでタイムアウト時間を設定した実行をお試しください。
pip --default-timeout=1000 install tensorflow==2.4.2

ここでランタイムライブラリのエラーを回避するためのシンボリックリンクを作ります。

sudo ln -s /usr/local/cuda-11.5/lib64/libcusolver.so.11 /usr/local/cuda-11.5/lib64/libcusolver.so.10

このリンボリックリンクを作らないとうまくGPU認識ができませんでした。

GPUが正しく認識できているか確認するため以下のコマンドを実行します。

python check_gpu.py

以下のようにdevide_type: “GPU”が表示されれば、正しくGPUを認識できています。

((( 省略 )))
2022-02-23 23:46:01.546559: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1406] Created TensorFlow device (/device:GPU:0 with 4704 MB memory) -> physical GPU (device: 0, name: NVIDIA GeForce RTX 3060 Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.6)
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 8160991584963335352
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 4932619488
locality {
  bus_id: 1
  links {
  }
}
incarnation: 13520606410012444221
physical_device_desc: "device: 0, name: NVIDIA GeForce RTX 3060 Laptop GPU, pci bus id: 0000:01:00.0, compute capability: 8.6"
]

Jupyter Notebookを起動します。

jupyter notebook

ここで画面が消えてしまいますが、Ctrl+Cを押すと以下のようなURLが表示されるので、コピーしてブラウザのアドレス入力部分に貼り付けます。

http://127.0.0.1:8888/?token=XXXXXXXXXXXXX

以下のようにJupyter Notebookが立ち上がるので、New→Python 3からPython3の入力モードに移行します。

以下を入力し、Shift+Enterで実行します。

%%time
run -i mnist_cnn.py

以下のように表示されれば成功です。

USBカメラの接続

WindowsとWSL2 Ubuntuとの間でUSB通信の仲介をするusbipd-winを使ってUSBカメラを使えるようにします。

USBカメラを使用しない方は、本章を読み飛ばして結構です。

usbipd-winのインストール

usbipd-winのサイトの右側にあるReleasesのリンクから最新のインストーラをダウンロードします。(2022年2月現在、最新バージョンは2.1.0)

ダウンロードしたインストーラ(usbipd-win_2.1.0.msi)をダブルクリックしてインストールします。

Windows Defenderの設定

Windows Defenderのファイアウォールの設定でusbipdの通信を許可する必要があります。

虫眼鏡マーク→defeなどと入力するとWindows Defenderが見つかりますので起動します。

Windows Defender

①受信の規則→②新しい規則→③カスタム と進みます。

Defender 1

プログラムから、インストールしたusbipd.exeを指定します。

Defender 2

作成した規則にusbipdなどと名前を付けて完了を押したらWindows Defenderの設定終了です。

WSL2カーネルのビルド

usbipdを使ってUSB接続のWeb Cameraを使用するために、WSL2のカーネルを再ビルドしないとうまく通信できなかったため、この処理が必要になりました。

git clone https://github.com/tak6uch1/win11wsl2_kernel4usb.git

ここで、カーネルのバージョンと日付を確認しておきます。

uname -v -r
5.10.60.1-microsoft-standard-WSL2 #1 SMP Wed Aug 25 23:20:18 UTC 2021

ダウンロードされた以下のスクリプトbuild_kernel.shを実行します。

cd win11wsl2_kernel4usb
bash build_kernel.sh

WSL2を再起動する必要があるので、一度Ubuntu 20.04のターミナルを終了します。

exit

Windowsターミナルから以下のコマンドでWSL2をシャットダウンします。

PS> wsl --shutdown

PS> の部分はWindowsターミナルのPower Shell上の実行を表すための表現で、入力不要です。

単に wsl --shutdown と入力してください。

再度Ubuntu 20.04のターミナルを立ち上げます。

Start wsl ubuntu

再度カーネルのバージョンと日付を確認します。

uname -v -r
5.10.60.1-microsoft-standard-WSL2+ #1 SMP Wed Feb 23 15:55:05 JST 2022

上記のように日付が変わっていれば、再ビルドしたカーネルが実行されています。

カーネルビルドを行うと/mnt/c/Users/user_name/.wslconfigにビルドしたカーネルの情報が書き込まれます。

元のカーネルに戻したい場合は、上記ファイルを削除するか別のファイル名に変更します。

USBカメラをUSB端子に接続し、Windowsターミナルから以下のコマンドを実行してUSBに接続されているデバイスを確認します。

PS> usbipd wsl list

以下のように表示されるので、1-4がUSBカメラでNot attachedになっていることがわかります。

BUSID  DEVICE                                                        STATE
1-4    USB Camera, USB 2.0 Camera                                    Not attached
1-14   インテル(R) ワイヤレス Bluetooth(R)                           Not attached
2-1    USB 入力デバイス                                              Not attached
2-2    USB 入力デバイス                                              Not attached

以下のコマンドでWSL2にアタッチして再度USB接続の確認をします。

PS> usbipd wsl attach -b 1-4
PS> usbipd wsl list

今度は以下のとおり、アタッチされていることがわかります。

BUSID  DEVICE                                                        STATE
1-4    USB Camera, USB 2.0 Camera                                    Attached - Ubuntu-20.04
1-14   インテル(R) ワイヤレス Bluetooth(R)                           Not attached
2-1    USB 入力デバイス                                              Not attached
2-2    USB 入力デバイス                                              Not attached

今度はWSL2 Ubuntuのターミナルで以下を実行し、USBカメラデバイスが認識されていることを確認します。

lsulb

以下のように表示されます。

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 0c45:6366 Microdia USB 2.0 Camera
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

以下のコマンドでvideoデバイスのアクセスを許可します。

sudo chmod 777 /dev/video*

OpenCVを仮想環境tfにインストールします。

conda install -c conda-forge opencv

以下のコマンドでカメラ入力のテストを行います。

python camera_test.py

以下のように画像が表示されれば成功です。

Camera Test

カメラ入力する異なるPythonプログラムを実行した際などにカメラ入力ができなくなることがありました。

対策は「トラブルシューティング」の章をご覧ください。

PyTorch

Python 3.9の仮想環境torchを作ってアクティベートします。

conda deactivate
conda create -n torch python=3.9
conda activate torch

PyTorchのGPU環境とJupyter Notebookをインストールします。

pip install -U pip
pip install torch==1.10.2+cu113 torchvision==0.11.3+cu113 torchaudio==0.10.2+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html
pip install notebook

上記PyTorchのインストールコマンドはPyTorchのサイトから下図の設定で入手できます。

PyTorch Install Command

PyTorchのバージョンを確認します。

python check_pytorch.py

以下のように表示されれば成功です。

1.10.2+cu113 True
tensor([[0.6327, 0.3665, 0.6174],
        [0.1698, 0.8373, 0.3658],
        [0.2713, 0.0527, 0.8659],
        [0.4002, 0.0120, 0.8794],
        [0.7513, 0.2406, 0.3140]])

MNISTの学習を試してみます。

python mnist_cnn_pytorch.py

Tensorflow実行時も同様ですが、学習中にタスクマネージャを開いてGPUの使用率を確認することができます。

GPU usage

PyGameによるGUIと音声出力の確認

PyGameを使ってGUIと音声出力の確認をします。

Windows10ではGUIはMobaXterm、音声出力はPulseAudioが必要でしたが、Windows11ではこれらは不要になりました。

conda deactivate
conda create -n game python=3.9
conda activate game
python -m pip install pygame
python -m pygame.examples.aliens

以下のような画面が出て、音が出れば成功です。

Pygame Aliens

遊び方:
キーボードの左右キーで移動して爆弾を避けながら、スペースキーでミサイル発射して敵機を撃ち落とします。

PyGameでゲームパッド(Joystick)入力も試したのですがうまくいきませんでした。

こちらの動画にあるように、usbipdがまだゲームパッドに対応していないようです。

トラブルシューティング

USBカメラが使えない

usbipdでUSBカメラをアタッチ後、WSL2上でlsusbを実行するとUSBカメラの情報は出るが、/dev/video0, /dev/video1などが無い状態になりました。

「USBカメラの接続」の章にあるようにカーネルの再ビルドを行うことで解決しました。

カメラを使うPythonプログラムを切り替えるとカメラを使用できない

カメラ入力するPythonプログラムを一度実行後、カメラ入力する別のPythonプログラムを実行した際にカメラ入力ができなくなることがありました。

この場合、一度wsl --shutdownでWSL2を終了し、立ち上げなおしてから、再度usbipd wsl attach -bでアタッチして、sudo chmod 777 /dev/video*することで正常にカメラ入力できるようになりました。

まとめ

NVIDIA GPU搭載PCでTensorflow/PyTorchのGPU機械学習環境を構築する方法を紹介しました。

GUI、音声出力はWindows11+WSL2では、特に何も設定せずに使えました。

usbipdを使用してアタッチする方法で、WSL2でUSBカメラを使うことができました。

他のサイトでは、usbipd使用にデフォルトのWSLカーネルで使用できるように説明されていますが、私の場合、再ビルドすることで使えるようになりました。

残念ながら、ノートPCの内蔵カメラやゲームパッドは未対応と思われ、WSL2で使用することができませんでした。

WSL2上で以下のような楽しい機械学習サンプルを実行できますので、ぜひお試しください。

書籍紹介

最短コースでわかる PyTorch &深層学習プログラミング

PyTorchを基礎から学べる入門書で、初学者から中級者くらいまでを対象にしています。

人気ブロガーからあげ先生のとにかく楽しいAI自作教室

実践して楽しむことを重視していて、充実のサンプルコードで画像認識やテキスト分析、GAN生成といったAI応用をGoogle Colab環境下で体験できます。

参考文献

タイトルとURLをコピーしました