Windows10にGPU環境で動くYOLOv5を構築したら

 うちのPCは Intel(R) Core(TM) i5-6600 CPU @ 3.30GHz   3.30 GHz ……第6世代のCorei5という古いマシンなのですが、GeForce RTX 2060というグラフィックボードが搭載されています。

ゲームしているわけじゃないんですが、1年位前に税込みで4万円を切る価格で販売されていてなんとなく装着したのです。2021年6月5日現在6万円後半の値付けになっていて驚きなんですが。


で、GPU機能を使ったyolov5を動かしてみたわけです。

結論から言うと、ちゃんと動作しています。

レシピを残しておきましょう。


環境:

OS:Windows10(バージョン21H1)

GPU:GeForce RTX 2060

CUDA:11.3.109

miniconda利用


0.GeForceのドライバーのインストール

これはさすがにインストール済みだと思うが、念のためにここからダウンロードしてインストールすることが可能。

https://www.nvidia.com/Download/index.aspx?lang=en-us


1.Visual Studioをインストールする

https://visualstudio.microsoft.com/ja/downloads/

からCommunityバージョンをダウンロード・インストールする。

僕が使用したのは、Visual Studio 2019でした。

途中でワークロードについて問われるので、「C++によるデスクトップ開発」を選択しておく必要があります。


2.CUDA Toolkitをインストールする

https://developer.nvidia.com/cuda-toolkit-archive

ここから、CUDA Toolkitをダウンロードしてきます。

今回はCUDA Toolkit 11.3.1(May2021)をインストールします。


Pathが通っているか確認するため、スタートキーの設定ボタンから→システム→詳細情報→システムの詳細設定→環境設定へ移動


ユーザー環境変数Pathのところで

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3\libnvvp


が存在しているか確認(バージョンが変われば上記の記述は変わってゆくことでしょう。また、何らかの理由でCUDAのイントールドライブ、フォルダが異なれば変わってゆくことでしょう)。


システム環境変数で、

変数名:CUDA_PATH

変数値:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3


変数名:CUDA_PATH_V11_3

変数値:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3


になっていれば、まずはOK。


PCをリブートしてPathの設定を有効にします。

PCのリブートが終わったらコマンドプロンプトでも、PowerShellでもどちらでもよいので立ち上げて動作テストをします。


> nvcc -V

nvcc: NVIDIA (R) Cuda compiler driver

Copyright (c) 2005-2021 NVIDIA Corporation

Built on Mon_May__3_19:41:42_Pacific_Daylight_Time_2021

Cuda compilation tools, release 11.3, V11.3.109

Build cuda_11.3.r11.3/compiler.29920130_0


と表示されればCUDAのインストールは成功しています。


3.cuDNNをインストール

ダウンロードするにあたってnvidiaにアカウントを作る必要があります(無料)。

https://developer.nvidia.com/cuDNN


このページの「Download cuDNN」ボタンをクリックし、ログインページを進んでゆきます。


「Download cuDNN v8.2.0 (April 23rd, 2021), for CUDA 11.x」を選択。

cuDNN Library for Windows(x86)を選択し、ダウンロードしてきます。


ローカルでzipファイルを展開します。

展開したフォルダにcudaがありますからそこに入ると、

bin

include

lib

の3つのフォルダをコピーし、

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3

で上書き貼り付け(要は貼り付け)します。


先ほどのCUDAでPathを通したように、環境変数のところへ行き、システム環境設定に新規で下記情報を書き込みます。


変数名:CUDNN_PATH

変数値:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3


PCをリブートしてシステム環境設定を有効にします。

PCのリブートが終わったらコマンドプロンプトを立ち上げて動作テストをします。


a>where cudnn64_8.dll

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3\bin\cudnn64_8.dll


と表示されれば、cuDNNのインストールは成功です。


4.Minicondaをインストール

ノーマルにPythonをインストールして構築する方法もあるのですが、個人的にM1 Mac miniでMinicondaを動かしている関係で、Minicondaベースで構築します。


https://docs.conda.io/en/latest/miniconda.html

からPython 3.9をバージョンであるMiniconda3 Windows64-bitをダウンロード・インストールします。(僕は個人的事情でDドライブにインストールしました)

途中でPathを環境変数に登録するか尋ねられますが、僕はチェックを入れてインストーラーに登録してもらいました。


インストールが終わったらPCをリブートします。


