10.7. 为 GPU 设备启用 PCI 透传
您可以使用 PCI 透传将物理 PCI 设备(如图形卡)附加到实例。如果您将 PCI 透传用于设备,实例会保留对设备执行任务的独占访问,且设备对主机不可用。
先决条件
-
pciutils
软件包安装在具有 PCI 卡的物理服务器上。 - GPU 设备的驱动程序必须安装在设备要传递给的实例上。因此,您需要已创建了安装了所需 GPU 驱动程序的自定义实例镜像。有关如何创建安装了 GPU 驱动程序的自定义实例镜像的更多信息,请参阅 创建自定义 GPU 实例镜像。
流程
要确定每个 passthrough 设备类型的厂商 ID 和产品 ID,请在具有 PCI 卡的物理服务器上输入以下命令:
# lspci -nn | grep -i <gpu_name>
例如,要确定 NVIDIA GPU 的 vendor 和 product 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 设备是否具有单根 I/O 虚拟化(SR-IOV)功能,请在具有 PCI 卡的物理服务器上输入以下命令:
# lspci -v -s 3b:00.0 3b:00.0 3D controller: NVIDIA Corporation TU104GL [Tesla T4] (rev a1) ... Capabilities: [bcc] Single Root I/O Virtualization (SR-IOV) ...
-
要在 overcloud 上为 PCI 透传配置 Controller 节点,请创建一个环境文件,如
pci_passthru_controller.yaml
。 将
PciPassthroughFilter
添加到pci_passthru_controller.yaml
中的NovaSchedulerEnabledFilters
参数中:parameter_defaults: NovaSchedulerEnabledFilters: - AvailabilityZoneFilter - ComputeFilter - ComputeCapabilitiesFilter - ImagePropertiesFilter - ServerGroupAntiAffinityFilter - ServerGroupAffinityFilter - PciPassthroughFilter - NUMATopologyFilter
要为 Controller 节点上的设备指定 PCI 别名,请在
pci_passthru_controller.yaml
中添加以下配置:如果 PCI 设备具有 SR-IOV 功能:
ControllerExtraConfig: nova::pci::aliases: - name: "t4" product_id: "1eb8" vendor_id: "10de" device_type: "type-PF" - name: "v100" product_id: "1db4" vendor_id: "10de" device_type: "type-PF"
如果 PCI 设备没有 SR-IOV 功能:
ControllerExtraConfig: nova::pci::aliases: - name: "t4" product_id: "1eb8" vendor_id: "10de" - name: "v100" product_id: "1db4" vendor_id: "10de"
有关配置
device_type
字段的更多信息,请参阅 PCI passthrough 设备类型字段。注意如果
nova-api
服务以 Controller 以外的角色运行,请将ControllerExtraConfig
替换为用户角色,格式为 <Role>ExtraConfig
。
-
要在 overcloud 上为 PCI 透传配置 Compute 节点,请创建一个环境文件,如
pci_passthru_compute.yaml
。 要为 Compute 节点上的设备指定可用的 PCI,请将以下内容添加到
pci_passthru_compute.yaml
中:parameter_defaults: NovaPCIPassthrough: - vendor_id: "10de" product_id: "1eb8"
您必须在 Compute 节点上为实例迁移和调整大小操作创建 PCI 别名的副本。要为 Compute 节点上的设备指定 PCI 别名,请将以下内容添加到
pci_passthru_compute.yaml
中:如果 PCI 设备具有 SR-IOV 功能:
ComputeExtraConfig: nova::pci::aliases: - name: "t4" product_id: "1eb8" vendor_id: "10de" device_type: "type-PF" - name: "v100" product_id: "1db4" vendor_id: "10de" device_type: "type-PF"
如果 PCI 设备没有 SR-IOV 功能:
ComputeExtraConfig: nova::pci::aliases: - name: "t4" product_id: "1eb8" vendor_id: "10de" - name: "v100" product_id: "1db4" vendor_id: "10de"
注意Compute 节点别名必须与 Controller 节点上的别名相同。
要在 Compute 节点的服务器 BIOS 中启用 IOMMU 以支持 PCI 透传,请将
KernelArgs
参数添加到pci_passthru_compute.yaml
中:parameter_defaults: ... ComputeParameters: KernelArgs: "intel_iommu=on iommu=pt"
注意当您首先将
KernelArgs
参数添加到角色的配置中时,overcloud 节点会自动重启。如果需要,您可以禁用自动重新引导节点,并在每个 overcloud 部署后手动重启节点。如需更多信息,请参阅配置手动节点重新引导以定义KernelArgs
。使用其他环境文件将自定义环境文件添加到堆栈中,并部署 overcloud:
(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 为
10de
,产品 ID 为13f2
:# openstack flavor set m1.large \ --property "pci_passthrough:alias"="t4:2"
验证
使用 PCI 透传设备创建实例:
# openstack server create --flavor m1.large \ --image <custom_gpu> --wait test-pci
将
<custom_gpu
> 替换为安装了所需 GPU 驱动程序的自定义实例镜像的名称。- 以云用户身份登录实例。如需更多信息,请参阅 连接到实例。
要验证 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 |-----------------------------------------------------------------------------