狠狠撸

狠狠撸Share a Scribd company logo
2019/07/13gpu仮想化最前線 #oscnagoya 1/67
GPU 仮想化最前線
- KVMGT と virtio-gpu -
安藤 達也
日本 openSUSE ユーザ会
2019/07/13gpu仮想化最前線 #oscnagoya 2/67
お前どこ中誰よ?
●
安藤 達也
– @zgock999@mstdn.maud.io
●
openSUSE との出会い
– 2003年ぐらいに自分のPemtium-MノートのWifiを認識してくれ
る唯一のディストリということで落ち着く
– Xenに強かったディストリということもあり、
2012年ぐらいから家の擬似VDIサーバで活躍してもらっている
●
openSUSE12.3~Leap15.1まで随時更新中
●
このへん詳しくは狠狠撸Shareの
「Xenとzfsで作る家庭内VDIサーバ」シリーズ参照
– 50000ビューぐらい行ってて驚いた
2019/07/13gpu仮想化最前線 #oscnagoya 3/67
みなさん
って何かご存知ですか?
2019/07/13gpu仮想化最前線 #oscnagoya 4/67
正しいのはどれ?
●
1. サーバールームでモフモフできるカメレオン型ガジェット
●
2. 緑色のロゴが目印の謎のAI半導体メーカー
●
3. ドイツ生まれの Linux ディストリビューション
2019/07/13gpu仮想化最前線 #oscnagoya 5/67
正解
●
3. ドイツ生まれの Linux ディストリビューション
– S.u.S.E Linux 4.2 で独自のディストリビューションになってから
●
Q: RedHat 系ですか? Debian 系ですか?
A: どちらでもありません!
– RPM じゃないとダメとか deb じゃないとダメとか、
そういう話もよく聞きます(なぜ?
●
Q: OpenSUSE ですか?openSUSE ですか?
A: o は小文字です。IPhone ではなく、iPhone なのと同じです
2019/07/13gpu仮想化最前線 #oscnagoya 6/67
今日の内容
●
仮想化技術最後の壁、GPU仮想化
●
virtio-gpuとKVMGT
●
openSUSEでvGPUなKVM環境を作ろう
●
その1:virtio-gpuでAndroid-x86
●
その2:KVMGTでWindows10
●
展示ブースデモ機の解説
●
質疑応答とか
2019/07/13gpu仮想化最前線 #oscnagoya 7/67
仮想化技術最後の壁、GPU
●
最近はGPUの活躍の場が増えてきた
– ゲーミング
– 仮想通貨採掘(openCL/CUDA)
– 画像処理etc.(openCL/CUDA)
– ディープラーニングとかでも使ってるらしい(専門外だけど)
●
謎のAI半導体メーカ、
一体何VIDIAなんだ???
2019/07/13gpu仮想化最前線 #oscnagoya 8/67
仮想化技術最後の壁、GPU
●
qemu/VMWare/VirtualBox等でさまざまなデバイスの仮想化
が進んだ
– ネットワークやブロックデバイス等は採用技術次第ではネイティ
ブと遜色ないレベルに
●
GPUは複雑なデバイスであるため単純なソフトウェアによる仮
想化ではパフォーマンスや機能に限界があった
– 最もパフォーマンスが出るとされているVMWare WorkStation
の仮想VGAでも実GPUには遠く及ばない
2019/07/13gpu仮想化最前線 #oscnagoya 9/67
GPU仮想化のための方法論(1)
●
演算対応の完全仮想GPUの実装
– VMWare VGAとかqemuのvirtio-gpuとか
– これまでのアプローチの発展系で3Dアクセ
ラレーションやGPU演算対応版仮想デバイス
– ゲストからは既存のGPUとは非互換な抽象化
された新設計GPUに見える
2019/07/13gpu仮想化最前線 #oscnagoya 10/67
GPU仮想化のための方法論(1)
●
演算対応の完全仮想GPUの実装
– 長所
●
一個のGPUを複数のゲストで共有できる
●
従来の思想を踏襲しているので運用レベルでの
変化は少ない
2019/07/13gpu仮想化最前線 #oscnagoya 11/67
GPU仮想化のための方法論(1)
●
演算対応の完全仮想GPUの実装
– 短所
●
環境側で専用ドライバを用意せねばならず、実
装に手間取りがち
– virtio-gpuのwindows driverはまだ未完成
●
一昨年のGoogle Summer Code対象だった
●
とりあえずできたがopenGLのみ対応、DirectX未対応
●
パフォーマンス的にも苦しい
– virtio-gpuのLinuxドライバで実gpuの30%ぐらい
2019/07/13gpu仮想化最前線 #oscnagoya 12/67
GPU仮想化のための方法論(1)
●
virtio-gpuの恩恵を一番受けられるゲストは?
–Android-x86
●
(個人の主観です)
●
実際のVM設定については後述
2019/07/13gpu仮想化最前線 #oscnagoya 13/67
GPU仮想化のための方法論(2)
●
実物理GPUの準仮想化エミュレーションGPU
– IntelのXenGTとかKVMGTとか(intel GVT-g)
– GPUネイティブをバックエンドで呼び出す準仮想化
– ゲストからは実GPUのように見える
– XenGTの方は数年前から実用レベルだったが
KVMGTの方は最近のカーネル(4.18以降ぐらい)
から実用レベルになってきた
2019/07/13gpu仮想化最前線 #oscnagoya 14/67
GPU仮想化のための方法論(2)
●
実物理GPUの準仮想化エミュレーションGPU
– 長所
●
一個のGPUを複数のゲストで共有できる
●
ドライバは実GPUのドライバで良い
●
完全仮想化型よりは高パフォーマンス
– KVMGTで実GPUの70%ぐらい
2019/07/13gpu仮想化最前線 #oscnagoya 15/67
GPU仮想化のための方法論(2)
●
実物理GPUの準仮想化エミュレーションGPU
– 短所
●
新しい実装であるためまだ未成熟
– Kernel 4.10で実装されたばかりである
●
Intel以外の専業GPU屋さんは実装に消極的
●
比較的新しいiGPU(Broadwell世代以降)必須
●
CoffeeLake以降はKernel5.1から対応
●
有限なリソース、ホストのVRAMが大量に必要
– VRAMを共有できるわけではないのでゲストの数だけ
VRAMを分割することになる
– Skylakeの場合、最大でvGPU2枚が限界
2019/07/13gpu仮想化最前線 #oscnagoya 16/67
GPU仮想化のための方法論(3)
●
実GPUのゲストへの直接割り当て
– いわゆるGPUパススルー
– NICやHBA等のPCI/PCIe機器を割り当てる
PCIパススルー技術の応用
– ゲストからは実GPUそのものに見える(当たり前)
2019/07/13gpu仮想化最前線 #oscnagoya 17/67
GPU仮想化のための方法論(3)
●
実GPUのゲストへの直接割り当て
長所
●
技術的には結構枯れた技術
– Xenの世界では相当前から実用レベル
– KVMは対応が遅れ気味だったが、ここ2~3年ぐらいで
急速に対応が進んだ
●
ずっと超えられない壁だったIntel iGPUもKernel4.8とqemu2.7か
ら対応
●
パフォーマンスは最も期待できる
– 数%前後のロスぐらい
2019/07/13gpu仮想化最前線 #oscnagoya 18/67
GPU仮想化のための方法論(3)
●
実GPUのゲストへの直接割り当て
短所
●
ホスト側に仮想IOのハード支援機構(IOMMU)が必要
– Intelだとcore-i5以上/xeonなら最近のは大概付いてる
●
K付きデスクトップだと付いてないのがあるので注意
– マザーボードも時々対応してないのがある
●
ASRockなら大概大丈夫
– AMD系は最近のなら大概大丈夫
– ノートPCだと対応してる方が稀なので注意が必要
●
ゲスト一台につき一個のGPUが
(原則として)必要
– SR-IOV、NVIDIA vGPUとかのゲスト間共有のためのハードウェア支援機構もあるにはある
●
とても個人レベルで買える代物ではない
●
KVMにおいては、まだ未成熟なところがある
– 使いこなそうとすると、まだまだPatched Kernelが必要なシチュエーションが
2019/07/13gpu仮想化最前線 #oscnagoya 19/67
●
個人レベルでの現実解としては
GPUパススルーが最も現実的
– WS一台に複数GPUを積んで、それぞれをゲストに
– せいぜい集約できて3~4台だが、そもそもGPUが
必要なレベルのパフォーマンス要求するゲストであ
れば、コア数の問題もあってそのくらいが現実的
2019/07/13gpu仮想化最前線 #oscnagoya 20/67
●
そうは行かない場合もある
– 例えばノートPC
●
dGPUを物理的に取り付けられない
●
dGPU付ノートPCもあるが、一般的なデスクトッ
プとは異なる接続方式である場合も多い
2019/07/13gpu仮想化最前線 #oscnagoya 21/67
そういうわけで
ノートPCでvGPUします
openSUSEで!
2019/07/13gpu仮想化最前線 #oscnagoya 22/67
実は仮想化は結構得意なopenSUSE
●
仮想化ホストとしては老舗なSUSE/openSUSE
– Xen主流の時代から仮想化には力を入れている
– 基本的な設定程度はYastで一発
– 仮想化関係のカーネル調整も上手
●
ローリングリリースなTumbleweedがある
– 最低でもKernel4.18以上とqemu3.0以上が必要だが、
ローリングリリースなTumbleweedならばっちり対応済
●
Snapperでシビアな作業も安心して進められる
– カーネル設定やカーネルパッチなど、失敗したらブート
不可になるような作業でも一発で元に戻せる
2019/07/13gpu仮想化最前線 #oscnagoya 23/67
openSUSE Tumbleweed
●
ローリング?リリース
– 週に3回程度新しいバージョンがリリース
●
常に最新バージョンのカーネルやアプリケーション、
ライブラリを使いたい人向け
– アプリケーション開発時に、新しいコンパイラやライブラリでも
動くかをいち早く確認できる
2019/07/13gpu仮想化最前線 #oscnagoya 24/67
Snapperでいつでも巻き戻し
●
Snapperって何?
– btrfsのスナップショット機能を応用したシステム復元ツール
– Windowsの「システム復元」と似たようなものと言えなくもな
いが、btrfsのスナップショットを使用するので保存も復元も一
瞬
– Yast、zypper等の主要コマンドを実行した時点で自動的にス
ナップショットが作られる
●
カーネル弄るようなシビアな作業で真価を発揮
– ふぇぇ???設定をしくじってブート不可になったよぉ???
●
ブートローダーから「過去のスナップショットで起動」を選んで失
敗する前の状態でブートする
●
「Snapper rollback」とコマンドを叩けばすっかり元通り
2019/07/13gpu仮想化最前線 #oscnagoya 25/67
- その1 -
virtio-gpuな
KVM環境の構築
2019/07/13gpu仮想化最前線 #oscnagoya 26/67
まずはインストールから
●
Tumbleweedはネットワークインストール推奨
– ftp.riken.jpが日本で現状唯一のTumbleweedミラー
●
http://ftp.riken.jp/Linux/opensuse/tumbleweed/repo/oss
●
UEFIインストールは避けた方が良い
– UEFIインストーラはbiosインストーラより細かいところが不親切
– snapper活用するならrootfsは全面btrfsが良い
– homeの分割はお好みで
●
お好みのデスクトップでインストール
– xfce4派ですが、好きなのでいいんじゃないかな?
2019/07/13gpu仮想化最前線 #oscnagoya 27/67
基本設定はYastで一発
●
qemu入れて~libvirt入れて~、daemon有効にして~、ブ
リッジ設定して~
– 他のディストリだったらありがちな光景
「Yast>仮想化>ハイパーバイザのインストール」
「KVMサーバ」を選択して実行するだけで
GPU仮想化使わない普通のKVM環境なら
ネットワーク設定込みで一発で終わります
2019/07/13gpu仮想化最前線 #oscnagoya 28/67
virt-managerでインストール
●
virt-managerから普通にisoインストール
– 最后に「设定をカスタマイズ」がポイントその1
2019/07/13gpu仮想化最前線 #oscnagoya 29/67
virt-managerでインストールその2
●
ディスプレイをspiceにしてopenGLを有効に
2019/07/13gpu仮想化最前線 #oscnagoya 30/67
virt-managerでインストールその3
●
ビデオをvirtioにして3Dアクセラレーションを有効に
2019/07/13gpu仮想化最前線 #oscnagoya 31/67
virt-managerでインストールその4
●
こんなエラーが出たときは?
– virt-managerのバグでたまにspiceのopenGL設定が外れる
場合があるので再度設定すればOK
2019/07/13gpu仮想化最前線 #oscnagoya 32/67
●
後は普通にインストール
2019/07/13gpu仮想化最前線 #oscnagoya 33/67
●
「ドールズフロントオンライン」(ドルフロ)程度なら普通に
動きます
2019/07/13gpu仮想化最前線 #oscnagoya 34/67
●
「カスタムキャスト」なんかも動くには動く
– ただし蝉辫颈肠别侧の问题でスワイプを受け付けない
2019/07/13gpu仮想化最前線 #oscnagoya 35/67
●
全てのゲームタイトルが動くわけではありません
– x86で動かないタイトルがたまーにある
●
そういうのはAndroid-x86実機でも動かないので仕方な
いね
2019/07/13gpu仮想化最前線 #oscnagoya 36/67
- その2 -
KVMGTな
KVM環境の構築
2019/07/13gpu仮想化最前線 #oscnagoya 37/67
ちょっと難易度が上がります
- その2 -
KVMGTな
KVM環境の構築
2019/07/13gpu仮想化最前線 #oscnagoya 38/67
カーネルモジュールの準備
●
gvt-gを使うために必要なモジュール類を入れます
# echo "INITRD_MODULES="kvmgt vfio-
iommu-type1 vfio-mdev"" >
/etc/sysconfig/kernel
# mkinitrd
2019/07/13gpu仮想化最前線 #oscnagoya 39/67
カーネルパラメータの設定
●
カーネルパラメータを設定します
i915.enable_gvt=1 kvm_ignore_msrs=1
intel_iommu=1
●
Yast>ブートローダで設定
2019/07/13gpu仮想化最前線 #oscnagoya 40/67
PCIアドレスの確認
●
再起動してiGPUのpciアドレスを確認
$sudo lspci
00:00.0 Host bridge: Intel Corporation Xeon E3-1200
v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM
Registers (rev 08)
00:02.0 VGA compatible controller: Intel Corporation
Skylake GT2 [HD Graphics 520] (rev 07)
00:04.0 Signal processing controller: Intel Corporation
Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor
Thermal Subsystem (rev 08)
?以下略?
●
大概の場合は00:02.0なはず
2019/07/13gpu仮想化最前線 #oscnagoya 41/67
共有GPUの確認
●
ls
/sys/device/[GPUのPCIアドレス]/mdev_supported
_types/で共有GPUの一覧が取れたら成功している
$ ls
/sys/devices/pci0000:00/0000:00:02.0/md
ev_supported_types/
i915-GVTg_V5_4 i915-GVTg_V5_8
2019/07/13gpu仮想化最前線 #oscnagoya 42/67
共有GPUのタイプ
●
cat
/sys/device/[GPUのPCIアドレス]/mdev_supported_types/[出てきた共有GPU]/descriptionで
共有GPUの詳細が見られる
$ cat /sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i915-
GVTg_V5_4/description
low_gm_size: 128MB   ←この共有GPUの最小VRAMサイズ
high_gm_size: 512MB   ←この共有GPUの最大VRAMサイズ
fence: 4         ←この環境で使える共有GPU枠
resolution: 1920x1200  ←この共有GPUの最大解像度
weight: 4         ←この共有GPUが消費する共有GPU枠
$ cat /sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i915-
GVTg_V5_8/description
low_gm_size: 64MB
high_gm_size: 384MB
fence: 4
resolution: 1024x768
weight: 2
2019/07/13gpu仮想化最前線 #oscnagoya 43/67
共有GPUの確保と解放
●
共有GPUの確保
echo '[任意のUUID]' > /sys/devices/[GPUのPCI
アドレス]/mdev_supported_types/[共有GPUタ
イプ]/create
●
共有GPUの解放
echo '1' >
/sys/devices/[GPUのPCIアドレス]/[確保の時
使ったUUID]/remove
2019/07/13gpu仮想化最前線 #oscnagoya 44/67
共有GPUの確保と解放(例)
$ echo 'ab8c3af8-8366-449d-8489-fe9254e44621' >
/sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i9
15-GVTg_V5_4/create
$ ls -l /sys/devices/pci0000:00/0000:00:02.0/
合計 0
drwxr-xr-x 4 root root 0 1月 23 04:14 ab8c3af8-8366-449d-
8489-fe9254e44621 ←このディレクトリが生える
-r--r--r-- 1 root root 4096 1月 23 04:14 ari_enabled
-r--r--r-- 1 root root 4096 1月 23 04:14 boot_vga
?以下略?
$ echo '1' > /sys/devices/pci0000:00/0000:00:02.0/ab8c3af8-
8366-449d-8489-fe9254e44621/remove
2019/07/13gpu仮想化最前線 #oscnagoya 45/67
systemdサービス化
こんな感じでsystemdサービスを作る
●
$ cat /usr/lib/systemd/system/gvtgpu.service
[Unit]
Description=Create Intel GVT-g vGPU
[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo 'ab8c3af8-8366-449d-8489-fe9254e44621' >
/sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/create"
ExecStop=/bin/sh -c "echo '1' > /sys/devices/pci0000:00/0000:00:02.0/ab8c3af8-8366-
449d-8489-fe9254e44621/remove"
RemainAfterExit=yes
[Install]
WantedBy=graphical.target
2019/07/13gpu仮想化最前線 #oscnagoya 46/67
systemdサービス化2
systemdサービス化してしまえば
●
$ sudo systemctl start gvtgpu で確保
●
$ sudo systemctl stop gvtgpu で解放
●
$ sudo systemctl enable gvtgpuで起動時確保
2019/07/13gpu仮想化最前線 #oscnagoya 47/67
systemdサービス化2
systemdサービス化してしまえば
●
$ sudo systemctl start gvtgpu で確保
●
$ sudo systemctl stop gvtgpu で解放
●
$ sudo systemctl enable gvtgpuで起動時確保
2019/07/13gpu仮想化最前線 #oscnagoya 48/67
systemdサービス化2
systemdサービス化してしまえば
●
$ sudo systemctl start gvtgpu で確保
●
$ sudo systemctl stop gvtgpu で解放
●
$ sudo systemctl enable gvtgpuで起動時確保
2019/07/13gpu仮想化最前線 #oscnagoya 49/67
virt-managerでインストール
●
一旦普通にvirt-managerでインストール
2019/07/13gpu仮想化最前線 #oscnagoya 50/67
virt-managerでインストール
●
KVMGTはovmfで動かないので必ずseabiosインストールする
2019/07/13gpu仮想化最前線 #oscnagoya 51/67
virt-managerでインストール
●
virtio-gpuの時と同様openGL有効なspiceディスプレイにす
る
2019/07/13gpu仮想化最前線 #oscnagoya 52/67
virt-managerでインストール
●
普通にインストールした後でシャットダウン
2019/07/13gpu仮想化最前線 #oscnagoya 53/67
libvirt XMLの編集
●
$ sudo -s
●
# virsh list --all
●
Id Name State
●
------------------------
●
- win10 shut off
●
●
# virsh edit win10
2019/07/13gpu仮想化最前線 #oscnagoya 54/67
libvirt XMLの編集
●
</video>タグの下あたりに以下のタグを挿入する
<hostdev mode='subsystem' type='mdev' managed='yes'
model='vfio-pci' display='off'>
<source>
<address uuid='ab8c3af8-8366-449d-8489-
fe9254e44621'/>
</source>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09'
function='0x0'/>
</hostdev>
●
uuidは確保時に決めたものを
●
adressは他デバイスと競合しないところを
2019/07/13gpu仮想化最前線 #oscnagoya 55/67
ドライバの割り当て
●
VMを起動するとセカンダリディスプレイとしてIntel iGPUが
認識されているのでドライバを当てる
2019/07/13gpu仮想化最前線 #oscnagoya 56/67
qemu XMLのドメイン変更
●
libvirtのxml中にqemuコマンドを直書きできるようスキーマ
を変更する
– <domain type='kvm'> から
– <domain type='kvm'
xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'
>
2019/07/13gpu仮想化最前線 #oscnagoya 57/67
qemu標準ビデオの無効化
●
videoタイプを標準のQXLからcirrusに変更する
<video>
<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1'
primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<video>
<model type='cirrus' vram='16384' heads='1' primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
●
インストール時点でcirrusにしてもよいが、解像度的な意味で初期インストールが辛
いため
2019/07/13gpu仮想化最前線 #oscnagoya 58/67
qemu標準ビデオの無効化
●
xml末尾にqemuコマンドを追記し、標準ビデオのcirrusにわ
ざと間違ったドライバを強制的にあてる
<qemu:commandline>
<qemu:arg value='-set'/>
<qemu:arg value='device.video0.driver=ne2k_pci'/>
</qemu:commandline>
●
libvirtの仕様でディスプレイあり/標準ビデオnoneにできない
ため、わざとエラーを起こして標準ビデオを無効化するバッド
ノウハウ
●
QXLからcirrusにしたのはISA準拠だからできる裏技なので
2019/07/13gpu仮想化最前線 #oscnagoya 59/67
qemu標準ビデオの無効化
●
最新のlibvirtではこれで良くなった
<video>
<model type='none'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x0'/>
</video>
– 当然ドライバ指定も不要
●
ただし相当新しいlibvirtからっぽいので、ディストリによって
は前述の裏技がまだ必要
2019/07/13gpu仮想化最前線 #oscnagoya 60/67
Intel iGPUの有効化
●
xml末尾にqemuコマンドを追記
<qemu:commandline>
<qemu:arg value='-set'/>
<qemu:arg value='device.video0.driver=ne2k_pci'/>
<qemu:arg value='-set'/>
<qemu:arg value='device.hostdev0.x-igd-opregion=on'/>
</qemu:commandline>
●
hostdevタグにdisplay=onを追加
<hostdev mode='subsystem' type='mdev' managed='yes'
model='vfio-pci' display='on'>
2019/07/13gpu仮想化最前線 #oscnagoya 61/67
ゲストを起動
●
共有GPUはbiosROMを持たないため最初は画面が出ない
●
しばらくしてWindowsドライバがgpuをつかめば表示される
2019/07/13gpu仮想化最前線 #oscnagoya 62/67
ゲストを起動
●
もともとがintel iGPUの上、能力70%なので性能はお察し
●
とはいえVMWare WorkstationのGPU等は余裕で超える性能
2019/07/13gpu仮想化最前線 #oscnagoya 63/67
ゲストを起動
●
軽めの3Dゲームなら余裕で動きます
●
アトリエとかアトリエとかアトリエとか
2019/07/13gpu仮想化最前線 #oscnagoya 64/67
展示ブースの
デモ機紹介
2019/07/13gpu仮想化最前線 #oscnagoya 65/67
展示ブースのデモ機構成
●
DELL Latitude E5470
– CPU: Intel Core i5 6200U
– GPU: Intel UHD Graphics 520
– Mem: 8GB
– OS: openSUSE Tumbleweed x86_64
– Kernel 5.1
– Qemu: 4.0
●
解説したAndroid x86とWindows10ゲストを実際に動かして
います
2019/07/13gpu仮想化最前線 #oscnagoya 66/67
質疑応答とか
2019/07/13gpu仮想化最前線 #oscnagoya 67/67
ありがとう
ございました!

More Related Content

GPU仮想化最前線 - KVMGTとvirtio-gpu -