
機械学習目的で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
ツールバージョン
項目 | 内容 |
WSL2 | Ubuntu-20.04 LTS |
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ターミナル(管理者)を立ち上げ、以下のコマンドでWSL2 Ubuntu-20.04 LTSをインストールします。
PS> wsl --install -d Ubuntu-20.04
NVIDIAドライバのインストール
NVIDIAのダウンロードサイトから、以下のように選択してダウンロードします。

Windowsターミナルでnvidia-smiを実行します。
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
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
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
ここでランタイムライブラリのエラーを回避するためのシンボリックリンクを作ります。
sudo ln -s /usr/local/cuda-11.5/lib64/libcusolver.so.11 /usr/local/cuda-11.5/lib64/libcusolver.so.10
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が見つかりますので起動します。

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

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

作成した規則に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
再度Ubuntu 20.04のターミナルを立ち上げます。

再度カーネルのバージョンと日付を確認します。
uname -v -r 5.10.60.1-microsoft-standard-WSL2+ #1 SMP Wed Feb 23 15:55:05 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をインストールします。
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のバージョンを確認します。
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の使用率を確認することができます。

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
以下のような画面が出て、音が出れば成功です。

遊び方:
キーボードの左右キーで移動して爆弾を避けながら、スペースキーでミサイル発射して敵機を撃ち落とします。
トラブルシューティング
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*
することで正常にカメラ入力できるようになりました。
書籍紹介
最短コースでわかる PyTorch &深層学習プログラミング
PyTorchを基礎から学べる入門書で、初学者から中級者くらいまでを対象にしています。
実践して楽しむことを重視していて、充実のサンプルコードで画像認識やテキスト分析、GAN生成といったAI応用をGoogle Colab環境下で体験できます。
まとめ
NVIDIA GPU搭載PCで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で実施(近日公開予定)
参考文献
- 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/)