LoginSignup
tanimotsu
@tanimotsu (tanimoto yuu)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

yolov5でのGPU認識について

Q&AClosed

yolov5で独自データを学習させているのですが、
GPUは認識した場合は、Epochが進んでもbox_loss、obj_lossがnanのまま学習が進みまず、
場合によっては、
学習は進むのですが、GPUを認識しない等、どうしたら適切になるのか悩んでおります。

CUDAを11.7 → 11.6 へ変更したり、
Pytorchをpipでインストールしたりはしてみました。
が…改善できずです。

  Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
  1/999      3.42G        nan        nan          0       6636        640: 100%|██████████| 2/2 [00:14<00:00,  7.37s/it]
             Class     Images  Instances          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 1/1 [00:00<00:00,  2.56it/s]
               all          3       2060          0          0          0          0

あるいは、

  Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
  0/999         0G     0.2008      0.132          0       4060        640: 100%|██████████| 2/2 [00:32<00:00, 16.46
             Class     Images  Instances          P          R     mAP@.5 mAP@.5:.95:   0%|          | 0/1 [00:00<?WARNING: NMS time limit 0.390s exceeded
             Class     Images  Instances          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 1/1 [00:03<0
               all          3       2060       0.01    0.00146    0.00509   0.000844

現在の環境等
PC:DELL G3
OS:Windows 11
CPU:intel CORE i7 9th Gen
GPU:GeForce GTX 1650

NVIDIA CUDA Toolkit 11.6.2
NVIDIA cuDNN v8.4.1
Pytorch 1.12.1

Anaconda Navigator Powershell Prompt 0.0.1で主に実行しています。
です。

改善のアイデアがありましたら、お教えいただきたく質問いたしました。
よろしくお願いいたします。

0

2Answer

考えられる原因1

YOLOv3でも学習時にnanが出るケースがあるらしく,それを指摘したissueではバッチサイズが1である場合に起きるのではという議論がなされていました.

もう少し,具体的なハイパーパラメータを示していただけると原因の探究ができそうです.

考えられる原因2

Cross-Entropyを使っていることが原因説1
対数関数$\log(x)$が使われるので,0を入力に取ると$\log(0)=-\infty$すなわちnanになる.

考えられる原因3

Sigmoid関数を使っていることが原因説1
桁数多めの負の値(-500とか)を入力に取ると32bit精度の浮動小数点数では$0$が出力される.これを用いて計算するCross-Entropyや0除算によってnanになる.

考えられる原因4

重みが無限大にまで増大したことが原因説1
YOLOv5の仕様を理解していないのですが,もし内部で重み正則化項を損失のペナルティとして使っているのなら考えなくてよさそうです.最近のものは全部入っている印象ですが

考えられる原因5

データセットが原因説2
独自データとのことなので有り得る.

考えられる原因6

メモリ不足説.
GTX 1650は4[GB]らしいですが,YOLOv5のモデルサイズ(s, m , l , x)のどれを採用しているのですか?
既にGPU_memが3.42Gを指しており,圧迫しているようにも見えます.

あまり考えたくない原因7

やはり環境がおかしい

感想

最初からnanのままってのはあまり考えられないのです.具体的にどういう学習したのか教えていただけると幸いです.

場合によっては、学習は進むのですが、GPUを認識しない

という件が気になります.環境設定の問題かメモリ不足によってCPUに切り替えさせられたとかの原因が考えられます.ここで言う「場合によっては」を具体的に教えて欲しいです.実行ごとに異なるならその旨を記してください.

とりあえず,YOLOv5を動かすことにこだわらず,超絶シンプルなモデル3を作成してGPUを使った学習をしてみるのが一番だと考えられます.問題の切り分けをするにはそれしかありません.もし超絶シンプルモデルが動かないなら環境のせいです.モデルを大きくして(U-Netとか良さそう)4動かないならメモリ不足,それでも動くなら...って感じでやりましょう.

  1. https://nonbiri-tereka.hatenablog.com/entry/2016/03/10/073633 2 3

  2. https://zenn.dev/yusukemikami/articles/524870b5b47f05

  3. 3入力3層1出力の全層結合とかで良い.iris等既存のデータセットで試してみること.

  4. 上でnanが起きているときと同様,メモリ3.4GBになるように調整すること.

0

Comments

  1. 解決されてよかったです.GPU_memが0GBよりは,nanが出ている方がGPUで計算できている感じですかね,とりあえず質問を「クローズ」にしていただいて終了になります.お疲れ様でした.

PondVillege 様

お礼が遅くなり大変申し訳ございません。

確認したところ、
・iris datasetを用いた回帰では問題なくGPUが使用されていたこと
・GoogleColaboを用いて、同様の独自データをYOLOV5mで学習させると実行するが、GPUメモリが4GB以上使用されている時があること
・GTX 1650のメモリが4GBであること
から、メモリ不足の可能性が最も高そうです。

当初は環境の問題と考え、CUDAのバージョンを変えたり、Anaconda、Pythorchの再インストール等々変えてみましたが、ある環境設定のときはnanの症状、ある環境設定のときはGPUメモリ 0GBの症状といった具合となっていました。

ありがとうございました。

0

Your answer might help someone💌