参考链接
添加虚拟GPU到实例
Nova的虚拟GPU特性可以实现使用能够提供虚拟GPU的物理GPU部署指定类型的GPU到实例。
比如单独的Intel GVT-g或者NVIDIA GRID vGPU物理图形处理器单元都可以被虚拟化成多个虚拟vGPUs,前提是hypervisor支持硬件的驱动以及有足够的容量来创建实例使用这些虚拟硬件。
这个特性是高度依赖hypervisor,以及它的版本和主机上的硬件。除此之外,厂商的vGPU的驱动程序必须在主机节点上进行安装和配置。
关于特定于管理程序的注意事项查看链接。
可按照如下方式启用虚拟GPU。
启用GPU类型(Compute)
指定实例使用的特定GPU类型
[devices]
enabled_vgpu_types = nvidia-35
注:在Queens版本中,Nova仅仅支持单一的类型,如果指定多个类型,只有第一个类型会被使用。
可查看链接了解可使用的GPU类型。
重启nova-compute
警告:更改GPU类型是可以实现的,但是由于现有物理GPU无法处理具有不同类型的多个实例。如果具有原始类型的实例仍然存在,nova则会返回一个NoValidHost。因此,强烈建议将新类型部署到没有工作负载的新计算节点之上,并在需要更改类型的节点重新构建实例。
配置flavor(Controller)
配置flavor请求一个vGPU:
openstack flavor set vgpu_1 --property "resources:VGPU=1"
注:在Queens版本中,所有支持vGPU的hypervisors每个实例只能接受单个vGPU。
计算节点上已启用的vGPU类型不对外开放给API用户。Flavor的GPU配置支持绑定到主机聚合。及意味着适宜的调度这些flavor到支持vGPU的节点上。可参考Host Aggregates了解更多信息。
使用vGPU创建实例
nova-scheduler通过调用由计算节点提供的特定vGPU资源类的Placement API来选择具有可用vGPU设备的目标主机。
openstack server create --flavor vgpu_1 --image cirros-0.3.5-x86_64-uec --wait test-vgpu
注:在Queens版本中,只有FilterScheduler调度驱动使用Placement API。
如何寻找GPU类型
取决于Hypervisor:
- 对于libvrt,vGPUs被视为mediated devices。支持vGPUs的物理PCI设备(这里的图形卡)建议使用mediated device(mdev)类型。自从mediated devices可以在安装厂商vGPUs驱动之后通过sysfs filelinux kernel支持,你可以看到所需的属性如下:
$ ls /sys/class/mdev_bus/*/mdev_supported_types
/sys/class/mdev_bus/0000:84:00.0/mdev_supported_types:
nvidia-35 nvidia-36 nvidia-37 nvidia-38 nvidia-39 nvidia-40 nvidia-41 nvidia-42 nvidia-43 nvidia-44 nvidia-45/sys/class/mdev_bus/0000:85:00.0/mdev_supported_types:
nvidia-35 nvidia-36 nvidia-37 nvidia-38 nvidia-39 nvidia-40 nvidia-41 nvidia-42 nvidia-43 nvidia-44 nvidia-45/sys/class/mdev_bus/0000:86:00.0/mdev_supported_types:
nvidia-35 nvidia-36 nvidia-37 nvidia-38 nvidia-39 nvidia-40 nvidia-41 nvidia-42 nvidia-43 nvidia-44 nvidia-45/sys/class/mdev_bus/0000:87:00.0/mdev_supported_types:
nvidia-35 nvidia-36 nvidia-37 nvidia-38 nvidia-39 nvidia-40 nvidia-41 nvidia-42 nvidia-43 nvidia-44 nvidia-45
- 对于XenServer来说,依赖于可用的硬件和dom0的配置文件,vGPU类型在XenServer启动时进行创建。可运行命令xe vgpu-type-list从dom0获取可用的vGPU类型。这些值对model-name(RO)字段:作为vGPU类型可用于设置[devices]/enabled_vgpu_types。例如:
[root@trailblazer-2 ~]# xe vgpu-type-list
uuid ( RO) : 78d2d963-41d6-4130-8842-aedbc559709fvendor-name ( RO): NVIDIA Corporationmodel-name ( RO): GRID M60-8Qmax-heads ( RO): 4max-resolution ( RO): 4096x2160uuid ( RO) : a1bb1692-8ce3-4577-a611-6b4b8f35a5c9vendor-name ( RO): NVIDIA Corporationmodel-name ( RO): GRID M60-0Qmax-heads ( RO): 2max-resolution ( RO): 2560x1600uuid ( RO) : 69d03200-49eb-4002-b661-824aec4fd26fvendor-name ( RO): NVIDIA Corporationmodel-name ( RO): GRID M60-2Amax-heads ( RO): 1max-resolution ( RO): 1280x1024uuid ( RO) : c58b1007-8b47-4336-95aa-981a5634d03dvendor-name ( RO): NVIDIA Corporationmodel-name ( RO): GRID M60-4Qmax-heads ( RO): 4max-resolution ( RO): 4096x2160uuid ( RO) : 292a2b20-887f-4a13-b310-98a75c53b61fvendor-name ( RO): NVIDIA Corporationmodel-name ( RO): GRID M60-2Qmax-heads ( RO): 4max-resolution ( RO): 4096x2160uuid ( RO) : d377db6b-a068-4a98-92a8-f94bd8d6cc5dvendor-name ( RO): NVIDIA Corporationmodel-name ( RO): GRID M60-0Bmax-heads ( RO): 2max-resolution ( RO): 2560x1600
检查虚拟GPU的分配和库存
注:以下的信息只适宜Stein版本之后及使用libvirt driver。在此版本发布之前或使用Xen驱动程序时,与VGPU资源类相关的库存和分配仍然在与计算节点相关的根资源提供程序上。如果从Rocky进行更新并使用libvirt driver,VGPU库存和分配被移动到代表实际物理gpu的子资源提供程序。
例子中,对于openstack client使用osc-placement plugin,对于更详细的信息参考其文档。
获取resource provider 列表
$ openstack resource provider list
+--------------------------------------+---------------------------------------------------------+------------+
| uuid | name | generation |
+--------------------------------------+---------------------------------------------------------+------------+
| 5958a366-3cad-416a-a2c9-cfbb5a472287 | virtlab606.xxxxxxxxxxxxxxxxxxxxxxxxxxx | 7 |
| fc9b9287-ef5e-4408-aced-d5577560160c | virtlab606.xxxxxxxxxxxxxxxxxxxxxxxxxxx_pci_0000_86_00_0 | 2 |
| e2f8607b-0683-4141-a8af-f5e20682e28c | virtlab606.xxxxxxxxxxxxxxxxxxxxxxxxxxx_pci_0000_85_00_0 | 3 |
| 85dd4837-76f9-41f2-9f19-df386017d8a0 | virtlab606.xxxxxxxxxxxxxxxxxxxxxxxxxxx_pci_0000_87_00_0 | 2 |
| 7033d860-8d8a-4963-8555-0aa902a08653 | virtlab606.xxxxxxxxxxxxxxxxxxxxxxxxxxx_pci_0000_84_00_0 | 2 |
+--------------------------------------+---------------------------------------------------------+------------+
上述例子中可以看到root resource provider是5958a366-3cad-416a-a2c9-cfbb5a472287且拥有4个其他资源provider作为其子资源,且每一个资源回应一个单独的物理GPU。
检查每一个resource provider查看resource classes
openstack resource provider inventory list 5958a366-3cad-416a-a2c9-cfbb5a472287
+----------------+------------------+----------+----------+-----------+----------+-------+
| resource_class | allocation_ratio | max_unit | reserved | step_size | min_unit | total |
+----------------+------------------+----------+----------+-----------+----------+-------+
| VCPU | 16.0 | 48 | 0 | 1 | 1 | 48 |
| MEMORY_MB | 1.5 | 65442 | 512 | 1 | 1 | 65442 |
| DISK_GB | 1.0 | 49 | 0 | 1 | 1 | 49 |
+----------------+------------------+----------+----------+-----------+----------+-------+
$ openstack resource provider inventory list e2f8607b-0683-4141-a8af-f5e20682e28c
+----------------+------------------+----------+----------+-----------+----------+-------+
| resource_class | allocation_ratio | max_unit | reserved | step_size | min_unit | total |
+----------------+------------------+----------+----------+-----------+----------+-------+
| VGPU | 1.0 | 16 | 0 | 1 | 1 | 16 |
+----------------+------------------+----------+----------+-----------+----------+-------+
可以看到VGPU inventory在子资源provider上,其他的资源级别则在root resource provider。
检查使用vGPUs的实例
$ openstack server list
+--------------------------------------+-------+--------+---------------------------------------------------------+--------------------------+--------+
| ID | Name | Status | Networks | Image | Flavor |
+--------------------------------------+-------+--------+---------------------------------------------------------+--------------------------+--------+
| 5294f726-33d5-472a-bef1-9e19bb41626d | vgpu2 | ACTIVE | private=10.0.0.14, fd45:cdad:c431:0:f816:3eff:fe78:a748 | cirros-0.4.0-x86_64-disk | vgpu |
| a6811fc2-cec8-4f1d-baea-e2c6339a9697 | vgpu1 | ACTIVE | private=10.0.0.34, fd45:cdad:c431:0:f816:3eff:fe54:cc8f | cirros-0.4.0-x86_64-disk | vgpu |
+--------------------------------------+-------+--------+---------------------------------------------------------+--------------------------+--------+$ openstack resource provider allocation show 5294f726-33d5-472a-bef1-9e19bb41626d
+--------------------------------------+------------+------------------------------------------------+
| resource_provider | generation | resources |
+--------------------------------------+------------+------------------------------------------------+
| 5958a366-3cad-416a-a2c9-cfbb5a472287 | 8 | {u'VCPU': 1, u'MEMORY_MB': 512, u'DISK_GB': 1} |
| 7033d860-8d8a-4963-8555-0aa902a08653 | 3 | {u'VGPU': 1} |
+--------------------------------------+------------+------------------------------------------------+$ openstack resource provider allocation show a6811fc2-cec8-4f1d-baea-e2c6339a9697
+--------------------------------------+------------+------------------------------------------------+
| resource_provider | generation | resources |
+--------------------------------------+------------+------------------------------------------------+
| e2f8607b-0683-4141-a8af-f5e20682e28c | 3 | {u'VGPU': 1} |
| 5958a366-3cad-416a-a2c9-cfbb5a472287 | 8 | {u'VCPU': 1, u'MEMORY_MB': 512, u'DISK_GB': 1} |
+--------------------------------------+------------+------------------------------------------------+
在本例中,使用请求1个VGPU的样式创建了两个服务器,因此在查看每个消费者UUID(即服务器UUID)的分配时,您可以看到VGPU分配针对子资源提供程序,而其他分配针对根资源提供程序。在这里,这意味着a6811fc2-cec8-4f1d-baea-e2c6339a9697使用的虚拟GPU实际上是由PCI ID为0000:85:00.0的物理GPU提供的。
警告
注:这些信息在Queens版本中被修复。
对于libvirt:
- 挂起一个拥有vGPUs但是由于libvirt限制并未工作的实例(它不支持从实例热插拔mediated devices)。在libvirt获得mdev热拔插支持之前,建议使用其他实例操作(如快照实例或搁置实例)来解决问题。如果用户试图挂起实例,libvirt驱动程序将引发一个异常,导致实例被设置回ACTIVE。os-instance-actions API中的挂起操作将具有一个Error状态。
- 使用具有vGPU资源的新风格调整实例的大小不会将这些vGPU分配给实例(实例是在没有vGPU资源的情况下创建的)。建议的解决方法是在调整实例大小后重新构建实例。重建操作为实例分配vgpu。
- 将实例冷迁移到另一台主机将会遇到与调整大小相同的问题。如果要迁移实例,请确保在迁移后重新构建实例。
- 救援图像不使用vgpu。被抢救的实例在抢救期间不会保留其vgpu。在此期间,另一个实例可以接收这些vgpu。这是一个已知的问题。建议的解决方法是在救援后立即重新构建实例。但是,只有在主机上有其他空闲的vgpu时,重新构建抢救的实例才有帮助。