【Ubuntu14.04】【QEMU/KVM】KVMによる仮想化UbuntuへのGPUパススルーとGPGPU(CUDA)設定

仮想WindowsでのGPUパススルーとは別に、機械学習用のセッティングの仕方について書きます。
正確には前にやってたんだけど、引っ越しの際にローレベルフォーマットを該当仮想イメージが入っているHDDにかけちゃって環境が消えたんですけどね・・・。

【参考サイト】
tech.virtualtech.jp

一応、毎回書いてるけど、KVMを利用している構成は以下の通り。
マザボ:ASRock Z170 Extreme4
・メモリ:DDR4 32G
・CPU:Core i7-6700K
・グラボ:STRIX-GTX1060-DC2O6G

1.GPUパススルー設定

と言っても、↓ですでにやっているのでほぼ不要なのですが。
engetu21.hatenablog.com


ただし、上記記事の9.vender id偽装に関しては仮想マシンごとに設定が必要なので、それは対応する必要があります。
また、 11項に記載している「ディスプレイSpice」「ビデオQXL」等のグラフィック関係の設定削除は不要です。(仮想モニタを使えるようにしておきたいので)

で、仮想マシンへのUbuntu14.04へのインストールに関しては記載を端折ります。
ちなみになんでUbuntu14.04にしたかというと、自社でGPUマシンで使ってる機械学習の画像判別ライブラリ?がCSなんとか?(うろ覚え過ぎてヤバイ)というので、それを動かせるかも確認したいからですね。
※2018/12/11追記
CSLAIERでした。しかしこれCUDA7.5が推奨・・・。CUDA10じゃ動かないかもしれないなぁ
github.com
※追記終わり

GPUパススルーの設定が終わったら、グラボが仮想OS上で認識されているかを確認します。

$ lspci | grep -i nvidia
00:02.0 VGA compatible controller: NVIDIA Corporation Device 1c03 (rev a1)
00:09.0 Audio device: NVIDIA Corporation Device 10f1 (rev a1)

問題なければ、以下のコマンドでnvidiaのドライバを落とすためのapt設定を追加します。

$ sudo add-apt-repository ppa:graphics-drivers/ppa
Fresh drivers from upstream, currently shipping Nvidia.

## Current Status

