Nvidia GeForce MX150 on Ubuntu 18.10 (Laptop)

Nvidia（MX150）を搭載したLaptopでUbuntuを利用しています。こうにゅうしてから放置していたのですが年末になってようやく動かせたのでメモを残しておきます。

* Nvidiaのドライバは、製品版とオープンソース版があります。
* **(追記)**　Kernel 4.18.0-13-generic 


# 環境の確認

今回導入するLaptopでのVideoカードの状態は下のようになっています。

```
 lspci | grep -E "VGA|3D"
00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 620 (rev 07)
01:00.0 3D controller: NVIDIA Corporation GP108M [GeForce MX150] (rev ff)
```

## メモ）不要なドライバを消す

```
sudo apt-get --purge remove "nvidia-*"
sudo apt-get --purge remove "cuda-*"
```



# ドライバの導入

利用可能なドライバは、Ubuntuの「追加のドライバ」でも見ることができますし、 `ubuntu-drivers devices` コマンドでも確認することができる。色々試したのだが依存関係がすくないのかNvidiaの公式サイトからドライバをダウンロードして手動でインストールするのが一番確実であった。

![Screenshot from 2018-12-28 22-47-05.png](https://qiita-image-store.s3.amazonaws.com/0/11540/4be77340-af60-291c-dfca-efb64d593b3a.png)

1. こちらの https://www.nvidia.co.jp/object/unix-jp.html から最新版のドライバをダウンロードします。
2. 今回は、NVIDIA-Linux-x86_64-415.23.run をダンロードしました。
3. 導入するためにXを終了します。 `sudo init 3` をターミナルから実行します。
4. コンソールにログインして先ほどダウンロードしたファイルを実行します。 `sudo bash ./NVIDIA-Linux-x86_64-415.23.run` でCUIで導入が始まります。

# ドライバの導入（追加）

nvidiaのドライバが公開されていたので以下のPPAを登録します。

```
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
```

`ubuntu-drivers` に追加されていることを確認します。

```
❯❯❯ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:1c.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001D12sv00001D72sd00001703bc03sc02i00
vendor   : NVIDIA Corporation
manual_install: True
driver   : nvidia-driver-390 - distro free
driver   : nvidia-driver-410 - third-party free
driver   : nvidia-driver-430 - third-party free recommended
driver   : nvidia-driver-415 - third-party free
driver   : nvidia-driver-396 - third-party free
driver   : nvidia-driver-418 - third-party free
driver   : xserver-xorg-video-nouveau - distro free builtin
```

最新のバージョンを導入します

```
sudo apt install nvidia-driver-430
```


 


# 関連ソフトウェアの導入と設定

## 不足ドライバの導入

* **(追記)この作業は不要**

ここはちょっと何かわかっていないのですがメモ
https://qiita.com/rainytoffee/items/44deabd66608f00b8544

```
cd /tmp/
wget http://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git/tree/i915/skl_guc_ver6_1.bin
wget http://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git/tree/i915/kbl_dmc_ver1_01.bin
sudo cp /tmp/kbl_dmc_ver1_01.bin /lib/firmware/i915/kbl_dmc_ver1.bin
sudo cp /tmp/skl_guc_ver6_1.bin /lib/firmware/i915/skl_guc_ver6.bin
sudo update-initramfs -k $(uname -r) -u
```


## VirtualGL

https://github.com/aancel/admin/wiki/VirtualGL-on-Ubuntu

> Bumblebee は VirtualGL によって裏の X サーバーで Optimus NVIDIA カードを使ってフレームをレンダリングし、表の X サーバーに転送を行います。フレームは転送される前に圧縮が施され、それによって帯域を節約して bumblebee の高速化・最適化とすることができます。

1. こちらのサイト http://sourceforge.net/projects/virtualgl/files/ から debファイルをダウンロードします。
2. 今回は、`virtualgl_2.6_amd64.deb` をダウンロードし、　`sudo dpkg -i virtualgl_2.6_amd64.deb`で導入を行います。


## Bumblebee 

ArchLinuxのドキュメントが詳しいのでNvidia関連を入れる人は一度見ておくと良いと思います。
https://wiki.archlinux.jp/index.php/Bumblebee

> "Bumblebee は GNU/Linux システムで NVIDIA Optimus が搭載されたノートパソコンを動作させようという試みです。この機能では2枚のグラフィックカードを必要とし、異なる電源消費のプロファイルがレイヤーによって接続され1つのフレームバッファを共有することになります。"

```
sudo apt install bumblebee-nvidia bumblebee
sudo gpasswd -a `username` bumblebee
sudo service bumblebee start
```

## Xorgの設定

### 常時NVIDAを利用する場合

Xorgにたいしてドライバを動作するように設定を行います。ここでのBusIDは `lspci` の結果をもとに記載をします。

```/etc/X11/xorg.conf
Section "Device"
    Identifier  "Intel"
    Driver      "intel"
    BusID       "PCI:0:2:0"
EndSection

Section "Device"
    Identifier  "nvidia"
    Driver      "nvidia"
    BusID       "PCI:1:0:0"
    Option      "AllowEmptyInitialConfiguration"
EndSection
```

### 通常はIntelドライバを利用する場合

Xorgにたいしてドライバを動作するように設定を行います。ここでのBusIDは `lspci` の結果をもとに記載をします。

```/etc/X11/xorg.conf
Section "Device"
    Identifier  "Intel"
    Driver      "intel"
    BusID       "PCI:0:2:0"
EndSection
```


# 実行結果

利用しているUbuntuのタスクバーにアプレットを入れてみました。動作中の場合には温度が表示されるようになっています。

* GPUが停止中
![Screenshot from 2018-12-28 23-17-02.png](https://qiita-image-store.s3.amazonaws.com/0/11540/a45f60d8-a491-f84c-a2e6-d21231d70d3d.png)

* GPUが動作中
![Screenshot from 2018-12-28 23-15-31.png](https://qiita-image-store.s3.amazonaws.com/0/11540/d02d1efa-3d36-1a8e-5d2a-b4509d8e3eae.png)

* nvidia-setting
![Screenshot from 2018-12-28 23-15-38.png](https://qiita-image-store.s3.amazonaws.com/0/11540/9a1f8ab3-4a9f-d797-5cc7-b6c788a58138.png)

* ~~予想に反して nvidiaの利用は自動的に止まります（動作してない場合には nvidia-smi コマンドが動作しません）. `Bumblebee` サービスを停止すると GPUが常に動き始めます。正しく切り替えが動作していると言えるのかもしれません。この状態でバッテリー駆動で利用してみましたが消費電力に影響は出ていませんでした（特別なことをしてない場合）~~
* **(追記)**　　正しく構成されていれば、`optirun`  を利用したプログラムを実行中のときにのみGPUが可動するように構成される。したがって通常には上記のタスクバーのアイコンは `intel` になっており、利用しているときだけ `nvidia` のアイコンに変わることがわかる。
* NvidiaのGPUが動作しているばあい 12-14W 程度消費、利用しない場合 9-10Wを消費（powertopで測定）

### GPU利用確認

利用状況の確認　`nvidia-smi` を実行

```
Fri Dec 28 21:42:31 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 415.23       Driver Version: 415.23       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| 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 MX150       Off  | 00000000:01:00.0 Off |                  N/A |
| N/A   42C    P8    N/A /  N/A |      6MiB /  2002MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0     26712      G   /usr/lib/xorg/Xorg                             5MiB |
+-----------------------------------------------------------------------------+
```

動作していない場合には、以下のようなエラーが表示される

```
❯❯❯ 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.
```

###  デモプログラムの実行

![Screenshot from 2018-12-28 23-25-18.png](https://qiita-image-store.s3.amazonaws.com/0/11540/c8eb9e8d-c0fe-029b-827c-3708e3e401a8.png)

#### glxgears -info
>Running synchronized to the vertical refresh.  The framerate should be
approximately the same as the monitor refresh rate.
GL_RENDERER   = Mesa DRI Intel(R) UHD Graphics 620 (Kabylake GT2) 
GL_VERSION    = 3.0 Mesa 18.2.2
GL_VENDOR     = Intel Open Source Technology C

304 frames in 5.0 seconds = 60.706 FPS
300 frames in 5.0 seconds = 59.942 FPS
299 frames in 5.0 seconds = 59.734 FPS

#### optirun glxgears -info
> GL_RENDERER   = GeForce MX150/PCIe/SSE2
GL_VERSION    = 4.6.0 NVIDIA 415.23
GL_VENDOR     = NVIDIA Corporation

5861 frames in 5.0 seconds = 1172.005 FPS
6075 frames in 5.0 seconds = 1214.785 FPS
6177 frames in 5.0 seconds = 1235.199 FPS


#### 強制的なON/OFF

```
❯❯❯ sudo tee /proc/acpi/bbswitch <<< ON
ON
hideaki at papas in /e/X11  
❯❯❯ sudo tee /proc/acpi/bbswitch <<< OFF
OFF
```


# まとめ

普通に利用する分にはあまりGPUの恩恵を受けることはなさそうです。機会学習でGPUを利用したいのでドライバを入れてみました。次はGPUを機械学習で利用する方法を書いてみたいと思います（色々バージョンがあっていないと動かないようなので面倒そうです）