スタートメニューにAnaconda Powershell Prompt(miniconda3)と、Anaconda Prompt(miniconda3)の二つがいると思います。僕はPowershellバージョンを使用しています。


> conda -V

conda 4.9.2


> python --version

Python 3.9.1


と表示されれば問題なしと思います。


Anaconda本体をアップデートしておきましょう。

> conda update -n base conda


僕の環境ではcondaのバージョンがconda 4.10.1にアップデートされました。


Anacondaのすべてのパッケージをアップデートしておきます。

> conda update --all


僕の環境ではPythonのバージョンがPython 3.9.5になっていました。

進化が速いですね。。。


5.gitをインストール

インストール済みの人はスキップしてください。

未インストールの人は下記を参考にインストールします。

https://www.curict.com/item/60/60bfe0e.html


6.Minicondaで仮想環境を作る

下記を入力します。環境名の部分はお好きな文字で。

> conda create -n 環境名 python


僕はべたにyolov5としたので下記のようになりました。

> conda create -n yolov5 python


仮想環境で作業するときは、Anaconda Powershell Promptを立ち上げて、

> conda activate 環境名

を入力することで仮想環境に入って行けます。


★以降は仮想環境に入った状態であることが前提で進みます。


7.YOLOv5のダウンロードとインストール


下記コマンドを入力すると、Windpwsユーザーフォルダ内にyolov5というフォルダが作られます。

> git clone https://github.com/ultralytics/yolov5.git


作られたyolov5のフォルダに移動します。


下記コマンドを実行します。

>pip install -U -r requirements.txt


インストール作業が進んで行きます(トラブルのないインストールは見てて楽しい)。


Collecting matplotlib>=3.2.2

  Using cached matplotlib-3.4.2-cp39-cp39-win_amd64.whl (7.1 MB)

Collecting numpy>=1.18.5

  Using cached numpy-1.20.3-cp39-cp39-win_amd64.whl (13.7 MB)

Collecting opencv-python>=4.1.2

  Using cached opencv_python-4.5.2.52-cp39-cp39-win_amd64.whl (34.7 MB)

Collecting Pillow

  Using cached Pillow-8.2.0-cp39-cp39-win_amd64.whl (2.2 MB)

Collecting PyYAML>=5.3.1

  Using cached PyYAML-5.4.1-cp39-cp39-win_amd64.whl (213 kB)

Collecting scipy>=1.4.1

  Using cached scipy-1.6.3-cp39-cp39-win_amd64.whl (32.7 MB)

Collecting torch>=1.7.0

  Using cached torch-1.8.1-cp39-cp39-win_amd64.whl (190.5 MB)

Collecting torchvision>=0.8.1

  Using cached torchvision-0.9.1-cp39-cp39-win_amd64.whl (852 kB)

Collecting tqdm>=4.41.0

  Using cached tqdm-4.61.0-py2.py3-none-any.whl (75 kB)

Collecting tensorboard>=2.4.1

  Using cached tensorboard-2.5.0-py3-none-any.whl (6.0 MB)

Collecting seaborn>=0.11.0

  Using cached seaborn-0.11.1-py3-none-any.whl (285 kB)

Collecting pandas

  Using cached pandas-1.2.4-cp39-cp39-win_amd64.whl (9.3 MB)

Collecting pycocotools>=2.0

  Using cached pycocotools-2.0.2-cp39-cp39-win_amd64.whl

Collecting thop

  Using cached thop-0.0.31.post2005241907-py3-none-any.whl (8.7 kB)

Collecting cycler>=0.10

  Using cached cycler-0.10.0-py2.py3-none-any.whl (6.5 kB)

Collecting pyparsing>=2.2.1

  Using cached pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)

Collecting kiwisolver>=1.0.1

  Using cached kiwisolver-1.3.1-cp39-cp39-win_amd64.whl (51 kB)

Collecting python-dateutil>=2.7

  Using cached python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)

Collecting typing-extensions

  Using cached typing_extensions-3.10.0.0-py3-none-any.whl (26 kB)

Collecting tensorboard-data-server<0.7.0,>=0.6.0

  Using cached tensorboard_data_server-0.6.1-py3-none-any.whl (2.4 kB)

Collecting grpcio>=1.24.3

  Using cached grpcio-1.38.0-cp39-cp39-win_amd64.whl (3.2 MB)

