将 GPU 分区并分配给虚拟机
适用于:Azure Stack HCI 版本 23H2 和 22H2
注意
在 Azure Stack HCI 23H2 上创建和管理 VM 的推荐方法是使用 Azure Arc 控制平面。 仅当需要 Azure Arc VM 中不可用的功能时,才使用下面所述的机制来管理 VM。
本文介绍如何配置图形处理单元 (GPU) 分区,并将分区分配给虚拟机 (VM)。 其中提供了有关如何通过 Windows Admin Center 和 PowerShell 配置 GPU 分区计数、分配 GPU 分区和取消分配 GPU 分区的说明。
若要预配 GPU 分区功能,需要完成以下步骤:
先决条件
在开始使用 GPU 分区功能之前,需要考虑几个要求和事项:
主机服务器的先决条件
在群集的每台服务器上安装相同品牌、型号和大小的物理 GPU 设备。 在群集中的物理服务器上安装 GPU 设备时,请参阅 OEM 提供的文档。
按照 GPU IHV 的说明在群集的每台服务器上安装 GPU 驱动程序。 对于 NVIDIA GPU 驱动程序,请参阅 NVIDIA vGPU 文档。
确保在群集中每台服务器的 BIOS 中启用虚拟化支持和 SR-IOV。 如果无法确定 BIOS 中的正确设置,请与系统供应商联系。
- 群集主机需要具有支持输入/输出内存管理单元 (IOMMU) DMA 位跟踪功能的处理器。 例如,支持 Intel VT-D 或 AMD-Vi 的处理器。
注意
当使用分配了 GPU 分区的虚拟机进行实时迁移时,Hyper-V 实时迁移将自动回退为使用带压缩的 TCP/IP。 这可能会提高主机的 CPU 利用率。 此外,实时迁移所需的时间可能比未附加 GPU 分区的虚拟机更长。
VM 的先决条件
Windows Admin Center 的先决条件
如果使用 Windows Admin Center 预配 GPU 分区,则必须安装最新版 Windows Admin Center 和 GPU 扩展 2.8.0 或更高版本。 有关如何在 Windows Admin Center 中安装 GPU 扩展的说明,请参阅安装扩展。
安装该扩展后,它会显示在已安装的扩展选项卡下,如以下屏幕截图所示。 确保 GPU 扩展版本为 2.8.0 或更高版本。
PowerShell 先决条件
如果使用 PowerShell 预配 GPU 分区,则必须以管理员用户身份运行所有 PowerShell 命令。
有关如何使用 PowerShell 命令进行 GPU 分区的详细信息,请参阅 Add-VMGpuPartitionAdapter、Get-VMGpuPartitionAdapter 和 Remove-VMGpuPartitionAdapter 参考文档。
验证 GPU 驱动程序安装
满足所有先决条件后,必须验证 GPU 驱动程序是否已安装且可分区。
按照以下步骤使用 Windows Admin Center 验证 GPU 驱动程序是否已安装且可分区:
启动 Windows Admin Center 并确保已安装 GPU 扩展。
在顶部下拉菜单中选择群集管理器,并连接到群集。
在设置菜单中,选择扩展>GPU。
GPU 页上的 GPU 选项卡显示了所有服务器以及每台服务器上安装的物理 GPU 的清单。
检查所有服务器的每个 GPU 的分配状态列。 分配状态列包含以下状态之一:
已准备好进行 DDA 分配。 指示 GPU 可以进行 DDA 分配。 不能将它用于 GPU 分区。
已分区。 指示 GPU 可分区。
半虚拟化。 指示 GPU 已安装分区驱动程序功能,但服务器上未启用 SR-IOV。
不可分配。 指示 GPU 不可分配,因为它是较旧的 PCI 样式设备或交换机端口。
仅当群集中所有服务器中的 GPU 的分配状态列显示已分区时,才能继续执行 GPU 分区工作流。
按照以下步骤使用 PowerShell 验证 GPU 驱动程序是否已安装且可分区:
使用远程桌面协议 (RDP) 连接到群集中的服务器,并运行以下 PowerShell 命令验证是否已安装 GPU 设备:
Get-PnpDevice -FriendlyName "<device-friendly-name>"
例如,若要列出 NVIDIA A2 GPU 设备,请输入以下命令:
Get-PnpDevice -FriendlyName "NVIDIA A2"
下面是示例输出:
Status Class FriendlyName
------ ----- ------------
OK Display NVIDIA A2
对于 NVIDIA GPU 设备,还可以运行 NVIDIA 系统管理接口 nvidia-smi
列出主机服务器上的 GPU。
如果驱动程序安装成功,你会看到类似以下示例的输出:
nvidia-smi
下面是示例输出:
Wed Nov 30 15:22:36 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 527.27 Driver Version: 527.27 CUDA Version: N/A |
|-------------------------------+----------------------+----------------------+
| GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA A2 WDDM | 00000000:65:00.0 Off | 0 |
| 0% 24C P8 5W / 60W | 15192MiB / 15356MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 1 NVIDIA A2 WDDM | 00000000:66:00.0 Off | 0 |
| 0% 24C P8 5W / 60W | 15192MiB / 15356MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
运行以下命令,通过列出支持 GPU 分区的 GPU 来验证主机服务器是否安装了所需的 GPU 适配器。
Get-VMHostPartitionableGpu | FL Name,ValidPartitionCounts
记下 Get-VMHostPartitionableGpu
命令输出中的 Name 和 ValidPartitionCounts 值。 稍后将使用这些值来配置分区计数。
下面是 Get-VMHostPartitionableGpu
命令的示例输出,其中显示此服务器上安装了两个可分区的 GPU 驱动程序。 为第一个 GPU 配置的分区计数为 16,为第二个 GPU 配置的分区计数为 4。
PS C:\Users> Get-VMHostPartitionableGPU
Name : \\?\PCI#VEN_10DE&DEV_25B6&SUBSYS_157E10DE&REV_A1#4&18416dc3&0&0000#{064092b3-625e-43bf-9eb5-dc845897dd59}
ValidPartitionCounts : {16, 8, 4, 2...}
Name : \\?\PCI#VEN_10DE&DEV_25B6&SUBSYS_157E10DE&REV_A1#4&5906f5e&0&0010#{064092b3-625e-43bf-9eb5-dc845897dd59}
ValidPartitionCounts : {16, 8, 4, 2...}
每个可分区 GPU 附带一个由其 OEM 预定义的有效分区计数集。 无法定义 GPU 的分区数。 但是,可以将分区计数配置为受支持集内的任何有效计数。
按照以下步骤通过 Windows Admin Center 配置分区计数:
选择 GPU 分区选项卡以配置分区计数。 还可以使用此选项卡将分区分配到 VM,以及从 VM 中取消分配分区。
注意
如果群集中没有可用的可分区 GPU,或者未安装正确的 GPU 分区驱动程序,则“GPU 分区”选项卡将显示以下消息:
未找到可分区的 GPU。 请检查你的 GPU 是否安装了正确的 GPU-P 驱动程序以继续操作。
选择一个 GPU 或 GPU 分区,以在页面底部部分的选定项详细信息下显示其详细信息。 例如,如果选择某个 GPU,则会显示 GPU 名称、GPU ID、可用编码器和解码器、可用 VRAM、有效分区计数以及当前分区计数。 如果选择某个 GPU 分区,则会显示分区 ID、VM ID、实例路径、分区 VRAM、分区编码器和分区解码器。
选择配置分区计数。
此时会显示配置 GPU 上的分区计数页。 对于每个服务器,此页会显示安装在服务器上的 GPU 设备。
选择一组同构 GPU。 同构 GPU 是指大小、制造商、型号和分区数相同的 GPU。 默认情况下,Windows Admin Center 会在检测到一组同构 GPU 时自动选择这些 GPU,如以下屏幕截图所示:
根据所做选择,你可能会看到警告或错误:
警告。 如果你从一组同构 GPU 中取消选择一个或多个 GPU,Windows Admin Center 会发出警告,但不会阻止你继续操作。 警告文本会指出你未选择所有 GPU,而这可能会导致不同的分区计数,因此不建议这样做。
警告。 如果所有服务器中的所有 GPU 的配置不都相同,Windows Admin Center 会发出警告。 必须手动选择具有相同配置的 GPU 才能继续操作。
错误。 如果你选择具有不同配置的 GPU,Windows Admin Center 将显示错误,并且不允许你继续操作。
错误。 如果你选择已分配到 VM 的 GPU 分区,Windows Admin Center 将显示错误,并且不允许你继续操作。 必须先从该 VM 中取消分配该分区才能继续操作。 请参阅从 VM 中取消分配分区。
选择一组同构 GPU 后,从分区数下拉列表中选择分区计数。 此列表会自动填充 GPU 制造商配置的分区计数。 列表中显示的计数因你选择的 GPU 类型而异。
选择不同的分区计数后,下拉列表下方会显示一个工具提示,其中动态显示了每个分区获得的 VRAM 大小。 例如,如果 GPU 中 16 个分区的 VRAM 总共为 16 GB,则将分区计数从 16 更改为 8 会为每个分区分配 1.85 GB 的 VRAM。
选择配置分区计数。
配置分区计数后,Windows Admin Center 会通知你分区计数已成功配置,并再次显示 GPU 分区选项卡。 可以在分区计数列下查看 GPU 分区的新分区计数。
按照以下步骤在 PowerShell 中配置 GPU 分区计数:
注意
使用 PowerShell 时,必须手动确保 GPU 配置在群集中的所有服务器之间是同构的。
参考前面在运行 Get-VMHostPartitionableGpu
命令时记下的 Name 和 ValidPartitionCounts 值。 请参阅上一节验证 GPU 驱动程序安装中的“PowerShell”选项卡。
连接到要为其配置 GPU 分区计数的服务器。
运行以下命令以配置分区计数。 请将 GPU-name
替换为 Name 值,将 partition-count
替换为 ValidPartitionCounts 值中支持的计数之一:
Set-VMHostPartitionableGpu -Name "<GPU-name>" -PartitionCount <partition-count>
例如,以下命令将分区计数配置为 4:
PS C:\Users> Set-VMHostPartitionableGpu -Name "\\?\PCI#VEN_10DE&DEV_25B6&SUBSYS_157E10DE&REV_A1#4&18416dc3&0&0000#{064092b3-625e-43bf-9eb5-dc845897dd59}" -PartitionCount 4
可以再次运行 Get-VMHostPartitionableGpu | FL Name,ValidPartitionCounts,PartitionCount
来验证分区计数是否设置为 4。
下面是示例输出:
PS C:\Users> Get-VMHostPartitionableGpu | FL Name,ValidPartitionCounts,PartitionCount
Name : \\?\PCI#VEN_10DE&DEV_25B6&SUBSYS_157E10DE&REV_A1#4&18416dc3&0&0000#{064092b3-625e-43bf-9eb5-dc845897dd59}
ValidPartitionCounts : {16, 8, 4, 2...}
PartitionCount : 4
Name : \\?\PCI#VEN_10DE&DEV_25B6&SUBSYS_157E10DE&REV_A1#4&5906f5e&0&0010#{064092b3-625e-43bf-9eb5-dc845897dd59}
ValidPartitionCounts : {16, 8, 4, 2...}
PartitionCount : 4
若要保持同构配置,请在群集中的每个服务器上重复分区计数配置步骤。
将 GPU 分区分配到 VM
在将分区分配到 VM 之前保存工作负载。
注意
目前只能将单个 GPU 分区分配到 VM。 VM 和 GPU 分区需要位于同一台主机上。 建议提前规划,并根据工作负载性能要求确定 GPU 分区大小。
在分配分区之前必须保存工作负载。 如果 VM 当前已打开或正在运行,Windows Admin Center 会自动将其关闭,分配分区,然后自动将其打开。
在 GPU 分区选项卡上,选择 + 分配分区。
此时会显示将 GPU 分区分配到 VM 页。
从选择服务器列表中,选择 VM 所在的服务器。 此列表显示群集中的所有服务器。
搜索要将 GPU 分区分配到的 VM 并将其选中。 该列表会自动填充位于步骤 2 中选择的服务器上的 VM。
选择可用的 VRAM 选项。 此字段中的值必须与配置的分区计数大小匹配。
(可选但建议的步骤)如果你希望 VM 高度可用并在其主机服务器出现故障时进行故障转移,请选中配置强制关闭脱机操作复选框。
选择分配分区。 这会将所选 VRAM 大小的分区分配到所选主机服务器上的所选 VM。
分配分区后,Windows Admin Center 将通知分区已成功分配,并再次显示 GPU 分区选项卡。 在 GPU 分区选项卡上,VM 显示在它安装所在的服务器中的 GPU 分区行上。
按照以下步骤使用 PowerShell 将 GPU 分区分配到 VM:
连接到要将 GPU 分区分配到的 VM 所在的服务器。
运行以下命令,将群集 VM 资源的默认脱机操作配置为 force-shutdown
而不是 save
。
Get-ClusterResource -name vmname | Set-ClusterParameter -Name "OfflineAction" -Value 3
注意
如果发生故障,则需要关闭 VM,清空服务器,然后手动将 VM 故障转移到另一台服务器。
若要分配分区,请运行以下命令。
Add-VMGpuPartitionAdapter -VMName $VMName
若要验证是否已分配分区,请运行以下命令。
Get-VMGpuPartitionAdapter -VMName $VMName | FL InstancePath,PartitionId,PartitionVfLuid
例如,运行以下命令,以先将分区分配到 mytestgpu-vm1 VM,然后验证分配:
$VMname = "mytestgpu-vm1"
Add-VMGpuPartitionAdapter -VMName $VMName
Get-VMGpuPartitionAdapter -VMName $VMName | FL InstancePath,PartitionId,PartitionVfLuid
下面是示例输出:
InstancePath : \\?\PCI#VEN_10DE&DEV_25B6&SUBSYS_157E10DE&REV_A1#4&18416dc3&0&0000#{064092b3-625e-43bf-9eb5-dc845897dd59}
PartitionId : 0
PartitionVfLuid : 10-973909323
使用 PowerShell 或 Windows Admin Center 启动 VM 以解析分区。
下一步是使用 PowerShell 或 Windows Admin Center 启动 VM。 VM 启动并运行后,会在设备管理器中显示 GPU。
从 VM 中取消分配分区
如果你不再需要使用某个 GPU 分区来运行工作负载,可以从 VM 中取消分配该分区。 取消分配分区会释放 GPU 分区资源,然后可将该资源重新分配给另一个 VM。
在取消分配分区之前必须保存工作负载。
如果 VM 当前处于打开状态或正在运行,则 Windows Admin Center 会先自动将其关闭,取消分配分区,然后自动将其打开。
按照以下步骤从 VM 中取消分配分区:
在 GPU 分区选项卡上,选择要取消分配的 GPU 分区。
选择 - 取消分配分区。
此时会显示从 VM 中取消分配 GPU 分区页。
从选择服务器列表中,选择要从中取消分配 GPU 分区的服务器。
在选择要从中取消分配分区的虚拟机列表中,搜索或选择要从中取消分配分区的 VM。
选择取消分配分区。
取消分配分区后,Windows Admin Center 将通知分区已成功取消分配,并再次显示 GPU 分区选项卡。 在 GPU 分区选项卡上,已从中取消分配分区的 VM 不再显示在 GPU 分区行上。
按照以下步骤使用 PowerShell 从 VM 中取消分配 GPU 分区:
连接到要从中取消分配 GPU 分区的 VM 所在的服务器。
运行以下命令,将群集 VM 资源的默认脱机操作配置为 force-shutdown
而不是 save
。
Get-ClusterResource -name vmname | Set-ClusterParameter -Name "OfflineAction" -Value 3
注意
如果发生故障,则需要关闭 VM,清空服务器,然后手动将 VM 故障转移到另一台服务器。
运行以下命令以删除分区:
Remove-VMGpuPartitionAdapter -VMName $VMname
运行以下命令以确认是否已删除分区。 如果删除了分区,则此命令不返回任何内容。
Get-VMGpuPartitionAdapter -VMName $VMName