8.4. GPU デバイスの PCI パススルーの有効化
PCI パススルーを使用して、グラフィックカード等の物理 PCI デバイスをインスタンスに接続することができます。デバイスに PCI パススルーを使用する場合、インスタンスはタスクを実行するためにデバイスへの排他的アクセスを確保し、ホストはデバイスを利用することができません。
前提条件
-
pciutils
パッケージが PCI カードを持つ物理サーバーにインストールされている。 - GPU インスタンスにインストールするための GPU ドライバーが利用可能である。詳細は、「GPU 対応カスタムオーバークラウドイメージのビルド」を参照してください。
手順
各パススルーデバイス種別のベンダー ID および製品 ID を確認するには、PCI カードを持つ物理サーバーで以下のコマンドを実行します。
# lspci -nn | grep -i <gpu_name>
たとえば、NVIDIA GPU のベンダーおよび製品 ID を確認するには、以下のコマンドを実行します。
# lspci -nn | grep -i nvidia 3b:00.0 3D controller [0302]: NVIDIA Corporation TU104GL [Tesla T4] [10de:1eb8] (rev a1) d8:00.0 3D controller [0302]: NVIDIA Corporation TU104GL [Tesla T4] [10de:1db4] (rev a1)
-
PCI パススルー用にオーバークラウド上のコントローラーノードを設定するには、環境ファイル (例:
pci_passthru_controller.yaml
) を作成します。 pci_passthru_controller.yaml
のNovaSchedulerDefaultFilters
パラメーターにPciPassthroughFilter
を追加します。parameter_defaults: NovaSchedulerDefaultFilters: ['RetryFilter','AvailabilityZoneFilter','ComputeFilter','ComputeCapabilitiesFilter','ImagePropertiesFilter','ServerGroupAntiAffinityFilter','ServerGroupAffinityFilter','PciPassthroughFilter','NUMATopologyFilter']
コントローラーノード上のデバイスの PCI エイリアスを指定するには、以下の設定を
pci_passthru_controller.yaml
に追加します。ControllerExtraConfig: nova::pci::aliases: - name: "t4" product_id: "1eb8" vendor_id: "10de" - name: "v100" product_id: "1db4" vendor_id: "10de"
注記nova-api
サービスが Controller 以外のロールで実行されている場合は、ControllerExtraConfig
を<Role>ExtraConfig
の形式でユーザーロールに置き換えます。-
PCI パススルー用にオーバークラウド上のコンピュートノードを設定するには、環境ファイル (例:
pci_passthru_compute.yaml
) を作成します。 コンピュートノード上のデバイスに許可される PCI を指定するには、以下の設定を
pci_passthru_compute.yaml
に追加します。parameter_defaults: NovaPCIPassthrough: - vendor_id: "10de" product_id: "1eb8"
PCI パススルーをサポートするためにコンピュートノードのサーバー BIOS で IOMMU を有効にするには、
pci_passthru_compute.yaml
にKernelArgs
パラメーターを追加します。parameter_defaults: ... ComputeParameters: KernelArgs: "intel_iommu=on iommu=pt"
その他の環境ファイルと共にカスタム環境ファイルをスタックに追加して、オーバークラウドをデプロイします。
(undercloud) $ openstack overcloud deploy --templates \ -e [your environment files] -e /home/stack/templates/pci_passthru_controller.yaml -e /home/stack/templates/pci_passthru_compute.yaml
PCI デバイスを要求するためのフレーバーを設定します。以下の例では、それぞれベンダー ID および製品 ID が
10de
および13f2
の 2 つのデバイスをリクエストします。# openstack flavor set m1.large --property "pci_passthrough:alias"="t4:2"
PCI パススルーデバイスを設定してインスタンスを作成します。
# openstack server create --flavor m1.large --image rhelgpu --wait test-pci
- cloud-user としてインスタンスにログインします。詳細は、「インスタンス へのログイン」を参照してください。
インスタンスに GPU ドライバーをインストールします。たとえば、以下のスクリプトを実行して NVIDIA ドライバーをインストールします。
$ sh NVIDIA-Linux-x86_64-430.24-grid.run
検証
インスタンスが GPU にアクセスできることを確認するには、インスタンスから以下のコマンドを実行します。
$ lspci -nn | grep <gpu_name>
NVIDIA System Management Interface のステータスを確認するには、インスタンスから以下のコマンドを実行します。
$ nvidia-smi
出力例:
-----------------------------------------------------------------------------
| NVIDIA-SMI 440.33.01 Driver Version: 440.33.01 CUDA Version: 10.2 | |-----------------------------------------------------
----------------------+ | 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 T4 Off | 00000000:01:00.0 Off | 0 | | N/A 43C P0 20W / 70W | 0MiB / 15109MiB | 0% Default |-------------------------------
--------------------------------------------
-----------------------------------------------------------------------------
| Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found |-----------------------------------------------------------------------------