ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

ubuntu+nVIDIA復旧成功

[techonology]Ubuntu 16.04 LTSにnVIDIAドライバーを入れなおす

前回の記事でnVIDIAのドライバーが入ったUbuntu 16.04 LTSに突然ログイン出来なくなった件、nVIDIAのドライバーを削除してとりあえずログイン出来る様にした後、再度nVIDIAのドライバーを入れなおしました。
rc30-popo.hatenablog.com


最初は初めてnVIDIAドライバーを導入した時と同様にaptでppa:graphics-drivers/ppaにあるドライバーを入れなおそうしたのですが、何度やってもログインループに陥る。
カーネルのバージョンを最新にしたり、戻したり。nVIDIAのドライバーも最初に入れたnvidia-390や最近リポジトリに追加されたnvidia-415とか試すも、すべてダメ。
その度にCUIコンソールからnVIDIAドライバーをアンインストール。

結局、以下の記事に従い、nVIDIAの公式サイトからDLしたrunファイルを使いました。

qiita.com

help.sakura.ad.jp


nVIDIAのドライバーは一昨日くらいの時点で最新のNVIDIA-Linux-x86_64-418.56.runを使いました。
CUDAも入れなおしでcuda_9.2.148_396.37_linux.runと、パッチであるcuda_9.2.148.1_linux.runをダウンロード。
CUDAを9.2にしたのは前回と同じバージョンにしたかったからです。

  1. cudaのアンインストール

    リポジトリから入れたcudaをアンインストール。

    $ sudo apt remove cuda-*

  2. /etc/apt/preferences.d/linux-kernel.prefの中身をコメントアウトし、kernelをapt upgradeで最新版にバージョンアップ

    下記の通り、4.4.0.143.151になりました。

    $ aptitude show linux-generic
    パッケージ: linux-generic                
    状態: インストール済み
    自動的にインストールされた: いいえ
    バージョン: 4.4.0.143.151
    優先度: 任意
    セクション: kernel
    メンテナ: Ubuntu Kernel Team <kernel-team@lists.ubuntu.com>
    アーキテクチャ: amd64
    展開サイズ: 14.3 k
    依存: linux-image-generic (= 4.4.0.143.151), linux-headers-generic (=
        4.4.0.143.151)
    競合: linux-generic:i386
    説明: Complete Generic Linux kernel and headers
     This package will always depend on the latest complete generic Linux kernel and
     headers.
    
    

  3. /etc/apt/preferences.d/linux-kernel.prefを再編集してkernelバージョンを固定。

    編集後はこんな感じです。dkmsを使ってnVIDIAドライバーをインストールするとkernel更新時も自動的にドライバーを再組込するらしいのですが、怖いのでkernelは固定しちゃいます。
    kernel更新したい時は、一度nVIDIAドライバーとCUDAをアンインストールして、kernel更新後に再インストールするつもり。

    $ cat /etc/apt/preferences.d/linux-kernel.pref
    
    Package: linux-generic
    Pin: version 4.4.0.143.151
    Pin-Priority: 1001
    
    Package: linux-headers-generic
    Pin: version 4.4.0.143.151
    Pin-Priority: 1001
    
    Package: linux-image-generic
    Pin: version 4.4.0.143.151
    Pin-Priority: 1001
    

  4. X Windowが動いている場合は停止

    CTRL+ALT+F1で仮想コンソールに入り、下記を実行。

    $ sudo service lightdm stop
    $ sudo pkill Xorg

  5. CUDAをインストール

    以下の2コマンドを順番に実行。

    $ sudo sh cuda_9.2.148_396.37_linux.run  --silent --toolkit --no-opengl-libs
    $ sudo sh cuda_9.2.148.1_linux.run --silent --accept-eula

  6. nVIDIAドライバーをインストール

    $ sudo sh NVIDIA-Linux-x86_64-418.56.run  --silent --no-opengl-files --no-libglx-indirect --dkms

これでインストール完了です。CUDAインストール時の--no-opengl-libsや、ドライバーインストール時の--no-opengl-filesがポイントらしいです。
(良く理解できていない)


これで

$ sudo service lightdm start

X Windows起動してもログインループに入りません。
nvidia-smiコマンドを実行すると下記の様な感じになります。CUDA Versionが10.1となっているのが謎ですが、以前に作ったchainer+cupyでディープラーニングやるスクリプトがちゃんと動作しました。

$ nvidia-smi
Wed Mar 27 23:27:03 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.56       Driver Version: 418.56       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| 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 1050    Off  | 00000000:01:00.0 Off |                  N/A |
| N/A   44C    P0    N/A /  N/A |      0MiB /  2000MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

python + chainer + cupyでMNIST回している最中にnvidia-smiコマンドを叩くと下記の様にGPU内でpythonという名前のプロセスが走っているのが判ります。

$ nvidia-smi
Wed Mar 27 23:30:12 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.56       Driver Version: 418.56       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| 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 1050    Off  | 00000000:01:00.0 Off |                  N/A |
| N/A   50C    P0    N/A /  N/A |    437MiB /  2000MiB |     46%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      4914      C   python                                       427MiB |
+-----------------------------------------------------------------------------+