本章では、ホストマシンに搭載された NVIDIA GPU グラフィックカードを仮想化ゲストで使用するための手順を説明しています。
GPU パススルーは AMD64/Intel 64 アーキテクチャでのみサポートされています。
本章で説明している内容は、 V100/T1000 NVIDIA ベースのカードを使用することを前提にしています。つまり、 GPU を計算処理の目的でのみ使用する想定です。
お使いの製品が NVIDIA Tesla 製品であることを確認しておいてください。具体的にはMaxwell, Pascal, Volta の各アーキテクチャである必要があります。
本章内の設定を実施すると、対象の GPU はホスト側からは使用できなくなります。そのため、表示用の別のグラフィックカードを接続しておくか、もしくは SSH でリモートアクセスできることをあらかじめ確認しておいてください。
また、お使いのホストが VT-d に対応していて、かつファームウエア側の設定で有効化されていることを確認します:
>
dmesg | grep -e "Directed I/O"
[ 12.819760] DMAR: Intel(R) Virtualization Technology for Directed I/O
ファームウエア側の設定で VT-d が有効化されていない場合は、ホストを再起動して有効化してください。
また、表示用の追加 GPU もしくは VGA カードが搭載されていることを確認します:
>
lspci | grep -i "vga"
07:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. \
MGA G200e [Pilot] ServerEngines (SEP1) (rev 05)
Tesla V100 カードを使用する場合は、下記のようにしてカードが認識されていることを確認します:
>
lspci | grep -i nvidia
03:00.0 3D controller: NVIDIA Corporation GV100 [Tesla V100 PCIe] (rev a1)
T1000 Mobile カードを使用する場合 (たとえば Dell 5540 など) は、下記のようにしてカードが認識されていることを確認します:
>
lspci | grep -i nvidia
01:00.0 3D controller: NVIDIA Corporation TU117GLM [Quadro T1000 Mobile] (rev a1)
既定では IOMMU は無効化されています。有効化するには、 /etc/default/grub
ファイルを編集して、起動時に有効化しておく必要があります。
Intel プロセッサの場合は下記の内容を追加します:
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt rd.driver.pre=vfio-pci"
AMD プロセッサの場合は下記の内容を追加します:
GRUB_CMDLINE_LINUX="iommu=pt amd_iommu=on rd.driver.pre=vfio-pci"
/etc/default/grub
ファイルを編集して保存したら、あとはメインの GRUB 2 設定ファイルである /boot/grub2/grub.cfg
ファイルを再生成します:
>
sudo
grub2-mkconfig -o /boot/grub2/grub.cfg
ホストを再起動して、 IOMMU が有効化されていることを確認します:
>
dmesg | grep -e DMAR -e IOMMU
NVIDIA カードを VM ゲストに割り当てるには、ホスト側の OS で NVIDIA GPU 向けの内蔵ドライバである nouveau
を読み込まないように設定する必要があります。具体的には /etc/modprobe.d/60-blacklist-nouveau.conf
ファイルを作成して下記のような内容を記述します:
blacklist nouveau
あとはパススルー設定を行うカードの製造元と型番 ID を調べます。この場合、 A.3.1項 「ホスト側の環境確認」 で調べたバス番号を指定して表示させます。たとえば 03:00.0
の場合、下記のようになります:
>
lspci -nn | grep 03:00.0
03:00.0 3D controller [0302]: NVIDIA Corporation GV100 [Tesla V100 PCIe] [10de:1db4] (rev a1)
/etc/modprobe.d/vfio.conf
ファイルを作成して、下記のような内容を記述します:
options vfio-pci ids=10de:1db4
また、お使いのカード側で追加の ids=
を指定する必要があるかどうかを確認してください。これは、カードによってはオーディオデバイスも合わせて指定しなければ、カードを使用できなくなってしまうものがあるためです。
VFIO ドライバの読み込みにあたっては、下記の 3 種類の方法が用意されています。
/etc/dracut.conf.d/gpu-passthrough.conf
ファイルを作成して、下記のような内容を記述します (頭に空白を入れる必要があることに注意してください):
add_drivers+=" vfio vfio_iommu_type1 vfio_pci vfio_virqfd"
あとは initrd ファイルを再作成します:
>
sudo
dracut --force /boot/initrd $(uname -r)
/etc/modules-load.d/vfio-pci.conf
ファイルを作成して、下記のような内容を記述します:
vfio vfio_iommu_type1 vfio_pci kvm kvm_intel
システム稼働中にドライバを手作業で読み込みたい場合は、下記のようなコマンドを実行します:
>
sudo
modprobe vfio-pci
Microsoft Windows ゲストを使用する場合、ゲスト側のクラッシュを防ぐため、 MSR (model-specific register) の無効化をお勧めします。無効化を行うには、 /etc/modprobe.d/kvm.conf
ファイルを作成して、下記のような内容を記述します:
options kvm ignore_msrs=1
GPU パススルーを正しく動作させるためには、ホスト側を UEFI ファームウエアで起動する必要があります (つまり、従来の BIOS 起動手順を使用しないようにする必要があります) 。また、 qemu-ovmf パッケージをインストールしていない場合は、まずインストールを行ってください:
>
sudo
zypper install qemu-ovmf
本章では、ゲスト側の仮想マシンでホスト側の NVIDIA GPU を使用するための設定方法を説明しています。ゲスト側の仮想マシンをインストールするには、 仮想マシンマネージャ もしくは virt-install
をお使いください。詳しくは 第9章 「ゲストのインストール」 をお読みください。
ゲスト側の仮想マシンをインストールする際、
を選択して、下記のとおりデバイスの設定を行ってください:可能であれば Q35 チップセットをお使いください。
UEFI ファームウエアを利用してゲスト VM をインストールしてください。
下記の擬似デバイスを追加しておいてください:
グラフィック: Spice もしくは VNC
デバイス: qxl, VGA, Virtio のいずれか
詳しくは 13.6項 「ビデオ」 をお読みください。
ゲスト側にホスト側の PCI デバイス (ここまでの例では 03:00.0
になっています) を追加します。詳しくは 13.12項 「VM ゲスト に対するホスト側の PCI デバイスの割り当て」 をお読みください。
最適な性能を引き出すため、ネットワークカードとストレージに対して virtio ドライバを使用しておくことをお勧めします。
https://www.nvidia.com/download/driverResults.aspx/131159/en-us から RPM パッケージをダウンロードします。
ダウンロードした RPM パッケージをインストールします:
>
sudo
rpm -i nvidia-diag-driver-local-repo-sles123-390.30-1.0-1.x86_64.rpm
リポジトリを更新して cuda-drivers パッケージをインストールします。下記のコマンドは SUSE ディストリビューション向けですので、それ以外のものをお使いの場合はそれぞれに合わせて実施してください:
>
sudo
zypper refresh && zypper install cuda-drivers
ゲスト VM を再起動します:
>
sudo
shutdown -r now
一般的なインストーラを使用する場合、 NVIDIA ドライバモジュールをコンパイルする必要があることから、 gcc-c++ と kernel-devel の各パッケージをインストールしておいてください。
また、 NVIDIA が提供するドライバには署名が付与されていないことから、ゲスト側で Secure Boot を使用している場合は、無効化してください。 YaST GRUB 2 モジュールを使用することで、 Secure Boot を無効化することができます。詳しくは 14.1.1項 「openSUSE Leap での実装」 をお読みください。
あとは https://www.nvidia.com/Download/index.aspx?lang=ja-jp からドライバのインストールスクリプトをダウンロードし、実行可能な状態にしてから実行してください。これでドライバのインストールが完了します:
>
chmod +x NVIDIA-Linux-x86_64-460.73.01.run>
sudo
./NVIDIA-Linux-x86_64-460.73.01.run
あとは CUDA ドライバを https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=SLES&target_version=15&target_type=rpmlocal からダウンロードして実行し、画面上に表示された手順に従ってインストールしてください。
NVIDIA ドライバをインストールすると、 仮想マシンマネージャ はゲスト OS のディスプレイに接続できなくなります。ゲスト VM にアクセスするには、 ssh
経由でログインするか、もしくはシリアルコンソールか専用の VNC サーバ経由でログインする必要があります。また画面の乱れを防ぐため、ディスプレイマネージャを停止して無効化しておく必要があります:
>
sudo
systemctl stop display-manager && systemctl disable display-manager
CUDA のサンプルテンプレートのあるディレクトリに移動します:
>
cd /usr/local/cuda-9.1/samples/0_Simple/simpleTemplates
あとは simpleTemplates
ファイルをコンパイルして実行します:
>
make && ./simpleTemplates
runTest<float,32>
GPU Device 0: "Tesla V100-PCIE-16GB" with compute capability 7.0
CUDA device [Tesla V100-PCIE-16GB] has 80 Multi-Processors
Processing time: 495.006000 (ms)
Compare OK
runTest<int,64>
GPU Device 0: "Tesla V100-PCIE-16GB" with compute capability 7.0
CUDA device [Tesla V100-PCIE-16GB] has 80 Multi-Processors
Processing time: 0.203000 (ms)
Compare OK
[simpleTemplates] -> Test Results: 0 Failures
NVIDIA ドライバをインストールする前に、まずはゲスト側の libvirt
設定内に <hidden state='on'/>
を追加して、ドライバからハイパーバイザを隠蔽する必要があります。たとえば下記のようになります:
<features> <acpi/> <apic/> <kvm> <hidden state='on'/> </kvm> </features>
あとは https://www.nvidia.com/Download/index.aspx から NVIDIA ドライバをダウンロードして、インストールします。
また、 https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64 から CUDA ツールキットをダウンロードしてインストールします。
インストールが完了すると、 NVIDIA のデモサンプルがゲスト内の Program Files\Nvidia GPU Computing Toolkit\CUDA\v10.2\extras\demo_suite
ディレクトリに展開されます。