Upload
hajime-taira
View
6.272
Download
0
Embed Size (px)
Citation preview
Linux KVM環境におけるGPGPU活用最新動向
- OSC2015 Fukuoka -
TAIRA Hajime <[email protected]>TAIRA Hajime <[email protected]>
5
Linux KVM におけるGPU パススルーの構成図
ゲストOS ゲストOSゲストOS
Intel VT-d
QEMU/KVM QEMU/KVM QEMU/KVM
DMA Remapping
NVIDIAドライバー NVIDIAドライバー NVIDIAドライバー
6
GPU パススルーの効果
GPU パススルーでどのような恩恵が得られるか● ゲーミング環境の隔離● GPGPU を必要とするサーバーの集約● GPGPU ファームのクラウド化
⇒ 仮想マシンに対して必要な時に GPU を割り当てることができる
● GPU の利用効率を最大化できる ⇒ GPGPU アプリの開発環境、 HPC クラスターへデー
タを投げる前の Pre/Post 処理の実行環境
8
PCIe パススルー
PCIe パススルーの中でも一般的によく行われるのは、ネットワークインターフェースカード (NIC)
ゲストOS ゲストOSゲストOS
Intel VT-d
QEMU/KVM QEMU/KVM QEMU/KVM
DMA Remapping
VF VF VF
VF VF VF
VF NICドライバー VF NICドライバー VF NICドライバー
9
Intel VT-d とは
Intel VT-d とはデバイス I/O の仮想化支援を行う Intel CPU と対応するチップセットが提供する機能
ゲストOS
Intel VT-d
QEMU/KVM
DMA Remapping
VF
VF
VF NICドライバー
VT-dを使うことによりPCIeデバイスを仮想マシンへパススルーした時のDMAで利用するメモリー領域のリマッピングをCPUとチップセット側でオフロードすることができるようになる
VT-dは主に仮想ネットワークインターフェースカードのパススルー処理(SR-IOV)に使われる
基本的にPCIeデバイスであれば、USBカードでもキャプチャーカードでもパススルー可能
メモリー領域※AMD CPUにもAMD Viという同様の仕組みがある
10
Intel VT-d の使い方
まずは Intel VT-d 搭載の CPU を用意
※Intel Xeon だと Nehalem 世代以降
自分の CPU で使えるかどうか分からない場合、
Intel ARK で探すと良いhttp://ark.intel.com/search/advanced?VTD=true
BIOS/UEFI で Intel VT-d を有効化
だいたい Advanced や CPU Configuration などと
表記されている設定項目あたりにある
11
展示ブースのデモ環境
マザーボード : ASRock H77M-ITX (BIOS ver 1.90)
CPU: Intel Core i7 3770 (Intel VT-d 搭載 )
GPU: NVIDIA Quadro K2200
Host OS: Red Hat Enterprise Linux 7.1
Guest OS: Windows 8.1, Ubuntu 14.10 LTS
12
Linux カーネルにおける有効化
BIOS/UEFI で Intel VT-d を有効化した後に、 Linux の
起動オプションで有効化する必要がある
/etc/default/grub
GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_root/lv_swap rd.lvm.lv=vg_root/lv_root rhgb quiet intel_iommu=on"
13
Linux カーネルにおける有効化
Intel VT-dの確認方法# dmesg|grep -e DMAR -e IOMMU[ 0.000000] ACPI: DMAR 00000000bd9a5c48 000B8 (v01 INTEL SNB 00000001 INTL 00000001)
[ 0.000000] Intel-IOMMU: enabled
[ 0.020582] dmar: IOMMU 0: reg_base_addr fed90000 ver 1:0 cap c0000020e60262 ecap f0101a
[ 0.020586] dmar: IOMMU 1: reg_base_addr fed91000 ver 1:0 cap c9008020660262 ecap f0105a
[ 0.020657] IOAPIC id 2 under DRHD base 0xfed91000 IOMMU 1
[ 0.340560] DMAR: No ATSR found
[ 0.340578] IOMMU 0 0xfed90000: using Queued invalidation
[ 0.340579] IOMMU 1 0xfed91000: using Queued invalidation
[ 0.340580] IOMMU: Setting RMRR:
[ 0.340588] IOMMU: Setting identity map for device 0000:00:02.0 [0xbf800000 - 0xcf9fffff]
[ 0.341693] IOMMU: Setting identity map for device 0000:00:1d.0 [0xbd56f000 - 0xbd599fff]
[ 0.341710] IOMMU: Setting identity map for device 0000:00:1a.0 [0xbd56f000 - 0xbd599fff]
[ 0.341722] IOMMU: Setting identity map for device 0000:00:14.0 [0xbd56f000 - 0xbd599fff]
[ 0.341731] IOMMU: Prepare 0-16MiB unity mapping for LPC
[ 0.341737] IOMMU: Setting identity map for device 0000:00:1f.0 [0x0 - 0xffffff]
14
ホスト OS から GPU を初期化させない方法
● この設定手順を行っておくと、手動での virsh nodedev-detach が不要になる
最初からホスト OS から初期化させない方が楽
→ カーネルオプションで GPU を pci-stub ドライバーに割り当て
pci-stub.ids=xxxx:xxxx (※vendorid:productid)
● dracut で組み込まないようにカーネルオプションのブラックリストに追加
rdblacklist=nouveau
● modprobe でカーネルモジュールを読み込まないようにブラックリストに記述
echo "blacklist nouveau" >>
/etc/modprobe.d/blacklist-nouveau.conf
15
対象 PCIe カードの探し方
● lspci コマンドから grep で抽出する# lspci | grep -i nvidia
01:00.0 VGA compatible controller: NVIDIA Corporation GM107GL [Quadro K2200] (rev a2)
01:00.1 Audio device: NVIDIA Corporation Device (rev a1)
※ 同じような Bus ID を持つもう 1 つのカードは
だいたいの場合、 HDMI Audio の音源
16
GPU パススルー可能な GPU
● NVIDIA Tesla シリーズ● NVIDIA GRID シリーズ
※GPU 仮想化技術 NVIDIA GRID vGPU は利用不可● NVIDIA Quadro シリーズ
※K2000 以降の 4 桁番台、 3 桁番台は不可● AMD Radeon HD69xx シリーズが動くらしい● Intel HD Graphics シリーズも制約が多いけど動くら
しい
17
GPU パススルーの利用構成
● 1 枚目のプライマリービデオカードを仮想デバイスの QXL GPU にして、 2 枚目のセカンダリービデオカードをパススルーされた GPU として利用する
※ 主に GPGPU を仮想環境で利用する場合
※ ゲスト OS が Windows 7 や Windows Server 2008 の場合、 GPU パススルーすると 1 枚目の QXL ビデオカードが動かなくなる場合がある。つまり 2 枚目のパススルーされた GPU側のモニターにログイン画面が出る
● 1 枚目のプライマリービデオカードをパススルーされた GPU とする
※ 主にデスクトップマシンでゲーム環境で利用する場合 ( 割愛 )
18
GPU パススルーの構成図
ゲストOS
Intel VT-d
QEMU/KVM
DMA Remapping
NVIDIAドライバーQXLドライバー
QXL
1枚目のプライマリービデオカードを仮想デバイスのQXL GPUにして、2枚目のセカンダリービデオカードをパススルーされたGPUとして利用する※主にGPGPUを仮想環境で利用する場合
20
OpenStack における GPU 活用
Nova Instance#2g1.large
Nova Instance#1m1.large
QEMU/KVM QEMU/KVM
NVIDIAドライバー
NovaCompute Node
● コンピューティングリソースを管理するNovaがHavanaリリースからPCIパススルーに対応済み
● GPUが必要なインスタンスのみ割り当てが行われる(フレーバーのタイプにより判別)
libvirt
21
OpenStack Nova における実装
PciPassthroughFilter
Nova Instanceg1.large
QEMU/KVM
NVIDIAドライバー
NovaCompute Node
NovaController Node
PCI Manager
※列名は一部省略
id address instance_uuid
1 0000:01:00.0 abcdabcd-1234-xxxx
2 0000:02:00.0 NULL
(1) PCI Managerに対してプールしたいGPUの情報を事前に登録
(2) Novaスケジューラーが PciPassthroughFilter により、PCI Manager に GPU の
の割り当てリクエストを行ない、空きのGPUが割り当てられる
(3) Nova Compute Node上で GPU をパススルーで割り当てる仮想マシン定義ファイルが作られ、libvirt 経由で仮想マシンが起動する
libvirt
22
PCI Manager の役割
● PCI Manager は MariaDB の pci_devicesテーブル内に PCI デバイスの
割り当て管理情報を格納する● PCI デバイスを搭載するサーバーの情報 (ノード ID 、 Bus ID 、 Vendor
ID 、 Product ID) 、割り当て先のインスタンスの UUID などが記録される
PCI Manager
id vendor_id product_id address compute_node_id instance_uuid
1 10de 1023 0000:01:00.0 1 abcdabcd-1234-xxxx
2 10de 1023 0000:02:00.0 1 NULL
pci_devices テーブル
※列名は一部省略
23
Nova Flavor の定義
Nova に GPU インスタンス用のフレーバーを追加して、そこにフレーバー属性で GPU の種類と枚数を指定する
例 : g1.xlarge には NVIDIA Tesla を 2 枚割り当てる、 g2.medium にはNVIDIA Quadro を 1 枚割り当てる
(keystone_admin)# nova flavor-create g1.xlarge
⇒ --is-public true auto 65536 16 8
(keystone_admin)# nova flavor-key g1.xlarge
⇒ set "pci_passthrough:alias"="TeslaK40:2"
(keystone_admin)# nova flavor-create g1.medium
⇒ --is-public true auto 16384 16 4
(keystone_admin)# nova flavor-key g1.medium
⇒ set "pci_passthrough:alias"="QuadroK2200:1"
24
/etc/nova/nova.conf の設定
Nova Controller Node 側
Nova で利用したい GPU のエイリアスを定義する
必要な情報は名前と PCI の Vendor ID 、 Product ID を列挙
例 : NVIDIA Tesla K40(10de:1023) の場合pci_alias={"name":"TeslaK40",
⇒ "vendor_id":"10de", "product_id":"1023"}
例 : NVIDIA Quadro K2200(10de:13ba) の場合pci_alias={"name":"QuadroK2200",
⇒ "vendor_id":"10de", "product_id":"13ba"}
25
/etc/nova/nova.conf の設定
Nova Controller Node 側
スケジューラーに PciPassthroughFilter フィルターを追加する
scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler
scheduler_available_filters=nova.scheduler.filters.all_filters,nova.scheduler.filters.pci_passthrough_filter.PciPassthroughFilter
scheduler_default_filters=RamFilter,ComputeFilter,AvailabilityZoneFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,PciPassthroughFilter
26
/etc/nova/nova.conf の設定
Nova Compute Node 側
Nova で利用したい GPU のホワイトリストを定義する
必要な情報は名前と PCI の Vendor ID 、 Product ID を列挙
例 : NVIDIA Tesla K40(10de:1023) の場合pci_passthrough_whitelist={"name":"TeslaK40",
⇒ "vendor_id":"10de", "product_id":"1023"}
例 : NVIDIA Quadro K2200(10de:13ba) の場合pci_passthrough_whitelist={"name":"QuadroK2200",
⇒ "vendor_id":"10de", "product_id":"13ba"}
28
OpenStack 環境で GPU を使う上での制約事項
OpenStack 環境での GPU 利用の注意点● GPU付きのインスタンスは定義してから抹消されるまで GPU は返却されません。
※ つまりマシン上に 1 枚しか GPU が搭載されていない場合、 GPU が使えるのは 1 インスタンスまで
⇒ マシン 1 台に GPU を複数枚搭載することを推奨
● NVIDIA GRID を用意しても KVM では NVIDIA GRID vGPU は利用できません。
※ また、 NVIDIA GRID vGPU の現在の実装では、そもそもvGPU で CUDA 、 OpenCL は利用できません。
30
参考情報
OpenStack Wiki: Pci passthrough
https://wiki.openstack.org/wiki/Pci_passthrough
Red Hat Enterprise Linux 7 - Virtualization Deployment and Administration Guide
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/sect-device-GPU.html