RTX3090を用いて、DeepLearningの学習を実施するとPCが電源ごと落ちる。(個人メモ)

# 0. 初めに
以下の対応でPCが電源ごと落ちなくなり学習を1日継続できるようになったのですが、対応が正しいかどうか不明です。
以下の同様の対応を行なってPCの故障が発生したとしても責任は負えません。
また、電源が直接落ちる現象で、調査方法もよくわからないままやってましたので、調査方法も正しいとは言えないと思います。

# 1. PCのスペック
2020年12月に購入しました。
電源ユニット　850W
CPU　Intel(R) Core(TM) i9-10850K CPU @ 3.60GHz (20CPUs), ～3.60GHz
メモリ　32GB
グラフィックボード　NVIDIA GeForce RTX 3090
あとは、Ubuntu環境用のSSD 1TBを増設した。

# 2. 現象
個人PCで、DeepLearningをCUDAを用いて学習させて高負荷がかかった時に、PCが電源ごと落ちて、PCが再起動する。
Windows上でDeepLearningを学習させてもPCの電源ごと落ち、Ubuntu20.04上で動かしてもPCの電源ごと落ちる。

# 3. 対策
下図のBIOS設定の「Ai Tweaker\CPU電力詳細設定」の「瞬間許容電力上限値」をAutoから1000に変更。(電源ユニットが850Wなので、1000Wを上限にしておけば十分と判断したため1000とした)
以下の対応を行なった結果、なぜかPCが落ちなくなった。
![BIOS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44864/7dc2c0f8-196f-dc01-a64c-5271dccf7449.jpeg)

# 4. 調査
Windowsでも数時間経つと電源ごと落ちたが、頻度的にUbuntu上でDeepLearningを動かしたときに10分～1時間くらい経つと電源が落ちるので、Ubuntu上で調査をした。

電源ごと落ちることは今まであまり経験がなかったため、どのように調査すればよいかわからなかったが、以下の調査をしてみた。
考えられるのは、
1. 熱暴走
1. 電力不足
1. ハード機器の故障

ハード機器の故障は私は調査する手段を持っていないため、まずは熱暴走ではないかと想定した。

## 4.1 熱暴走の調査
まずCPUの温度と、グラフィックボードの温度を調査した。

CPUの温度は`sensors`というコマンドがあったので、そのコマンドでCPUの温度を監視した。

グラフィックボードの温度は以下のコマンドを実行して500ms周期でnvidia-smiの出力結果を残した。
電源ごと落ちるので、常に書き込むようにした。
```
nvidia-smi -lms 500 > nvidia-smi.txt
```

そして、PCに直接扇風機を当てて、冷やすこともした。
どうもPC購入元の話を聞くと、「PC内部でエアフローを確立しているため、扇風機を当てて、エアフローを乱すと熱がこもるのでよくない」と言われたのですが、扇風機当てなければ、CPUの温度は90度、GPUの温度は80度と高く、直接扇風機を当てたら
CPUの温度は70度、グラフィックボードの温度は75度と下がったので、直接扇風機を当てたほうが効果があるかと思いました。(対応は自己責任で)それでもPCが電源ごと落ちるので、グラフィックボードの温度が75度になるのも温度が高いのではと思い、調査した結果、以下のコードでGPUのファンを設定できるようです。これを1秒間隔で実行するようにしました。(このサイトを参考にさせていただきました。　https://nymphium.github.io/2016/05/09/nvidia-fun-control.html)

```fnctl.sh
#!/bin/zsh

temp=$(nvidia-settings -q '[gpu:0]/GPUCoreTemp' | grep Attribute | awk '{print $4}')

nvidia-settings -a GPUFanControlState=1

if [[ "${temp:zero:2}" -gt 40 ]]; then
    nvidia-settings -a GPUTargetFanSpeed=80
elif [[ "${temp:zero:2}" -gt 38 ]]; then
    nvidia-settings -a GPUTargetFanSpeed=60
else
    nvidia-settings -a GPUTargetFanSpeed=33
fi
```


どうせならと思い、色んなログも出力しておこうと思い、日時、CPUの熱、メモリ使用量、も一緒に取得するようにしました。


```fnctl.sh
#!/bin/zsh

temp=$(nvidia-settings -q '[gpu:0]/GPUCoreTemp' | grep Attribute | awk '{print $4}')

date
sensors
free -t

nvidia-settings -a GPUFanControlState=1

if [[ "${temp:zero:2}" -gt 40 ]]; then
    nvidia-settings -a GPUTargetFanSpeed=80
elif [[ "${temp:zero:2}" -gt 38 ]]; then
    nvidia-settings -a GPUTargetFanSpeed=60
else
    nvidia-settings -a GPUTargetFanSpeed=33
fi
```

で以下のコマンドを実行して、ログを取得しました。

```
while true; do bash fnctrl.sh | tee -a fnctrl.txt; sleep 1; done
```

実際、DeepLearningを動かしながら、グラフィックボードのファンを80%にすると、グラフィックボードの温度は75度から55度前後まで
落ちたので、グラフィックボードの温度を下げるのはグラフィックボードのファンを回すのが良いと思いました。

ただ、PCの電源が落ちるのは変わらず、再起動後、CPUの温度、グラフィックボードの温度は低くても落ちました。
熱暴走でのPC再起動の可能性は薄くなりました。

## 4.2 店にPCを持って行った。
何が悪いのかよくわからなかったので、店に持って行って、PCを見てもらったのですが、グラフィックボードが怪しいのではないかと
いう判断で、グラフィックボードに高負荷を書けるベンチマークを動かしてみても、何一つ以上は起きず、20時間ほど稼働し続けました。
しかし、その店の環境でDeepLearningを動かすと、やはりPC再起動される。
この結果から、家の環境が悪いという線もなくなり、グラフィックボードも壊れてるわけではないのかなと思いました。
結局原因不明のまま、PCを家に持ち帰りました。

## 4.3 電力不足(または電源ユニットの故障？)
同じ現象が発生してる人を調べてみたのですが、電源ユニットの電力供給が足りてない、または電源ユニットが壊れてる
というような話もあって、850Wの電源ユニットから1200Wの電源ユニットに交換しようかと思ったのですが、
どうも1200WとRTX3090など相性が悪いというような記事も見られたので、電源ユニットの交換は最後の手段にしようと思いました。

## 4.4 BIOSの設定
もう少し調べていたら、BIOSの設定でPCが落ちなくなったというような記事がありました。
そこで、BIOSの設定で電力関連の設定がないか調べていたところ、CPUの電力設定のところがあり、
とりあえず、瞬間的に電力を許容する量を電源ユニットから供給される電力よりも少し多い1000Wを設定して
DeepLearningを実行したら1日稼働するようになったので効果があったのではないかと思いました。

これで、DeepLearningの学習が実行できるようになりました。

特に参考になるところはないかと思いますが、以上で個人メモを終わります。