注意: 以下の対処法で弊社GPUはlossがnanにならなくなりましたが、精度が上がらないという問題に直面しました(他のGPUを使えばあがります)。よって弊社としては故障と結論づけました。そのため、うまく学習精度が上がらない場合は一度機材の方を疑ってみてください。
学習を進めていると奇妙な問題にぶち当たってしまったので記事にしておきます。GPUPCを組み立てた直後にしか発生しない可能性があります。
問題
弊社内にはGPUPCはいくつかありますが、新しく購入したGPUPCで学習ができず、精度が上がらず、最終的にはlossがnanとなるような状況でした。
問題を切り分けるため、別のGPUPCで同じソースコード、同じcudaで実行して問題なく学習できることを確認しています。また問題が発生しているGPUPCでGPUを使わずにCPUで学習しても学習できることを確認しました。
そこでGPUの問題と限定して調査をしていると、(cudaのバージョンなど一通り調べた後に)nvidia-smi
の実行内容を細かく見ていると、Persistence-M
がOFF
になっているのを見つけました!
正常に学習できるGPUPCはON
になっています。
解決方法
sudo nvidia-smi -pm 1
Persistence-Mとは
Persistence-Mとはなんだったのでしょうか?
持続モードを設定することでGPUアクセスがないときにも、nVidiaドライバーをロードし続けてくれます。消費電力は増えますが、nVidiaドライバーのロードにかかる時間が短縮化されます。この設定を予め実施しておかないと供給電力の設定変更ができません。
確かにON
にしてからちゃんと学習しているFANの音か聞こえてはじめました。これで一安心です。
追記
lossがnanになってしまった学習にはEfficientDet
を使っていました。もしかすると、機材のトラブル以外に以下のような点を確認すると、nanを防ぐことができるかもしれません。
batch sizeやlearning rateを小さくして検証することで無駄にGPUを処分しなくて済む可能性があります。(弊社ではもしかすると無駄にGPUを処分してしまった可能性が。。)
HAPPY GPU LIFE!!