Collecting tensorboard-plugin-wit>=1.6.0

  Using cached tensorboard_plugin_wit-1.8.0-py3-none-any.whl (781 kB)

Requirement already satisfied: wheel>=0.26 in d:\miniconda3\envs\yolov5\lib\site-packages (from tensorboard>=2.4.1->-r requirements.txt (line 15)) (0.36.2)

Collecting werkzeug>=0.11.15

  Using cached Werkzeug-2.0.1-py3-none-any.whl (288 kB)

Collecting markdown>=2.6.8

  Using cached Markdown-3.3.4-py3-none-any.whl (97 kB)

Collecting protobuf>=3.6.0

  Downloading protobuf-3.17.2-py2.py3-none-any.whl (173 kB)

     |████████████████████████████████| 173 kB 6.8 MB/s

Collecting absl-py>=0.4

  Using cached absl_py-0.12.0-py3-none-any.whl (129 kB)

Collecting google-auth<2,>=1.6.3

  Using cached google_auth-1.30.1-py2.py3-none-any.whl (146 kB)

Collecting requests<3,>=2.21.0

  Using cached requests-2.25.1-py2.py3-none-any.whl (61 kB)

Collecting google-auth-oauthlib<0.5,>=0.4.1

  Using cached google_auth_oauthlib-0.4.4-py2.py3-none-any.whl (18 kB)

Requirement already satisfied: setuptools>=41.0.0 in d:\miniconda3\envs\yolov5\lib\site-packages (from tensorboard>=2.4.1->-r requirements.txt (line 15)) (52.0.0.post20210125)

Collecting pytz>=2017.3

  Using cached pytz-2021.1-py2.py3-none-any.whl (510 kB)

Collecting cython>=0.27.3

  Using cached Cython-0.29.23-cp39-cp39-win_amd64.whl (1.7 MB)

Collecting six

  Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)

Collecting rsa<5,>=3.1.4

  Using cached rsa-4.7.2-py3-none-any.whl (34 kB)

Collecting cachetools<5.0,>=2.0.0

  Using cached cachetools-4.2.2-py3-none-any.whl (11 kB)

Collecting pyasn1-modules>=0.2.1

  Using cached pyasn1_modules-0.2.8-py2.py3-none-any.whl (155 kB)

Collecting requests-oauthlib>=0.7.0

  Using cached requests_oauthlib-1.3.0-py2.py3-none-any.whl (23 kB)

Collecting pyasn1<0.5.0,>=0.4.6

  Using cached pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)

Collecting chardet<5,>=3.0.2

  Using cached chardet-4.0.0-py2.py3-none-any.whl (178 kB)

Collecting urllib3<1.27,>=1.21.1

  Using cached urllib3-1.26.5-py2.py3-none-any.whl (138 kB)

Collecting idna<3,>=2.5

  Using cached idna-2.10-py2.py3-none-any.whl (58 kB)

Requirement already satisfied: certifi>=2017.4.17 in d:\miniconda3\envs\yolov5\lib\site-packages (from requests<3,>=2.21.0->tensorboard>=2.4.1->-r requirements.txt (line 15)) (2021.5.30)

Collecting oauthlib>=3.0.0

  Downloading oauthlib-3.1.1-py2.py3-none-any.whl (146 kB)

     |████████████████████████████████| 146 kB 6.4 MB/s

Installing collected packages: urllib3, pyasn1, idna, chardet, six, rsa, requests, pyasn1-modules, oauthlib, cachetools, typing-extensions, requests-oauthlib, pytz, python-dateutil, pyparsing, Pillow, numpy, kiwisolver, google-auth, cycler, werkzeug, torch, tensorboard-plugin-wit, tensorboard-data-server, scipy, protobuf, pandas, matplotlib, markdown, grpcio, google-auth-oauthlib, cython, absl-py, tqdm, torchvision, thop, tensorboard, seaborn, PyYAML, pycocotools, opencv-python

