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

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

2022年10月17日更新)USBカメラの部分が動かなくなっていたので、カーネルビルドのためのGitHubリポジトリbuild_kernel.shconfigを更新しました。


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

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

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

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

WSL2カーネルを再ビルドすることで、usbipd経由でUSBカメラを使えるようになりました。

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

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

動作環境

使用PC

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

ツールバージョン

項目内容
WSL2Ubuntu-20.04 LTS
Ubuntuカーネルバージョン5.15.68.1
Ubuntuカーネルバージョン(カメラ入力用再ビルド後)5.15.57.1
usbipd-win2.4.1
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 features」と入力すると、「Windowsの機能の有効化または無効化」が見つかるのでクリックします。

Windows Features

「Hyper-V」の左にある+マークをクリックして階層を展開し、「Hyper-V プラットフォーム」と「Hyper-V 管理ツール」の両方と「Linux用Windowsサブシステム」にチェックを入れます。

setting1

下の方にスクロールして「仮想マシン プラットフォーム」にチェックが入っていることを確認します。

setting2

OKをクリックすると、再起動を求められるので、再起動します。

ここで、もし「Hyper-V プラットフォーム」が灰色になっていて選択できない状態になっている場合、UEFI(BIOS)の設定を変える必要があります。

一度、PCをシャットダウンし、電源を入れてすぐにDelキーやF2キーを連打してUEFI(BIOS)画面を出します。

操作は機種によって異なりますが、以下はASUSのマザーボードの場合の例です。

Advanced Mode→Advancedタブ→CPU Configuration→Intel (VMX) Virtualization Technology

の内容が「Disabled」になっていたら「Enabled」に変更します。

VMX setting

Windowsマークを右クリック→ターミナル(管理者)を立ち上げ、以下のコマンドでWSL2を使用するための準備をします。

PS> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
PS> wsl --set-default-version 2

ここでインストール可能なディストリビューションを確認します。

PS> wsl --list --online

上記コマンドを実行して表示されたUbuntu-〜のうち、最も新しいものをインストールすると良いでしょう。

2022年10月現在、Ubuntu-20.04が最新なので、これをインストールします。

PS> wsl --install -d Ubuntu-20.04

このあとUbuntuのターミナルが立ち上がり、ユーザ名とパスワードを設定します。

もし、以下のエラーが出たら、下の方にある「トラブルシューティング」の章の「Ubuntuインストール時にエラーが出る」の内容を参照してエラーを解消してください。
Error code: Wsl/Service/CreateInstance/ERROR_FILE_NOT_FOUND

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

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

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

ターミナルを立ち上げ直すと、以下のようにvマークのプルダウンメニューにUbuntuが表示されるので、クリックすると新しいタブでUbuntuのターミナルが立ち上がります。

GPUドライバのインストール(Windows側)

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                                                 |
+-----------------------------------------------------------------------------+

GPUドライバインストール(WSL2 Ubuntu側)

こちらのサイトから下図のように使用する機器、バージョン等を設定すると、画面下の方にコマンドが表示されるので、それを実行します。

上図で表示されたコマンドを以下に貼り付けておきます。

wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda

時が経つと上記コマンドはバージョンが上がって変わっていくと思いますので、NVIDIAのサイトに従って最新のコマンドを使用するのが良いでしょう。

CuDNNインストール

CuDNNのインストーラをダウンロードするにはNVIDIAのアカウントが必要ですので、ここから登録してください。

こちらのサイトからライセンス承諾のチェックを入れ、CUDA 11.xの中からをLocal Installer for Ubuntu20.04 x86_64 (Deb)を選択してダウンロードします。

mv /mnt/c/Users/USERNAME/Downloads/cudnn-local-repo-ubuntu2004-8.6.0.163_1.0-1_amd64.deb .
sudo dpkg -i cudnn-local-repo-ubuntu2004-8.6.0.163_1.0-1_amd64.deb
sudo cp /var/cudnn-local-repo-*/cudnn-local-*-keyring.gpg /usr/share/keyrings/
sudo apt update
sudo apt -y install libcudnn8 libcudnn8-dev libcudnn8-samples

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

上記でlibcudnn8-samplesをインストールするとCuDNNのサンプルプログラムが/usr/srcにダウンロードされるので、動作確認に使用します。

cp -r /usr/src/cudnn_samples_v8 .
cd cudnn_samples_v8/RNN
make
./RNN
cd ../..

