GPUTraining & View

[yongggg's] Nvidia-smi(Failed to initialize NVML: Driver/library version mismatch)

Yonggg 2022. 8. 16. 10:27
lsmod | grep nvidia

안녕하세요 이번 시간에는 GPU 모니터링(nvidia-smi) 중, "Failed to initialize NVML: Driver/library version mismatch"라는 문구의 오류를 해결하는 방법에 대한 글을 작성하려고 합니다. 

gpu 메모리를 얼마나 쓰고 있는지, 몇 % 효율로 사용하고 있는지를 확인하기 위해서 nvidia-smi 명령어를 치고 있습니다. 이 때, 위 같은 오류가 나오면, 답답하더라구요... ㅎㅎ

이 문제의 원인은... 서버를 같이 쓰고 있는 누군가 cuda의 버전을 업데이트 했었는데, 이 이후 부터 이런 오류들이 자주 출력되어서 원인이 cuda version의 업데이트가 아닌가 생각하고 있습니다.

그래서! 다음과 같이 일시적인 해결 방법(해결은 되나, 서버 재부팅 시 다시 문제 발생)을 말씀 드리겠습니다(번거롭지만 확실한 방법).

Quit Procedure & Run nvidia-smi

서버를 재부팅 하여 관련 프로그램을 다시 실행시키는 방법이 있다. 하지만 이 방법은 끌 수 없는 서버를 관리하고 있을 때에는 실질적으로 민감한 방법이다.

따라서 강제로 nvidia 관련 process를 껐다가 다시 nvidia-smi 명령어로 nvida 관련 프로그램을 재 실행 시켜주는 방법을 사용했다. 해당 절차는 다음과 같다.

lsmod | grep nvidia

다음 명령어로 지금 켜져있는 nvidia 관련 process를 확인한다. 필자와 같은 경우는 

nvidia_uvm
nvidia_drm
nvidia_modeset
nvidia

네 개의 process가 실행 중이었다. 위의 process에서 최종에는 맨 아래의 nvidia process를 꺼주어야 하기 때문에, 다음과 같이 종속성이 없는 nvidia 관련 process 부터 unload 한다.

sudo rmmod nvidia_drm
sudo rmmod nvidia_modeset
sudo rmmod nvidia_uvm

이 세 가지 process가 내려갔으면, 해당 명령어로 nvidia 까지 unload 해준다.

sudo rmmod nvidia

만약 "rmmod: ERROR: Module nvidia is in use" 라는 에러 메시지가 나온다면, 다음의 명령어를 입력해준다.

sudo lsof /dev/nvidia*

위와 같은 절차를 진행한 뒤, 다시 nvidia 관련 프로그램이 실행중인지 검색해보면 아무런 출력창이 나오지 않아야 모든 process가 unload된 것이다.

lsmod | grep nvidia

이제 다시 nvidia-smi 명령어를 치면, 정상적으로 GPU 모니터링 화면을 볼 수 있을 것이다. 이 때, 예전과 너무 다르게 nvidia-smi 출력창이 느리게 나온 것이 확인되었다. 이때는 관리자 권한으로 로그인 한 뒤, 다음의 명령어로 nvidia process를 background에 항상 켜두면 출력창이 바로바로 출력되는 것을 확인할 수 있었다.

sudo su
nvidia-smi -pm 1
exit

nvidia driver or cuda 재설치

위에서 언급했다시피, 필자의 오류 원인은 누군가의 cuda version 변경이었다. 이를 해결하기 위해서는 cuda version 혹은 nvidia driver version을 다시 맞추는 것이 근본적인 해결방안이다.

사실 이러한 문제를 직면하지 않기 위해, docker를 사용하는 것을 적극 추천한다.

 

 

이상으로 해당 내용의 정리를 마치겠습니다^^ 일시적으로 해당 오류를 해결하시고 서버를 안쓸 때, cuda version 혹은 nvidia driver version을 확인하여 재설치하는 것을 권장드리겠습니다! 무엇보다도 마지막에 언급한 docker는 서버에 각기 다른 사람들이 서로 다른 cuda version을 쓰더라도 충돌이 나지 않기 때문에, 공용으로 사용하는 서버에서는 docker 환경에서 작업하시는 것을 강하게 추천드립니다!