Successfully installed Pillow-8.2.0 PyYAML-5.4.1 absl-py-0.12.0 cachetools-4.2.2 chardet-4.0.0 cycler-0.10.0 cython-0.29.23 google-auth-1.30.1 google-auth-oauthlib-0.4.4 grpcio-1.38.0 idna-2.10 kiwisolver-1.3.1 markdown-3.3.4 matplotlib-3.4.2 numpy-1.20.3 oauthlib-3.1.1 opencv-python-4.5.2.52 pandas-1.2.4 protobuf-3.17.2 pyasn1-0.4.8 pyasn1-modules-0.2.8 pycocotools-2.0.2 pyparsing-2.4.7 python-dateutil-2.8.1 pytz-2021.1 requests-2.25.1 requests-oauthlib-1.3.0 rsa-4.7.2 scipy-1.6.3 seaborn-0.11.1 six-1.16.0 tensorboard-2.5.0 tensorboard-data-server-0.6.1 tensorboard-plugin-wit-1.8.0 thop-0.0.31.post2005241907 torch-1.8.1 torchvision-0.9.1 tqdm-4.61.0 typing-extensions-3.10.0.0 urllib3-1.26.5 werkzeug-2.0.1


インストールが終わったら動作確認をしてみます。

yolov5ではおなじみのヤツです。




> python detect.py --source .\data\images\zidane.jpg
Namespace(weights='yolov5s.pt', source='.\\data\\images\\zidane.jpg', img_size=640, conf_thres=0.25, iou_thres=0.45, max_det=1000, device='', view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, update=False, project='runs/detect', name='exp', exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False)
YOLOv5  2021-6-5 torch 1.8.1+cpu CPU

Fusing layers...
Model Summary: 224 layers, 7266973 parameters, 0 gradients
image 1/1 C:\Users\ユーザー名\yolov5\data\images\zidane.jpg: 384x640 2 persons, 2 ties, Done. (0.156s)
Results saved to runs\detect\exp
Done. (0.189s)

結果を見てみましょうか。

yolov5\runs\detect の中にexpというフォルダが並びます。
今回はexpへ行けという指示でしたのでそこへ行くとyolov5の判定結果が保存されているはずです。




8.CPU利用環境からGPU利用環境へ移行する

先ほどの動作検証で、下記のメッセージが出ていました。
YOLOv5  2021-6-5 torch 1.8.1+cpu CPU

今の環境を調べる方法はこちらです。

> python
Python 3.9.5 (default, May 18 2021, 14:42:02) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.cuda.is_available())
False
>>> exit()

cudaが動いていない(False)の状況です。
ここからGPUが動く環境に移行させます。

まず、CPUで動く Pytorchを削除します。
下記のコマンドを入力します。

> pip uninstall torch
> pip uninstall torchvision

次にPytorchのサイトへ行きます。
https://pytorch.org/

Installボタンをクリック(またはGet Starttedタブをクリック)するとページ遷移し、START LOCALLYのページが表示されます。
ここで、
PyTorch Build:Stable1.8.1
Your OS:Windows
Pakage:Conda
Language:Python
Computer Platform:CUDA11.1

を選択するとコマンドが表示されます。
Run this Command:
conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch -c conda-forge

これをコピーし、Anaconda Powershell Promptで実行(もちろん指定の仮想環境で)。インストールが終わったらGPUが使用できるようになったか確認してみましょうか。

> python
Python 3.9.5 (default, May 18 2021, 14:42:02) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.cuda.is_available())
True

True表示が出たのでめでたくGPUが利用できる環境が手に入りました。
続けて下記を入力してみます。

>>> print(torch.cuda.get_device_name(0))
NVIDIA GeForce RTX 2060

GPUボード名も表示されたので環境は完成した模様。

CPU環境でも試したzidane.jpgの判定をやってみました。

> python detect.py --source .\data\images\zidane.jpg
Namespace(weights='yolov5s.pt', source='.\\data\\images\\zidane.jpg', img_size=640, conf_thres=0.25, iou_thres=0.45, max_det=1000, device='', view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, update=False, project='runs/detect', name='exp', exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False)
YOLOv5  2021-6-5 torch 1.8.1 CUDA:0 (NVIDIA GeForce RTX 2060, 6144.0MB)

Fusing layers...
Model Summary: 224 layers, 7266973 parameters, 0 gradients
image 1/1 C:\Users\ユーザー名\yolov5\data\images\zidane.jpg: 384x640 2 persons, 2 ties, Done. (0.022s)
Results saved to runs\detect\exp
Done. (0.057s)

0.189s → 0.057sですので約30%程度の時間で判定が終わった計算になります。
速いな。。。

下記コマンドでWebカメラからの映像を判別できます。
> python detect.py --source 0

CPUだとカクカクした処理がGPU環境になるとヌルヌル動くのが感動的です。

0 件のコメント:

コメントを投稿