エラー無く実行できれば成功です。

Anacondaインストール

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

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

bash /mnt/c/Users/USERNAME/Downloads/Anaconda3-2022.05-Linux-x86_64.sh

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

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

source ~/.bashrc

これで、コマンドプロンプト(コマンド入力部の左側の部分)に(base)と表示されるようになります。

Tensorflow

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

conda create -n tf python=3.9
conda activate tf

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

pip install -U pip
pip install tensorflow
pip install notebook

サンプルプログラムをダウンロードします。

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

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

python check_gpu.py

以下のようにdevice_type: “GPU”が表示されて、グラフックボードの名称が表示されれば、正しくGPUを認識できています。

((( 省略 )))
2022-09-04 14:08:54.978476: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1532] Created device /device:GPU:0 with 20143 MB memory:  -> device: 0, name: NVIDIA GeForce RTX 3090, pci bus id: 0000:01:00.0, compute capability: 8.6
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 15858451040075004051
xla_global_id: -1
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 21122318336
locality {
  bus_id: 1
  links {
  }
}
incarnation: 7473896646874375007
physical_device_desc: "device: 0, name: NVIDIA GeForce RTX 3090, pci bus id: 0000:01:00.0, compute capability: 8.6"
xla_global_id: 416903419
]

Jupyter Notebookを起動します。

jupyter notebook

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

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

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

Jupyter initial

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

%%time
run -i mnist_cnn.py

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

Tensorflow MNIST

USBカメラの接続

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

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

usbipd-winのインストール

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

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

Edgeブラウザでダウンロード時に「〜を開く前に、信頼できることを確認してください」と表示される場合、「・・・」→「保存」→「詳細表示」→「保持する」とすることでファイルを保存できます。

Edge download caution

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.15.68.1-microsoft-standard-WSL2 #1 SMP Mon Sep 19 19:14:52 UTC 2022

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

cd win11wsl2_kernel4usb
bash build_kernel.sh

build_kernel.shは2022年10月現在、正常実行できることを確認しています。

すべてのカーネルバージョンのソースコードが用意されている訳では無いため、バージョンは決め打ちで5.15.57.1としてあります。

Ubuntuのユーザ名がWindowsのユーザ名と同じであることを前提とした内容になっています。もし異なる場合はUSER="Windowsのユーザ名"として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.15.57.1-microsoft-standard-WSL2+ #1 SMP Mon Oct 17 09:23:34 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をインストールします。

上記PyTorchのインストールコマンドはPyTorchのサイトから下図のように設定して表示されるコマンドを使用します。

PyTorch Install

下記の2行目は、上記で表示されたコマンドを貼り付けたものです。

pip install -U pip
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116
pip install notebook

バージョンが上がると変わると思いますので、最新のコマンドを使うことをおすすめします。

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

python check_pytorch.py

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

1.12.1+cu116 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]])

以下のコマンドでPyTorch用MNISTがエラー無く実行できれば成功です。

python mnist_cnn_pytorch.py

上記を実行中に別のターミナルで以下のコマンドを実行することでGPUの使用状況を確認できます。

nvidia-smi -l

止める場合はCtrl+Cを押します。

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がまだゲームパッドに対応していないようです。

トラブルシューティング

Ubuntuインストール時にエラーが出る

Ubuntuをアンインストールして再インストールした場合に以下のエラーが出る場合があります。
Error code: Wsl/Service/CreateInstance/ERROR_FILE_NOT_FOUND

Ubuntu Error

WSL2のアンインストールをする際、以下を実行してからアンインストールしないとこのエラーが出ます。

wsl --unregister Ubuntu-20.04

このエラーが出たら以下の手順でエラーを解消できます。

  1. 上記コマンド(wsl --unregister Ubuntu-20.04)実行
  2. Windowsマークを右クリック→設定→アプリ→インストールされているアプリ→「Ubuntu 20.04 on Windows」の右にある「・・・」をクリック→アンインストール
  3. インストールコマンド(wsl --install -d Ubuntu-20.04)を実行

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*することで正常にカメラ入力できるようになりました。

まとめ

Windows11をインストールしたNVIDIA GPU搭載PCで、WSL2 Ubuntu上にTensorflow/PyTorchのGPU機械学習環境を構築する方法を紹介しました。

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

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

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

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

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

書籍紹介

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

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

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

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

参考文献

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