우분투에서 nvidia 드라이버가 작동하지 않음

HDD가 망가졌기 때문에 새로 SSD를 사서 Ubuntu를 다시 넣고 CUDA를 넣었지만 설치된 NVIDIA 드라이버가 잘 작동하지 않고 nvidia-smi를 치면 이런 메시지가 나와 곤란했다
$ nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running."

결론적으로는 우분투의 최신 커널에서는 nvidia 드라이버가 작동하지 않는 트러블이 일어나고 있는 것 같기 때문에 우분투 커널을 낡은 것으로 바꾸면 정상이 되었다.

환경


  • 우분투 16.04
  • GTX 1080
  • CUDA 8.0

  • 일단 작업 절차


    $ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
    $ sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
    $ sudo apt-get update
    $ sudo apt-get install cuda
    $ sudo init 6
    

    이제 cuda-toolkit과 nvidia-387이 자동으로 설치되어 이전이라면 문제없이 작동했습니다.
    그러나 nvidia 드라이버에 액세스할 수 없는, 드라이버가 맞지 않는 것 같은 것을 말해져 곤란했다.
    기동시에도 해상도가 맞지 않고, 잘 드라이버가 읽어들여 있지 않은 모양.
    $ nvidia-smi
    NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running."
    

    혹시 nvidia 드라이버 버전이 다른가? 라고 생각해, nvidia 사이트 그리고 대상 GPU의 드라이버의 버젼을 확인해 본다.
    GTX1080이라고 384로 나왔으므로, nvidia-387을 삭제하고 nvidia-384를 넣으려고 시도한다.

    삭제할 때는
    $ sudo apt-get --purge remove nvidia-*
    $ sudo apt-get --purge remove cuda-*
    

    에서 삭제합니다. 일단 관련되는 것이 남아 있지 않은지 이하에서 확인하고, 남아 있으면 개별적으로 삭제한다.
    $ dpkg -l | grep nvidia
    $ dpkg -l | grep cuda
    

    nvidia-384 넣기
    $ sudo apt-get install nvidia-384
    

    이것이라면 nvidia-smi가 통과한다.
    그러나 CUDA 패키지는 nvidia-387에 의존하고 nvidia-384를 넣으면 nvidia-387이 삭제되므로 CUDA는 삭제됩니다.

    해결 방법



    비슷한 상황이 되고 있는 사람이 없는지 조사했는데, 최근 며칠에 같은 상황에 조우하고 있는 사람이 그곳에 있었다.

    NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver" Ubuntu 16.0...

    분명히 Ubuntu16.04의 커널이 최근 4.10에서 4.13으로 바뀌고 환경을 새로 만들면 nvidia-드라이버가 잘 작동하지 않는 상황입니다.

    따라서 잠정적으로 PC 시작시 ESC 키를 눌러 부트 선택 메뉴로 들어가고 Advanced Option for Ubuntu를 선택합니다.



    디폴트에서는 4.13.26이 되어 있었지만, 이전의 4.10.28이 있었으므로 그것을 선택해 기동한다.
    이미지는 차용이므로 버전이 다르므로주의.


    그러면 해상도도 정상이 되고, nvidia-smi도 제대로 돌아오게 되었다
    $ nvidia-smi
    Sat Jan 13 14:05:15 2018       
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 387.26                 Driver Version: 387.26                    |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  GeForce GTX 1080    Off  | 00000000:01:00.0  On |                  N/A |
    | 55%   82C    P2   146W / 180W |    842MiB /  8111MiB |     98%      Default |
    +-------------------------------+----------------------+----------------------+
    |   1  GeForce GTX 1080    Off  | 00000000:03:00.0 Off |                  N/A |
    | 48%   67C    P2   166W / 198W |    783MiB /  8114MiB |     99%      Default |
    +-------------------------------+----------------------+----------------------+
    |   2  GeForce GTX 1080    Off  | 00000000:04:00.0 Off |                  N/A |
    | 48%   67C    P2   185W / 198W |    783MiB /  8114MiB |     98%      Default |
    +-------------------------------+----------------------+----------------------+
    
    

    시작시 기본 커널 변경



    과연 재부팅할 때마다 매번 커널을 변경하는 것은 번거롭기 때문에, 디폴트로 설정해 둔다.

    우선은 GRUB의 기동 옵션의 확인을 한다.
    $ grep menuentry /boot/grub/grub.cfg
    
    menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-e0077458-0564-44fa-8774-8de1e30bfe34' {
    submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-e0077458-0564-44fa-8774-8de1e30bfe34' {
        menuentry 'Ubuntu, with Linux 4.13.0-26-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-26-generic-advanced-e0077458-0564-44fa-8774-8de1e30bfe34' {
        menuentry 'Ubuntu, with Linux 4.13.0-26-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-26-generic-init-upstart-e0077458-0564-44fa-8774-8de1e30bfe34' {
        menuentry 'Ubuntu, with Linux 4.13.0-26-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-26-generic-recovery-e0077458-0564-44fa-8774-8de1e30bfe34' {
        menuentry 'Ubuntu, with Linux 4.10.0-28-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.10.0-28-generic-advanced-e0077458-0564-44fa-8774-8de1e30bfe34' {
        menuentry 'Ubuntu, with Linux 4.10.0-28-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.10.0-28-generic-init-upstart-e0077458-0564-44fa-8774-8de1e30bfe34' {
        menuentry 'Ubuntu, with Linux 4.10.0-28-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.10.0-28-generic-recovery-e0077458-0564-44fa-8774-8de1e30bfe34' {
    

    이것은 기동시에 ESC 키를 눌러 들어간 기동 메뉴와 대응하고 있다.

    디폴트로 어느 옵션으로 기동하는지는, /etc/default/grub 에 걸려 있다.
    GRUB_DEFAULT=0
    

    이것이라고 하면, 톱 메뉴의 0번째, Ubuntu를 선택하게 된다.

    이 부분을 다음과 같이 변경한다.
    GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.10.0-28-generic"
    

    확인하지 않았지만 아마도 아래에서도 OK
    GRUB_DEFAULT="1>3"
    

    2번째(Advanced options for Ubuntu)를 선택→3번째(Ubuntu, with Linux 4.10.0-28-generic)를 선택하는 것 같은 느낌.

    GRUB 설정을 반영하기 위해 다음을 수행합니다.
    $ sudo update-grub
    

    그런 다음 다시 시작하여 사용 커널을 확인하면 4.10.28이되었습니다.
    $ uname -r
    4.10.0-28-generic
    

    참고

    좋은 웹페이지 즐겨찾기