Linux

[nvidia-smi] Failed to initialize NVML: Driver/library version mismatch

비번변경 2022. 2. 20. 20:54

Nvidia GPU를 사용하는 서버에서 nvidia-smi 명령어 수행 시 아래와 같이 에러 메시지가 출력되면서 동작하지 않는 경우가 있다.

Failed to initialize NVML: Driver/library version mismatch

dmesg 명령을 사용하면 아래와 같은 NVRM: API mismatch 메세지를 볼 수 있는데,

dmesg

클라이언트가 가진 버전과 kernel module의 버전에 차이로 인한 메세지라는 것을 확인할 수 있다.

보안 업데이트를 자동으로 수행하는 unattended-upgrade에 의해 버전 업데이트가 발생했기 때문에 버전에 차이가 생긴 게 그 원인이다. 관련 이력은 아래와 같이 확인할 수 있다.

 

업데이트 이력 확인

1. apt 로그 확인

view /var/log/apt/history.log

view /var/log/apt/history.log

 

2. unattended-upgrades 로그 확인

view /var/log/unattended-upgrades/unattended-upgrades.log

view /var/log/unattended-upgrades/unattended-upgrades.log

 

현상 해결 방법

unattended-ugrades 대상에서 nvidia 드라이버를 제외하면 된다.

하지만 이 글에서는 이미 버전 업데이트가 완료되었기 때문에 nvidia kernel module을 Unloading 한 후, 다시 로딩하는 방법으로 문제를 해결할 것이다.

 

1. nvidia kernel module 의존성 확인

lsmod | grep nvidia

lsmod | grep nvidia

왼편의 모듈이 오른쪽의 모듈을 의존한다. 즉, nvidia_modeset은 nvidia_drm을 의존한다.

 

2. nvidia kernel module Unload

nvidia 관련 모듈만 Unload하며, 다른 모듈을 의존하지 않는 모듈부터 언로드 한다.

rmmod nvidia_drm
rmmod nvidia_modeset
rmmod nvidia_uvm
rmmod nvidia

# 형식
rmmod <MODULE_NAME>

 

 

2-1) 모듈이 사용 중이므로 rmmod 수행이 불가능한 경우

ERROR: Module is in use

해당 모듈을 사용하는 프로세스를 확인하여, 그 프로세스를 종료한다.

 

프로세스 확인

lsof /dev/nvidia*

lsof /dev/nvidia*

pid가 높은 것부터 하나씩 죽여보도록 한다.

 

2-2) 모듈을 사용 중인 프로세스를 전부 종료했음에도 rmmod가 불가능한 경우

modprobe -r 옵션을 이용하여 언로딩을 시도한다.

modprobe -r <MODULE_NAME>

# 예시
modprobe -r nvidia_drm
💡 rmmod
모듈에 대한 의존성을 고려하지 않기 때문에 프로세스에 의해 점유되어 있는 모듈은 언로드할 수 없다.

modprobe
모듈에 대한 의존성을 고려하여, 모듈을 로드하거나 언로드한다.

 

2-3) modprobe -r 시도 시, 아래 메세지와 함께 실패하는 경우

modprobe: FATAL: Module nvidia is in use

런레벨을 변경하여 재시도해본다.

# 현재 런레벨 확인
who -r
## 출력
run-level 5  2022-02-07 10:12

# 런레벨을 multiuser로 변경
systemctl isolate multi-user.target

# 모듈 언로딩
modprobe -r <MODULE_NAME>
rmmod <MODULE_NAME>

# 런레벨 원복
systemctl start <TARGET>
## 예시
systemctl start graphical.target

 

3. nvidia-smi 실행 확인

nvidia-smi

nvidia-smi

이상이 없다면 정상적으로 수행되는 모습을 확인할 수 있다.

 

kernel module unload/load 관련 로그는 dmesg 명령으로 확인할 수 있다.

dmesg

dmesg

 


참고 문서

https://blog.ggaman.com/1029