Current long-lived branch release: `nvidia-410` (410.66)
Dropped support for Fermi series (https://nvidia.custhelp.com/app/answers/detail/a_id/4656)

Old long-lived branch release: `nvidia-390` (390.87)

For GF1xx GPUs use `nvidia-390` (390.87)
For G8x, G9x and GT2xx GPUs use `nvidia-340` (340.107)
For NV4x and G7x GPUs use `nvidia-304` (304.137) End-Of-Life!

Support timeframes for Unix legacy GPU releases:
https://nvidia.custhelp.com/app/answers/detail/a_id/3142

## What we're working on right now:

  • Normal driver updates
  • Help Wanted: Mesa Updates for Intel/AMD users, ping us if you want to help do this work, we're shorthanded.

## WARNINGS:

This PPA is currently in testing, you should be experienced with packaging before you dive in here:

Volunteers welcome!

### How you can help:

## Install PTS and benchmark your gear:

    sudo apt-get install phoronix-test-suite

Run the benchmark:

    phoronix-test-suite default-benchmark openarena xonotic tesseract gputest unigine-valley

and then say yes when it asks you to submit your results to openbechmarking.org. Then grab a cup of coffee, it takes a bit for the benchmarks to run. Depending on the version of Ubuntu you're using it might preferable for you to grabs PTS from upstream directly: http://www.phoronix-test-suite.com/?k=downloads

## Share your results with the community:

Post a link to your results (or any other feedback to): https://launchpad.net/~graphics-drivers-testers

Remember to rerun and resubmit the benchmarks after driver upgrades, this will allow us to gather a bunch of data on performance that we can share with everybody.

If you run into old documentation referring to other PPAs, you can help us by consolidating references to this PPA.

If someone wants to go ahead and start prototyping on `software-properties-gtk` on what the GUI should look like, please start hacking!

## Help us Help You!

We use the donation funds to get the developers hardware to test and upload these drivers, please consider donating to the "community" slider on the donation page if you're loving this PPA:

http://www.ubuntu.com/download/desktop/contribute
詳しい情報: https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa
[ENTER] を押すと続行します。ctrl-c で追加をキャンセルできます

gpg: 鍵リング「/tmp/tmpb3yd7fes/secring.gpg」ができました
gpg: 鍵リング「/tmp/tmpb3yd7fes/pubring.gpg」ができました
gpg: 鍵1118213Cをhkpからサーバkeyserver.ubuntu.comに要求
gpg: /tmp/tmpb3yd7fes/trustdb.gpg: 信用データベースができました
gpg: 鍵1118213C: 公開鍵"Launchpad PPA for Graphics Drivers Team"をインポートしました
gpg: 究極的に信用する鍵が見つかりません
gpg: 処理数の合計: 1
gpg: インポート: 1 (RSA: 1)
OK


設定が追加されたので、apt updateします。ついでにupgradeもしておく。

$ sudo apt update
$ sudo apt upgrade

ドライバを検索します。

$ apt-cache search '^nvidia-[0-9]+'
nvidia-173 - NVIDIA legacy binary driver - version 173.14.39
nvidia-173-dev - NVIDIA binary Xorg driver development files
nvidia-304-dev - NVIDIA binary Xorg driver development files
nvidia-310 - Transitional package for nvidia-310
nvidia-310-dev - Transitional package for nvidia-310-dev
nvidia-310-updates - Transitional package for nvidia-310-updates
nvidia-310-updates-dev - Transitional package for nvidia-310-updates-dev
nvidia-313-updates - Transitional package for nvidia-313-updates
nvidia-313-updates-dev - Transitional package for nvidia-313-updates-dev
nvidia-319 - Transitional package for nvidia-319
nvidia-319-dev - Transitional package for nvidia-319-dev
nvidia-319-updates - Transitional package for nvidia-319-updates
nvidia-319-updates-dev - Transitional package for nvidia-319-updates-dev
nvidia-304-updates - Transitional package for nvidia-304
nvidia-304-updates-dev - Transitional package for nvidia-304-dev
nvidia-331 - Transitional package for nvidia-331
nvidia-331-dev - Transitional package for nvidia-340-dev
nvidia-331-updates - Transitional package for nvidia-340
nvidia-331-updates-dev - Transitional package for nvidia-340-dev
nvidia-331-updates-uvm - Transitional package for nvidia-340
nvidia-331-uvm - Transitional package for nvidia-340
nvidia-340-dev - NVIDIA binary Xorg driver development files
nvidia-340-updates - Transitional package for nvidia-340
nvidia-340-updates-dev - Transitional package for nvidia-340-dev
nvidia-340-updates-uvm - Transitional package for nvidia-340-updates
nvidia-340-uvm - Transitional package for nvidia-340
nvidia-346 - Transitional package for nvidia-346
nvidia-346-dev - Transitional package for nvidia-352-dev
nvidia-346-updates - Transitional package for nvidia-346-updates
nvidia-346-updates-dev - Transitional package for nvidia-352-updates-dev
nvidia-346-updates-uvm - Transitional package for nvidia-346-updates
nvidia-346-uvm - Transitional package for nvidia-346
nvidia-352 - Transitional package for nvidia-367
nvidia-352-dev - Transitional package for nvidia-367-dev
nvidia-352-updates - Transitional package for nvidia-367
nvidia-352-updates-dev - Transitional package for nvidia-367-dev
nvidia-367 - Transitional package for nvidia-375
nvidia-367-dev - Transitional package for nvidia-375-dev
nvidia-375 - Transitional package for nvidia-384
nvidia-375-dev - Transitional package for nvidia-384-dev
nvidia-384 - NVIDIA binary driver - version 384.130
nvidia-384-dev - NVIDIA binary Xorg driver development files
nvidia-304 - NVIDIA legacy binary driver - version 304.137
nvidia-340 - NVIDIA binary driver - version 340.107
nvidia-387-dev - Transitional package for nvidia-390-dev
nvidia-387 - Transitional package for nvidia-390
nvidia-390-dev - NVIDIA binary Xorg driver development files
nvidia-390 - NVIDIA binary driver - version 390.87
nvidia-396-dev - NVIDIA binary Xorg driver development files
nvidia-396 - NVIDIA binary driver - version 396.54
nvidia-410-dev - NVIDIA binary Xorg driver development files
nvidia-410 - NVIDIA binary driver - version 410.78
nvidia-415-dev - NVIDIA binary Xorg driver development files
nvidia-415 - NVIDIA binary driver - version 415.18

よりどりみどりですが、グラボに応じたドライバをインストールしないとダメです。
具体的にはWindowsなどでグラボ使っている際に、nvidiaのHPに行って対応するドライバを自動検索で調べておいたほうが良いかと。

$ sudo apt install nvidia-390
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
bbswitch-dkms dkms fakeroot lib32gcc1 libc6-i386 libcuda1-390 libfakeroot
libjansson4 libvdpau1 libxnvctrl0 mesa-vdpau-drivers nvidia-opencl-icd-390
nvidia-prime nvidia-settings ocl-icd-libopencl1 screen-resolution-extra
vdpau-driver-all
提案パッケージ:
bumblebee dpkg-dev debhelper opencl-icd libvdpau-va-gl1 nvidia-vdpau-driver
nvidia-legacy-340xx-vdpau-driver
以下のパッケージが新たにインストールされます:
bbswitch-dkms dkms fakeroot lib32gcc1 libc6-i386 libcuda1-390 libfakeroot
libjansson4 libvdpau1 libxnvctrl0 mesa-vdpau-drivers nvidia-390
nvidia-opencl-icd-390 nvidia-prime nvidia-settings ocl-icd-libopencl1
screen-resolution-extra vdpau-driver-all
アップグレード: 0 個、新規インストール: 18 個、削除: 0 個、保留: 1 個。
84.9 MB のアーカイブを取得する必要があります。
この操作後に追加で 374 MB のディスク容量が消費されます。
続行しますか? [Y/n] y

(略)

nvidia_390:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.13.0-163-generic/updates/dkms/

nvidia_390_modeset.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.13.0-163-generic/updates/dkms/

nvidia_390_drm.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.13.0-163-generic/updates/dkms/

nvidia_390_uvm.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.13.0-163-generic/updates/dkms/

depmod....

DKMS: install completed.
libcuda1-390 (390.87-0ubuntu0~gpu14.04.1) を設定しています ...
nvidia-opencl-icd-390 (390.87-0ubuntu0~gpu14.04.1) を設定しています ...
bbswitch-dkms (0.7-2ubuntu1) を設定しています ...
Loading new bbswitch-0.7 DKMS files...
First Installation: checking all kernels...
Building only for 3.13.0-163-generic
Building initial module for 3.13.0-163-generic
Done.

bbswitch:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.13.0-163-generic/updates/dkms/

depmod....

DKMS: install completed.
nvidia-prime (0.6.2.1) を設定しています ...
nvidia-prime start/running, process 28118
screen-resolution-extra (0.17.1.1~14.04.1) を設定しています ...
nvidia-settings (415.18-0ubuntu0~gpu14.04.1) を設定しています ...
vdpau-driver-all:amd64 (1.1.1-3ubuntu1~gpu14.04.1) を設定しています ...
libc-bin (2.19-0ubuntu6.14) のトリガを処理しています ...
initramfs-tools (0.103ubuntu4.11) のトリガを処理しています ...
update-initramfs: Generating /boot/initrd.img-3.13.0-163-generic
shim-signed (1.33.1~14.04.3+13-0ubuntu2) のトリガを処理しています ...
Secure Boot not enabled on this system.
ureadahead (0.100.0-16) のトリガを処理しています ...

ここで一旦再起動をしますが、この時点でGUIで操作している場合、再起動後はグラボからの画像出力になっている可能性があります。
その状態だとCUDAをインストールしても動かないので、CUIモードで起動するように設定しておきます。

$ sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet nosplash"

GRUB_CMDLINE_LINUX_DEFAULT="text"

GRUBの設定を適用して再起動

$ sudo update-grub
$ sudo shutdown -r now


以下のコマンドで、GPUのステータスを出力します。
これで何らか情報が表示されていないとドライバは正常に動作していない(はず)。

$ nvidia-smi -q

==============NVSMI LOG==============

Timestamp : Sun Dec 9 23:26:57 2018
Driver Version : 390.87

Attached GPUs : 1
GPU 00000000:00:02.0
Product Name : GeForce GTX 1060 6GB
Product Brand : GeForce
Display Mode : Enabled
Display Active : Enabled
Persistence Mode : Disabled
Accounting Mode : Disabled
Accounting Mode Buffer Size : 4000
Driver Model
Current : N/A
Pending : N/A
Serial Number : N/A
GPU UUID : GPU-a201dacf-842b-9036-7645-f12273ec0de5
Minor Number : 0
VBIOS Version : 86.06.45.40.13
MultiGPU Board : No
Board ID : 0x2
GPU Part Number : N/A
Inforom Version
Image Version : G001.0000.01.04
OEM Object : 1.1
ECC Object : N/A
Power Management Object : N/A
GPU Operation Mode
Current : N/A
Pending : N/A
GPU Virtualization Mode
Virtualization mode : None
PCI
Bus : 0x00
Device : 0x02
Domain : 0x0000
Device Id : 0x1C0310DE
Bus Id : 00000000:00:02.0
Sub System Id : 0x85C51043
GPU Link Info
PCIe Generation
Max : 3
Current : 1
Link Width
Max : 16x
Current : 16x
Bridge Chip
Type : N/A
Firmware : N/A
Replays since reset : 0
Tx Throughput : 1000 KB/s
Rx Throughput : 9000 KB/s
Fan Speed : 0 %
Performance State : P8
Clocks Throttle Reasons
Idle : Active
Applications Clocks Setting : Not Active
SW Power Cap : Not Active
HW Slowdown : Not Active
HW Thermal Slowdown : Not Active
HW Power Brake Slowdown : Not Active
Sync Boost : Not Active
SW Thermal Slowdown : Not Active
Display Clock Setting : Not Active
FB Memory Usage
Total : 6078 MiB
Used : 160 MiB
Free : 5918 MiB
BAR1 Memory Usage
Total : 256 MiB
Used : 5 MiB
Free : 251 MiB
Compute Mode : Default
Utilization
Gpu : 6 %
Memory : 3 %
Encoder : 0 %
Decoder : 0 %
Encoder Stats
Active Sessions : 0
Average FPS : 0
Average Latency : 0
Ecc Mode
Current : N/A
Pending : N/A
ECC Errors
Volatile
Single Bit
Device Memory : N/A
Register File : N/A
L1 Cache : N/A
L2 Cache : N/A
Texture Memory : N/A
Texture Shared : N/A
CBU : N/A
Total : N/A
Double Bit
Device Memory : N/A
Register File : N/A
L1 Cache : N/A
L2 Cache : N/A
Texture Memory : N/A
Texture Shared : N/A
CBU : N/A
Total : N/A
Aggregate
Single Bit
Device Memory : N/A
Register File : N/A
L1 Cache : N/A
L2 Cache : N/A
Texture Memory : N/A
Texture Shared : N/A
CBU : N/A
Total : N/A
Double Bit
Device Memory : N/A
Register File : N/A
L1 Cache : N/A
L2 Cache : N/A
Texture Memory : N/A
Texture Shared : N/A
CBU : N/A
Total : N/A
Retired Pages
Single Bit ECC : N/A
Double Bit ECC : N/A
Pending : N/A
Temperature
GPU Current Temp : 24 C
GPU Shutdown Temp : 102 C
GPU Slowdown Temp : 99 C
GPU Max Operating Temp : N/A
Memory Current Temp : N/A
Memory Max Operating Temp : N/A
Power Readings
Power Management : Supported
Power Draw : 10.22 W
Power Limit : 120.00 W
Default Power Limit : 120.00 W
Enforced Power Limit : 120.00 W
Min Power Limit : 60.00 W
Max Power Limit : 140.00 W
Clocks
Graphics : 139 MHz
SM : 139 MHz
Memory : 405 MHz
Video : 544 MHz
Applications Clocks
Graphics : N/A
Memory : N/A
Default Applications Clocks
Graphics : N/A
Memory : N/A
Max Clocks
Graphics : 1974 MHz
SM : 1974 MHz
Memory : 4004 MHz
Video : 1708 MHz
Max Customer Boost Clocks
Graphics : N/A
Clock Policy
Auto Boost : N/A
Auto Boost Default : N/A
Processes
Process ID : 1121
Type : G
Name : /usr/bin/X
Used GPU Memory : 115 MiB
Process ID : 1854
Type : G
Name : compiz
Used GPU Memory : 42 MiB

2.CUDAのインストール

CUDA - Wikipedia
「CUDA(Compute Unified Device Architecture:クーダ)とは、NVIDIAが開発・提供している、GPU向けの汎用並列コンピューティングプラットフォーム(並列コンピューティングアーキテクチャ)およびプログラミングモデルである。」
とのこと。

以下のサイトにアクセスして、該当するOSを選択してダウンロードを行います。
CUDA Toolkit 10.0 Download | NVIDIA Developer
f:id:engetu21:20181209233307p:plain

ダウンロードが完了したら、ファイルをUbuntu14.04に設置し(いろいろやり方はあるけど、ファイル共有で渡すか、Ubuntu14.04を一旦GUIモードにしてからCUIモードに戻してもいい。URLがわかるならwgetで落とすのが一番楽かも)、ダウンロードボタンの横に記載されたコマンドを入力してインストールを実施。

$ sudo dpkg -i cuda-repo-ubuntu1404-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
以前に未選択のパッケージ cuda-repo-ubuntu1404-10-0-local-10.0.130-410.48 を選択しています。
(データベースを読み込んでいます ... 現在 197124 個のファイルとディレクトリがインストールされています。)
cuda-repo-ubuntu1404-10-0-local-10.0.130-410.48_1.0-1_amd64.deb を展開する準備をしています ...
cuda-repo-ubuntu1404-10-0-local-10.0.130-410.48 (1.0-1) を展開しています...
cuda-repo-ubuntu1404-10-0-local-10.0.130-410.48 (1.0-1) を設定しています ...

The public CUDA GPG key does not appear to be installed.
To install the key, run this command:
sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub


$ sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
OK

$ sudo apt update
$ sudo apt install cuda
〜長いインストール〜

3.サンプルプログラム実行

サンプルプログラムのコンパイルをします。

$ export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
$ cuda-install-samples-10.0.sh ~

Copying samples to /home/engetu/NVIDIA_CUDA-10.0_Samples now...
Finished copying samples.

$ ls ~/
NVIDIA_CUDA-10.0_Samples ←これが増えてる

$ cd NVIDIA_CUDA-10.0_Samples
$ make

(略)
Finished building CUDA samples

サンプルを動かします。

$ ~/NVIDIA_CUDA-10.0_Samples/bin/x86_64/linux/release/bandwidthTest
[CUDA Bandwidth Test] - Starting...
Running on...

Device 0: GeForce GTX 1060 6GB
Quick Mode

Host to Device Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 11907.0

Device to Host Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 10979.2

Device to Device Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 147017.3

Result = PASS

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

無事動きました。早いのかどうかはよくわからないけど。
あとは機械学習学習をしなければいけないわけですが、数学・・・数学かぁ・・・(尻込み)