Search

21.12.30: GPU 파업하다.

최악의 오류

1. 에러

GPU가 뻗었다.
모든 파라메터가 N/A 를 뿜으며 죽어 버렸다.
Output
2021-12-29 08:58:52,565-rk0-train.py#448:[ 3] 330/6800 | loss 1.3529 | mIoU 0.2955/['0.886', '0.000', '0.000'] | mAcc 0.3333/['1.000', '0.000', '0.000'] | LR ['0.010', '0.096', '0.096'] 2021-12-29 08:59:48,309-rk0-train.py#596:[ 3] Val_Teacher mIoU 0.2966/['0.890', '0.000', '0.000'] | mAcc 0.3333/['1.000', '0.000', '0.000'] 2021-12-29 08:59:48,309-rk0-train.py#597:[ 3] Val_Student mIoU 0.2966/['0.890', '0.000', '0.000'] | mAcc 0.3333/['1.000', '0.000', '0.000'] 2021-12-29 08:59:49,083-rk0-train.py#234:epoch [ 4] sample_rate_target_class_conf [0.47213766 0.52786237] | criterion_per_class [0.5887482 0.44511193 0.26645374] | sample_rate_per_class_conf [0.5606351 0.75644594 1. ] 2021-12-29 09:00:15,121-rk0-train.py#448:[ 4] 360/6800 | loss 1.2346 | mIoU 0.3019/['0.906', '0.000', '0.000'] | mAcc 0.3333/['1.000', '0.000', '0.000'] | LR ['0.010', '0.095', '0.095'] Traceback (most recent call last): File "../../train.py", line 610, in <module> main() File "../../train.py", line 154, in main labeled_epoch, class_criterion, cutmix_bank = train(model, optimizer, lr_scheduler, criterion, trainloader_sup, epoch, File "../../train.py", line 405, in train loss.backward() File "/usr/local/lib/python3.8/dist-packages/torch/tensor.py", line 221, in backward torch.autograd.backward(self, gradient, retain_graph, create_graph) File "/usr/local/lib/python3.8/dist-packages/torch/autograd/__init__.py", line 130, in backward Variable._execution_engine.run_backward( RuntimeError: CUDA error: unspecified launch failure Exception in thread StatsThr: Traceback (most recent call last): File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner self.run() File "/usr/lib/python3.8/threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "/usr/local/lib/python3.8/dist-packages/wandb/sdk/internal/stats.py", line 133, in _thread_body stats = self.stats() File "/usr/local/lib/python3.8/dist-packages/wandb/sdk/internal/stats.py", line 179, in stats handle = pynvml.nvmlDeviceGetHandleByIndex(i) File "/usr/local/lib/python3.8/dist-packages/wandb/vendor/pynvml/pynvml.py", line 819, in nvmlDeviceGetHandleByIndex _nvmlCheckReturn(ret) File "/usr/local/lib/python3.8/dist-packages/wandb/vendor/pynvml/pynvml.py", line 310, in _nvmlCheckReturn raise NVMLError(ret) wandb.vendor.pynvml.pynvml.NVMLError_GpuIsLost: GPU is lost Exception in thread StatsThr: Traceback (most recent call last): File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner self.run() File "/usr/lib/python3.8/threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "/usr/local/lib/python3.8/dist-packages/wandb/sdk/internal/stats.py", line 133, in _thread_body stats = self.stats() File "/usr/local/lib/python3.8/dist-packages/wandb/sdk/internal/stats.py", line 179, in stats handle = pynvml.nvmlDeviceGetHandleByIndex(i) File "/usr/local/lib/python3.8/dist-packages/wandb/vendor/pynvml/pynvml.py", line 819, in nvmlDeviceGetHandleByIndex _nvmlCheckReturn(ret) File "/usr/local/lib/python3.8/dist-packages/wandb/vendor/pynvml/pynvml.py", line 310, in _nvmlCheckReturn raise NVMLError(ret) wandb.vendor.pynvml.pynvml.NVMLError_GpuIsLost: GPU is lost
Shell
복사
GPU is lost.
이유도 나와있지 않다. 그냥 GPU가 끊어져버린다.
이러면 무조건 재부팅을 해야한다.
DistributedDataParallelmultiThreading까지 더해져서 이런일이 생기는 듯 하다.

