Nvidia GPU를 사용하는 서버에서 nvidia-smi 명령어 수행 시 아래와 같이 에러 메시지가 출력되면서 동작하지 않는 경우가 있다.
dmesg 명령을 사용하면 아래와 같은 NVRM: API mismatch 메세지를 볼 수 있는데,
클라이언트가 가진 버전과 kernel module의 버전에 차이로 인한 메세지라는 것을 확인할 수 있다.
보안 업데이트를 자동으로 수행하는 unattended-upgrade에 의해 버전 업데이트가 발생했기 때문에 버전에 차이가 생긴 게 그 원인이다. 관련 이력은 아래와 같이 확인할 수 있다.
업데이트 이력 확인
1. apt 로그 확인
view /var/log/apt/history.log
2. unattended-upgrades 로그 확인
view /var/log/unattended-upgrades/unattended-upgrades.log
현상 해결 방법
unattended-ugrades 대상에서 nvidia 드라이버를 제외하면 된다.
하지만 이 글에서는 이미 버전 업데이트가 완료되었기 때문에 nvidia kernel module을 Unloading 한 후, 다시 로딩하는 방법으로 문제를 해결할 것이다.
1. nvidia kernel module 의존성 확인
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 수행이 불가능한 경우
해당 모듈을 사용하는 프로세스를 확인하여, 그 프로세스를 종료한다.
프로세스 확인
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
이상이 없다면 정상적으로 수행되는 모습을 확인할 수 있다.
kernel module unload/load 관련 로그는 dmesg 명령으로 확인할 수 있다.
dmesg
참고 문서