(2022年10月17日更新)USBカメラの部分が動かなくなっていたので、カーネルビルドのためのGitHubリポジトリのbuild_kernel.sh
とconfig
を更新しました。
機械学習目的で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
ツールバージョン
項目 | 内容 |
WSL2 | Ubuntu-20.04 LTS |
Ubuntuカーネルバージョン | 5.15.68.1 |
Ubuntuカーネルバージョン(カメラ入力用再ビルド後) | 5.15.57.1 |
usbipd-win | 2.4.1 |
Anaconda | 4.10.3 (conda -Vの値) |
CUDA | 11.6(Windows用)/11.5 (WSL2用) |
CuDNN | 8.3 |
Tensorflow | 2.4.2 |
PyTorch | 1.10.2+cu113 |
WSL2 Ubuntu-20.04 LTSのインストール
Windowsマークをクリックして、検索窓に「windows features」と入力すると、「Windowsの機能の有効化または無効化」が見つかるのでクリックします。
「Hyper-V」の左にある+マークをクリックして階層を展開し、「Hyper-V プラットフォーム」と「Hyper-V 管理ツール」の両方と「Linux用Windowsサブシステム」にチェックを入れます。
下の方にスクロールして「仮想マシン プラットフォーム」にチェックが入っていることを確認します。
OKをクリックすると、再起動を求められるので、再起動します。
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
ターミナルを立ち上げ直すと、以下のように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の入力モードに移行します。
以下を入力し、Shift+Enterで実行します。
%%time run -i mnist_cnn.py
以下のように表示されれば成功です。
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)をダブルクリックしてインストールします。
Windows Defenderの設定
Windows Defenderのファイアウォールの設定でusbipdの通信を許可する必要があります。
虫眼鏡マーク→defeなどと入力するとWindows Defenderが見つかりますので起動します。
詳細設定→①受信の規則→②新しい規則→③カスタム と進みます。
プログラムから、インストールしたusbipd.exeを指定します。
作成した規則に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
WSL2を再起動する必要があるので、一度Ubuntu 20.04のターミナルを終了します。
exit
Windowsターミナルから以下のコマンドでWSL2をシャットダウンします。
PS> wsl --shutdown
再度Ubuntu 20.04のターミナルを立ち上げます。
再度カーネルのバージョンと日付を確認します。
uname -v -r 5.15.57.1-microsoft-standard-WSL2+ #1 SMP Mon Oct 17 09:23:34 JST 2022
上記のように日付が変わっていれば、再ビルドしたカーネルが実行されています。
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
以下のように画像が表示されれば成功です。
PyTorch
Python 3.9の仮想環境torchを作ってアクティベートします。
conda deactivate conda create -n torch python=3.9 conda activate torch
PyTorchのGPU環境とJupyter Notebookをインストールします。
上記PyTorchのインストールコマンドはPyTorchのサイトから下図のように設定して表示されるコマンドを使用します。
下記の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の使用率を確認することができます。
PyGameによるGUIと音声出力の確認
PyGameを使ってGUIと音声出力の確認をしていきます。
conda deactivate conda create -n game python=3.9 conda activate game python -m pip install pygame python -m pygame.examples.aliens
以下のような画面が出て、音が出れば成功です。
遊び方:
キーボードの左右キーで移動して爆弾を避けながら、スペースキーでミサイル発射して敵機を撃ち落とします。
トラブルシューティング
Ubuntuインストール時にエラーが出る
Ubuntuをアンインストールして再インストールした場合に以下のエラーが出る場合があります。
Error code: Wsl/Service/CreateInstance/ERROR_FILE_NOT_FOUND
WSL2のアンインストールをする際、以下を実行してからアンインストールしないとこのエラーが出ます。
wsl --unregister Ubuntu-20.04
このエラーが出たら以下の手順でエラーを解消できます。
- 上記コマンド(
wsl --unregister Ubuntu-20.04
)実行 - Windowsマークを右クリック→設定→アプリ→インストールされているアプリ→「Ubuntu 20.04 on Windows」の右にある「・・・」をクリック→アンインストール
- インストールコマンド(
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上で以下のような楽しい機械学習サンプルを実行できますので、ぜひお試しください。
- OpenPoseで骨格推定 Tensorflow 2.x版(M1 Mac/Intel Mac/Windows11対応)
https://take6shin-tech-diary.com/openpose-tensorflow2/ - PyTorchを利用したスーパーマリオの機械学習をローカルPCで実施
https://www.youtube.com/watch?v=n2R-sxioYHQ
書籍紹介
最短コースでわかる PyTorch &深層学習プログラミング
PyTorchを基礎から学べる入門書で、初学者から中級者くらいまでを対象にしています。
実践して楽しむことを重視していて、充実のサンプルコードで画像認識やテキスト分析、GAN生成といったAI応用をGoogle Colab環境下で体験できます。
参考文献
- WSL2 + Ubuntu20.04 + CUDA 11.4 で TensorFlow 環境構築 (2021.08)(https://zenn.dev/ylabo0717/articles/48796b7f3470c7)
- dorssel/usbipd-win(https://github.com/dorssel/usbipd-win)
- WSL2 USBカメラ+他のUSB機器 2022年01月17日版(https://zenn.dev/pinto0309/articles/7c7ce81bea8b6c)
- WSL2でUSBデバイスを認識させる(https://contentsviewer.work/Master/WSL/Tips/WSL2-USB/WSL2-USB)
- [Deprecated] Windows 11/10 + WSL2 + USB Camera + Serial(https://zenn.dev/pinto0309/articles/0723ae46501beb)
- OpenPoseで骨格推定 Tensorflow 2.x版(M1 Mac/Intel Mac/Windows11対応)(https://take6shin-tech-diary.com/openpose-tensorflow2/)
- NVIDIA GPU搭載PCにUbuntu 22.04LTSをインストールしてLinux機械学習環境を構築する(Tensorflow/PyTorch)(https://take6shin-tech-diary.com/ubuntu2204_ml/)