뭘까?

많은 생각이 스쳐간다.
gpu의 모델이 서로 달라서?
gpu 전원의 과부하?
적절하지 못한 memory 배분?
통신의 문제?
연결불량?
도대체 뭘까?

Possible Solutions

label의 num_class 와 model 출력단의 채널 수가 같아야 한다는 의견
target이 0과 1사이의 값을 가져야 한다는 의견
GPU 온도나 power 이슈라는 의견 (과도한 utilization? 부족한 전원공급?)
마찬가지로 power 부족이라는 의견

본격적으로 원인파악을 해보자.

아래 명령어를 실행시키면 그래픽카드에 관련된 모든 로그가 담긴 파일이 생성된다.
nvidia-bug-reports.sh gzip -d nvidia-bug-reports.log.gz
Shell
복사
생성된 nvidia-bug-reports.log 파일을 보자.
엄청나게 긴 외계어 로그파일이 보여지고...
그 중에서 직접적인 원인을 찾아본다.
nvidia-bug-report.log
1018.2KB
... 1230 04:56:13 b3 kernel: NVRM: A GPU crash dump has been created. If possible, please run NVRM: nvidia-bug-report.sh as root to collect this data before NVRM: the NVIDIA kernel module is unloaded. 1230 04:56:13 b3 kernel: NVRM: GPU at PCI:0000:01:00: GPU-b2625df5-6c09-5dd0-ce56-b91ffc31cda4 1230 04:56:13 b3 kernel: NVRM: GPU at PCI:0000:01:00: GPU-b2625df5-6c09-5dd0-ce56-b91ffc31cda4 1230 04:56:13 b3 kernel: NVRM: GPU Board Serial Number: 1320220059181 1230 04:56:13 b3 kernel: NVRM: GPU Board Serial Number: 1320220059181 1230 04:56:13 b3 kernel: NVRM: Xid (PCI:0000:01:00): 79, pid=0, GPU has fallen off the bus. 1230 04:56:13 b3 kernel: NVRM: GPU 0000:01:00.0: GPU has fallen off the bus. 1230 04:56:13 b3 kernel: NVRM: Xid (PCI:0000:01:00): 79, pid=0, GPU has fallen off the bus. 1230 04:56:13 b3 kernel: NVRM: GPU 0000:01:00.0: GPU has fallen off the bus. 1230 04:56:13 b3 kernel: NVRM: GPU 0000:01:00.0: GPU is on Board 1320220059181. 1230 04:56:13 b3 kernel: NVRM: GPU 0000:01:00.0: GPU is on Board 1320220059181. 1230 04:56:45 b3 nvidia-persistenced[860]: Received signal 15 1230 04:56:45 b3 nvidia-persistenced[860]: Socket closed. 1230 04:56:45 b3 nvidia-persistenced[860]: device 0000:01:00.0 - persistence mode disabled. 1230 04:56:45 b3 nvidia-persistenced[860]: device 0000:01:00.0 - NUMA memory offlined. 1230 04:56:45 b3 nvidia-persistenced[860]: device 0000:02:00.0 - persistence mode disabled. 1230 04:56:45 b3 nvidia-persistenced[860]: device 0000:02:00.0 - NUMA memory offlined. 1230 04:56:45 b3 nvidia-persistenced[860]: PID file unlocked. 1230 04:56:45 b3 nvidia-persistenced[860]: PID file closed. 1230 04:56:45 b3 nvidia-persistenced[860]: The daemon no longer has permission to remove its runtime data directory /var/run/nvidia-persistenced 1230 04:56:45 b3 nvidia-persistenced[860]: Shutdown (860) ...
Shell
복사
Xid 메시지는 GPU 에러가 발생할 때 생성되는 에러코드이다.
Xid 79라는 코드가 눈에 띈다.
레퍼런스 챙기고..
하드웨어 혹은 파워문제라고 말한다.

결론

에러가 나는 순간의 코드는 다음과 같다.
데이터로더와 모델을 모두 준비한 후,
본격적으로 forward를 할 때 바로 shutdown된다.
이는 두개의 gpu 파워가 모두 최고로 치솟자마자 셧다운 되는 것으로 보인다.
일단 파워가 부족한 것으로 이해하자.
원인을 알았으니.. 이제 파워를 바꾸어 달아봐야겠다.