30
Linux KVM環境における GPGPU活用最新動向 - OSC2015 Fukuoka - TAIRA Hajime <[email protected]> TAIRA Hajime <[email protected]>

Linux KVM環境におけるGPGPU活用最新動向

Embed Size (px)

Citation preview

Linux KVM環境におけるGPGPU活用最新動向

- OSC2015 Fukuoka -

TAIRA Hajime <[email protected]>TAIRA Hajime <[email protected]>

2

自己紹介

平 初

仮想化友の会 発起人

生息地 : 東京 / 愛知 / 北海道 / 熊本

好きなゆるキャラ : くまモン

好きなふりかけ : 御飯の友

3

御飯の友

4

本日のお題

「GPUパススルー」

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 処理の実行環境

7

KVM でパススルー可能なデバイス

USB SCSI PCIe

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を仮想環境で利用する場合

19

GPGPU on OpenStack

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"}

27

OpenStack 環境でインスタンス上に認識された NVIDIA Quadro 2000

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 は利用できません。

Q&A

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