Red Hat Virtualization での仮想マシン用 NVIDIA GPU のセットアップ
Red Hat Virtualization で専用の GPU または vGPU を使用するように仮想マシンを設定する方法。
概要
はじめに
Red Hat Virtualization では、互換性のあるグラフィックスプロセッシングユニット (GPU) を備えたホストを使用して、グラフィックスを多用するタスクや、CAD などの GPU なしでは実行できないソフトウェアの実行に適した仮想マシンを実行できます。
次のいずれかの方法で、GPU を仮想マシンに割り当てることができます。
- GPU パススルー: ホスト GPU を単一の仮想マシンに割り当てることができるため、ホストではなく仮想マシンが GPU を使用します。
仮想 GPU (vGPU): 物理 GPU デバイスを 1 つ以上の仮想デバイス (仲介デバイスと呼ばれる) に分割できます。次に、これらの仲介デバイスを仮想 GPU として 1 台以上の仮想マシンに割り当てることができます。これらの仮想マシンは、単一の物理 GPU のパフォーマンスを共有します。一部の GPU では、1 つのゲストに割り当てることができる仲介デバイスは 1 つだけです。vGPU のサポートは、選択した NVIDIA GPU でのみ対応しています。
以下に例を示します。
ホストには 4 個の GPU があります。GPU ごとに最大 16 個の vGPU、合計 64 個の vGPU をサポートできます。考えられる vGPU の割り当ては次のとおりです。
- 64 個の vGPU を備えた 1 台の仮想マシン
- それぞれ 1 個の vGPU を備えた 64 台の仮想マシン
- それぞれ 1 個の vGPU を備えた 32 台の仮想マシン、それぞれ 2 個の vGPU を備えた 8 台の仮想マシン、それぞれ 4 個の vGPU を備えた 4 台の仮想マシン
第1章 GPU デバイスパススルー: 単一の仮想マシンへのホスト GPU の割り当て
Red Hat Virtualization では、一部の NVIDIA PCIe ベースの GPU デバイスを非 VGA グラフィックスデバイスとして、デバイスパススルーとも呼ばれる PCI VFIO がサポートされています。
標準のエミュレートされたグラフィックスインターフェイスの 1 つに加え、ホスト GPU を経由して仮想マシンに渡すことにより、1 つ以上のホスト GPU を単一の仮想マシンにアタッチできます。仮想マシンは、エミュレートされたグラフィックスデバイスを起動とインストールに使用し、GPU はグラフィックスドライバーがロードされるときに制御を引き継ぎます。
単一の仮想マシンに渡すことができるホスト GPU の正確な数については、NVIDIA の Web サイトを参照してください。
GPU を仮想マシンに割り当てるには、次の手順に従います。
その手順は以下のとおりです。
前提条件
- GPU デバイスは GPU パススルーモードをサポートしている。
- システムは、検証済みのサーバーハードウェアプラットフォームとしてリストされている。
- ホストチップセットは Intel VT-d または AMD-Vi をサポートしている。
サポートされているハードウェアとソフトウェアの詳細については、NVIDIA GPU ソフトウェアリリースノートの Validated Platforms を参照してください。
1.1. ホスト IOMMU サポートの有効化と nouveau のブラックリストへの登録
仮想マシンで GPU を使用するには、ホストマシンで I/O メモリー管理ユニット (IOMMU) がサポートされている必要があります。
手順
- 管理ポータルで コンピュート → ホスト をクリックします。ホストを選択し、Edit をクリックします。Edit Hosts ペインが表示されます。
- Kernel タブをクリックします。
-
Hostdev Passthrough & SR-IOV チェックボックスをオンにします。このチェックボックスは、カーネルコマンドラインに
intel_iommu=on
またはamd_iommu=on
を追加することにより、Intel VT-d または AMD Vi を搭載したホストの IOMMU サポートを有効にします。 - Blacklist Nouveau チェックボックスをオンにします。
- OK をクリックします。
- ホストを選択し、管理 → メンテナーンス をクリックします。
- Installation → Reinstall をクリックします。
- 再インストールが完了したら、ホストマシンを再起動します。
- ホストマシンが再起動したら、Management → Activate をクリックします。
1.2. ホストから GPU をデタッチ
GPU がホストカーネルドライバーにバインドされている場合、GPU を仮想マシンに追加することはできません。そのため、仮想マシンに追加する前に、GPU デバイスとホストのバインドを解除する必要があります。多くの場合、ホストドライバーは GPU の動的なバインド解除をサポートしていないため、ホストドライバーへのバインドからデバイスを手動で除外することをお勧めします。
手順
ホストで、
lspci
コマンドを実行して、デバイスのスロット名と ID を識別します。次の例では、NVIDIA Quadro や GRID カードなどのグラフィックスコントローラーが使用されています。# lspci -Dnn | grep -i NVIDIA 0000:03:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK104GL [Quadro K4200] [10de:11b4] (rev a1) 0000:03:00.1 Audio device [0403]: NVIDIA Corporation GK104 HDMI Audio Controller [10de:0e0a] (rev a1)
出力は、NVIDIA GK104 デバイスがインストールされていることを示しています。グラフィックスコントローラーとオーディオコントローラーがあり、プロパティーは以下のとおりです。
-
グラフィックスコントローラーのデバイススロット名は
0000:03:00.0
、グラフィックスコントローラーの vendor-id:device-id は10de:11b4
です。 -
オーディオコントローラーのデバイススロット名は
0000:03:00.1
、オーディオコントローラーの vendor-id:device-id は10de:0e0a
です。
-
グラフィックスコントローラーのデバイススロット名は
ホストマシンドライバーが GPU デバイスを使用できないようにします。pci-stub ドライバーで vendor-id:device-id を使用できます。これには、vendor-id:device-id を値として、
/etc/sysconfig/grub
設定ファイルにあるGRUB_CMDLINX_LINUX
環境変数にpci-stub.ids
オプションを追加します。以下はその例です。GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/vg0-lv_swap rd.lvm.lv=vg0/lv_root rd.lvm.lv=vg0/lv_swap rhgb quiet intel_iommu=on pci-stub.ids=10de:11b4,10de:0e0a"
pci-stub のベンダー ID とデバイス ID を追加する場合は、コンマで区切ります。
以下のとおり、grub2-mkconfig を使用してブートローダー設定を再生成し、この項目を追加します。
# grub2-mkconfig -o /etc/grub2.cfg
注記UEFI ベースのホストを使用する場合、ターゲットファイルは
/etc/grub2-efi.cfg
である必要があります。- ホストマシンを再起動します。
IOMMU が有効で、ホストデバイスが pci-stub.ids のリストに追加され、Nouveau がブラックリストに登録されていることを確認します。
# cat /proc/cmdline BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-147.el8.x86_64 root=/dev/mapper/vg0-lv_root ro crashkernel=auto resume=/dev/mapper/vg0-lv_swap rd.lvm.lv=vg0/lv_root rd.lvm.lv=vg0/lv_swap rhgb quiet intel_iommu=on 1 pci-stub.ids=10de:11b4,10de:0e0a 2 rdblacklist=nouveau 3
1.3. 仮想マシンへの GPU のアタッチ
GPU とホストカーネルドライバーのバインドを解除した後、GPU を仮想マシンに追加して、正しいドライバーを有効にできます。
手順
- Virtual Machine Management Guide の Adding a Host Device to a Virtual Machine の手順に従います。
- 仮想マシンを実行してログインします。
- NVIDIA GPU ドライバーを仮想マシンにインストールします。詳細は、「仮想マシンへの GPU ドライバーのインストール」 を参照してください。
lspci -nnk
コマンドを使用して、GPU に正しいカーネルドライバーが使用されていることを確認します。以下に例を示します。# lspci -nnk 00:07.0 VGA compatible controller [0300]: NVIDIA Corporation GK104GL [Quadro K4200] [10de:11b4] (rev a1) Subsystem: Hewlett-Packard Company Device [103c:1096] Kernel driver in use: nvidia Kernel modules: nouveau, nvidia_drm, nvidia
1.4. 仮想マシンへの GPU ドライバーのインストール
手順
- 仮想マシンを実行し、SPICE または VNC などのシリアルコンソールを使用して仮想マシンに接続します。
- ドライバーを仮想マシンにダウンロードします。ドライバーの入手方法については、NVIDIA Web サイトのドライバーページ を参照してください。
GPU ドライバーをインストールします。
重要Linux のみ: Linux ゲストオペレーティングシステムにドライバーをインストールする場合、xorg.conf を更新するように求められます。インストール中に xorg.conf を更新しない場合は、手動で更新する必要があります。詳細は、「xorg の更新と有効化 (Linux 仮想マシン)」 を参照してください。
ドライバーのインストールが完了したら、マシンを再起動します。Windows 仮想マシンの場合、ゲストオペレーティングシステム内からではなく、管理ポータルまたは VM ポータルからゲストの電源を完全にオフにします。
重要Windows のみ: Windows ゲストオペレーティングシステム内から仮想マシンの電源をオフにすると、仮想マシンがハイパーネートモードになることがあります。その場合、メモリーは完全にクリアされず、その後の問題が発生する可能性があります。管理ポータルまたは VM ポータルを使用して仮想マシンの電源をオフにすると、仮想マシンは強制的にメモリーを完全にクリーンアップします。
- モニターをホスト GPU 出力インターフェイスに接続し、仮想マシンを実行します。
- 各 vGPU に NVIDIA vGPU ゲストソフトウェアライセンスを設定し、NVIDIA コントロールパネルにライセンス認証情報を追加します。詳細については、NVIDIA 仮想 GPU ソフトウェアドキュメントの How NVIDIA vGPU Software Licensing Is Enforced を参照してください。
1.5. xorg の更新と有効化 (Linux 仮想マシン)
仮想マシンで GPU を使用する前に、仮想マシンで xorg を更新して有効にする必要があります。NVIDIA ドライバーのインストールは、これを自動的に実行します。/etc/X11/xorg.conf
を表示して、xorg が更新および有効化されているか確認します。
# cat /etc/X11/xorg.conf
最初の 2 行は、NVIDIA によって生成されたかどうかを示しています。以下に例を示します。
# cat /etc/X11/xorg.conf # nvidia-xconfig: X configuration file generated by nvidia-xconfig # nvidia-xconfig: version 390.87 (buildmeister@swio-display-x64-rhel04-14) Tue Aug 21 17:33:38 PDT 2018
手順
仮想マシンで、次のコマンドを使用して
xorg.conf
ファイルを生成します。# X -configure
次のコマンドを使用して、
xorg.conf
ファイルを/etc/X11/xorg.conf
にコピーします。# cp /root/xorg.conf.new /etc/X11/xorg.conf
- 仮想マシンを再起動します。
/etc/X11/xorg.conf
を表示して、xorg が更新および有効化されているか検証します。# cat /etc/X11/xorg.conf
Device
セクションを検索します。次のセクションのようなエントリーが表示されます。Section "Device" Identifier "Device0" Driver "nvidia" VendorName "NVIDIA Corporation" EndSection
これで、GPU が仮想マシンに割り当てられました。
1.6. 仮想マシンからのホスト GPU の削除
- 仮想マシンからホスト GPU を削除する方法については、Virtual Machine Management Guide の Removing Host Devices from a Virtual Machine を参照してください。
第2章 仮想 GPU の割り当て
NVIDIA vGPU デバイスをセットアップするには、以下を行う必要があります。
- GPU デバイスに適した NVIDIA vGPU ドライバーを入手してインストールする
- 仲介デバイスを作成する
- 各仲介デバイスを仮想マシンに割り当てる
- 各仮想マシンにゲストドライバーをインストールする
以下の手順で、このプロセスについて説明します。
2.1. ホストでの NVIDIA vGPU デバイスのセットアップ
ゲストオペレーティングシステムに NVIDIA vGPU ドライバーをインストールする前に、ライセンス要件を理解し、正しいライセンス認証情報を取得する必要があります。
前提条件
- GPU デバイスは仮想 GPU (vGPU) 機能をサポートしている。
- システムは、検証済みのサーバーハードウェアプラットフォームとしてリストされている。
サポートされている GPU と検証済みのプラットフォームの詳細については、www.nvidia.com の NVIDIA vGPU CERTIFIED SERVERS を参照してください。
手順
- ホスト用の NVIDIA ドライバーをダウンロードしてインストールします。ドライバーの入手方法については、NVIDIA Web サイトのドライバーページ を参照してください。
-
NVIDIA ソフトウェアインストーラーが
/etc/modprobe.d/nvidia-installer-disable-nouveau.conf
ファイルを作成しなかった場合は、手動で作成します。 テキストエディターで
/etc/modprobe.d/nvidia-installer-disable-nouveau.conf
ファイルを開き、ファイルの最後に次の行を追加します。blacklist nouveau options nouveau modeset=0
現在のカーネル用に初期 ramdisk を再生成してから再起動します。
# dracut --force # reboot
仲介されたデバイスで、以前対応していたカーネルバージョンを使用する必要がある場合は、インストールしたすべてのカーネルバージョンに対して初期 ramdisk を再生成することもできます。
# dracut --regenerate-all --force # reboot
カーネルが
nvidia_vgpu_vfio
モジュールをロードしたことを確認します。# lsmod | grep nvidia_vgpu_vfio
nvidia-vgpu-mgr.service
サービスが実行されていることを確認します。# systemctl status nvidia-vgpu-mgr.service
以下に例を示します。
# lsmod | grep nvidia_vgpu_vfio nvidia_vgpu_vfio 45011 0 nvidia 14333621 10 nvidia_vgpu_vfio mdev 20414 2 vfio_mdev,nvidia_vgpu_vfio vfio 32695 3 vfio_mdev,nvidia_vgpu_vfio,vfio_iommu_type1 # systemctl status nvidia-vgpu-mgr.service nvidia-vgpu-mgr.service - NVIDIA vGPU Manager Daemon Loaded: loaded (/usr/lib/systemd/system/nvidia-vgpu-mgr.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2018-03-16 10:17:36 CET; 5h 8min ago Main PID: 1553 (nvidia-vgpu-mgr) [...]
ターミナルかスクリプトに次の行を入力して、使用可能な mdev タイプのリストを取得します。
for device in /sys/class/mdev_bus/; do for mdev_type in $device/mdev_supported_types/; do MDEV_TYPE=$(basename $mdev_type) DESCRIPTION=$(cat $mdev_type/description) NAME=$(cat $mdev_type/name) echo "mdev_type: $MDEV_TYPE --- description: $DESCRIPTION --- name: $NAME"; done; done | sort | uniq
注記特定の GPU デバイスの
type-id
値については、仮想 GPU ソフトウェアのドキュメント の 仮想 GPU タイプを参照してください。Linux 仮想マシンでは、GRID P4-2Q などの Q シリーズ NVIDIA vGPU のみが、仲介デバイス GPU タイプとしてサポートされていることに注意してください。出力は以下の例のようになります。
mdev_type: nvidia-11 --- description: num_heads=2, frl_config=45, framebuffer=512M, max_resolution=2560x1600, max_instance=16 --- name: GRID M60-0B mdev_type: nvidia-12 --- description: num_heads=2, frl_config=60, framebuffer=512M, max_resolution=2560x1600, max_instance=16 --- name: GRID M60-0Q ... mdev_type: nvidia-22 --- description: num_heads=4, frl_config=60, framebuffer=8192M, max_resolution=4096x2160, max_instance=1 --- name: GRID M60-8Q
- 管理ポータルで コンピュート → 仮想マシン をクリックします。仮想マシンを選択し、Edit をクリックします。Edit Virtual Machine ダイアログが表示されます。
- Custom Properties をクリックします。Custom Properties が表示されない場合は、最初に Show Advanced Options をクリックします。
- Custom Properties ダイアログで、Please select a key → mdev_type をクリックします。Please select a key が表示されない場合は、+ ボタンをクリックします。
表示されるテキストフィールドに、GPU タイプまたは前に識別したタイプを入力します。例: nvidia-12。コンマ区切りのリストを使用して、仮想マシンに複数の vGPU を追加できます。例: nvidia22,nvidia22。
注記複数の vGPU は同じ mdev タイプである必要があります。たとえば、nvidia22,nvidia15 は使用できません。
これで、ホストへの GPU のインストールと設定が完了しました。次に、各仮想マシンで vGPU のインストールと設定を行います。
2.2. 仮想マシンへの vGPU ドライバーのインストール
手順
- 仮想マシンを実行し、SPICE または VNC などのシリアルコンソールを使用して仮想マシンに接続します。
- ドライバーを仮想マシンにダウンロードします。ドライバーの入手方法については、NVIDIA Web サイトのドライバーページ を参照してください。
NVIDIA 仮想 GPU ソフトウェアドキュメントの nstalling the NVIDIA vGPU Software Graphics Driver の手順に従って、vGPU ドライバーをインストールします。
重要Linux のみ: Linux ゲストオペレーティングシステムにドライバーをインストールする場合、xorg.conf を更新するように求められます。インストール中に xorg.conf を更新しない場合は、手動で更新する必要があります。詳細は、「xorg の更新と有効化 (Linux 仮想マシン)」 を参照してください。
ドライバーのインストールが完了したら、マシンを再起動します。Windows 仮想マシンの場合、ゲストオペレーティングシステム内からではなく、管理ポータルまたは VM ポータルからゲストの電源を完全にオフにします。
重要Windows のみ: Windows ゲストオペレーティングシステム内から仮想マシンの電源をオフにすると、仮想マシンがハイパーネートモードになることがあります。その場合、メモリーは完全にクリアされず、その後の問題が発生する可能性があります。管理ポータルまたは VM ポータルを使用して仮想マシンの電源をオフにすると、仮想マシンは強制的にメモリーを完全にクリーンアップします。
- 仮想マシンを実行し、Mechdyne TGX などのサポートされているリモートデスクトッププロトコルの 1 つを使用して仮想マシンに接続し、NVIDIA コントロールパネルを開いて vGPU が認識されていることを確認します。Windows では、代わりに Windows Device Manager を開くこともできます。vGPU は、ディスプレイアダプターの下に表示されます。詳細については、NVIDIA 仮想 GPU ソフトウェアドキュメントの NVIDIA vGPU Software Graphics Driver を参照してください。
- 各 vGPU に NVIDIA vGPU ゲストソフトウェアライセンスを設定し、NVIDIA コントロールパネルにライセンス認証情報を追加します。詳細については、NVIDIA 仮想 GPU ソフトウェアドキュメントの How NVIDIA vGPU Software Licensing Is Enforced を参照してください。
2.3. NVIDIA vGPU デバイスの削除
割り当てられた vGPU 仲介デバイスの設定を変更する場合は、割り当てられたゲストから既存のデバイスを削除する必要があります。
手順
- 管理ポータルで Compute → Virtual Machines をクリックします。
- 仮想マシンを右クリックし、Power off をクリックします。
- 仮想マシンの電源がオフになったら、仮想マシンを選択して Edit をクリックします。Edit Virtual Machine ウィンドウが開きます。
- mdev type の横にある Custom Properties タブをクリックし、- (マイナス) ボタンをクリックしてから OK をクリックします。
2.4. NVIDIA vGPU のモニターリング
NVIDIA vGPUS の場合、物理 GPU と vGPU に関する情報を取得するには、ホストで nvidia-smi
コマンドを入力して NVIDIA システム管理インターフェイスを使用できます。詳細については、NVIDIA 仮想 GPU ソフトウェアドキュメント の NVIDIA System Management Interface nvidia-smi を参照してください。
以下に例を示します。
# nvidia-smi Thu Nov 1 17:40:09 2018 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 410.62 Driver Version: 410.62 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla M60 On | 00000000:84:00.0 Off | Off | | N/A 40C P8 24W / 150W | 1034MiB / 8191MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 1 Tesla M60 On | 00000000:85:00.0 Off | Off | | N/A 33C P8 23W / 150W | 8146MiB / 8191MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 2 Tesla M60 On | 00000000:8B:00.0 Off | Off | | N/A 34C P8 24W / 150W | 8146MiB / 8191MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 3 Tesla M60 On | 00000000:8C:00.0 Off | Off | | N/A 45C P8 24W / 150W | 18MiB / 8191MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 34432 C+G vgpu 508MiB | | 0 34718 C+G vgpu 508MiB | | 1 35032 C+G vgpu 8128MiB | | 2 35032 C+G vgpu 8128MiB | +-----------------------------------------------------------------------------+
2.5. NVIDIA vGPU のリモートデスクトップのストリーミングサービス
以下のリモートデスクトップのストリーミングサービスは、RHEL 8 の NVIDIA vGPU 機能での使用が正常にテストされています。
- HP-RGS
- Mechdyne TGX - 現在、Windows Server 2016 ゲストで Mechdyne TGX を使用することはできません。
- NICE DCV - このストリーミングサービスを使用する場合は、解像度を動的にすると、場合によっては画面が黒くなるため、Red Hat は解像度を固定する設定を使用することを推奨します。
SPICE はサポートされていません。
第3章 関連情報
KVM を使用した RHEL で NVIDA vGPU を使用する方法については、以下を参照してください。
- NVIDIA GPU ソフトウェアリリースノート。
- https://docs.nvidia.com の NVIDIA 仮想 GPU ソフトウェアドキュメント。