Support virtual GPU resources
Add spec to support virtual GPU resources. Change-Id: I103da607c70d6097988fec5329819e5e89f8b4b7 Blueprint: add-support-for-vgpu
This commit is contained in:
370
specs/queens/approved/virt-add-support-for-vgpu.rst
Normal file
370
specs/queens/approved/virt-add-support-for-vgpu.rst
Normal file
@@ -0,0 +1,370 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
=============================
|
||||||
|
Support virtual GPU resources
|
||||||
|
=============================
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/nova/+spec/add-support-for-vgpu
|
||||||
|
|
||||||
|
Add support for virtual GPU (vGPU) resources.
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
With some graphics virtualization solutions e.g. `Intel's GVT-g`_ and
|
||||||
|
`NVIDIA GRID vGPU`_, a single physical Graphics Processing Unit (pGPU)
|
||||||
|
can be virtualized as multiple virtual Graphics Processing Units (vGPU).
|
||||||
|
Some hypervisors support to boot VMs with vGPU to accelerate graphics
|
||||||
|
processing. But presently Nova can't support vGPU.
|
||||||
|
|
||||||
|
The compute node may have one or multiple pGPUs and each pGPU could support
|
||||||
|
multiple vGPUs. Some pGPUs (e.g. NVIDIA GRID K1) support several different
|
||||||
|
vGPU types and each vGPU type has a fixed amount of frame buffer, number of
|
||||||
|
supported display heads and maximum resolutions and are targeted at different
|
||||||
|
classes of workload. Due to their different resource requirements, the maximum
|
||||||
|
number of vGPUs that can be created simultaneously on a pGPU varies
|
||||||
|
according to the vGPU type.
|
||||||
|
|
||||||
|
The following are examples for different vGPU types:
|
||||||
|
|
||||||
|
.. rubric:: Example 1: vGPUs on NVIDIA GRID K1
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
+----------------+---------------------------------------+
|
||||||
|
| Card Type | NVIDIA GRID K1 |
|
||||||
|
+----------------+---------------------------------------+
|
||||||
|
| No. of pGPUs | 4 |
|
||||||
|
+----------------+---------------------------------------+
|
||||||
|
| FB size (MB) | 4096 | 2048 | 1024 | 512 | 256 |
|
||||||
|
+----------------+-------+-------+-------+-------+-------+
|
||||||
|
| Max heads | 4 | 4 | 2 | 2 | 2 |
|
||||||
|
+----------------+-------+-------+-------+-------+-------+
|
||||||
|
| vGPU model | K180Q | K160Q | K140Q | K120Q | K100 |
|
||||||
|
+----------------+-----------------------+---------------+
|
||||||
|
| Max Resolution | 2560x1600 | 1920×1200 |
|
||||||
|
+----------------+-----------------------+---------------+
|
||||||
|
| vGPUs per GPU | 1 | 2 | 4 | 8 | 8 |
|
||||||
|
+----------------+-------+-------+-------+-------+-------+
|
||||||
|
|
||||||
|
.. rubric:: Example 2: Intel GVT-g vGPUs on Intel(R) Xeon(R) CPU E3-1285 v4
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
+----------------+------------------------------------+
|
||||||
|
| pGPU model | Iris Pro Graphics P6300 |
|
||||||
|
+----------------+------------------------------------+
|
||||||
|
| vGPU model | Intel GVT-g |
|
||||||
|
+----------------+------------------------------------+
|
||||||
|
|Framebuffer size| 128 MB |
|
||||||
|
+----------------+------------------------------------+
|
||||||
|
| Max heads | 1 |
|
||||||
|
+----------------+------------------------------------+
|
||||||
|
| Max Resolution | 1920x1080 |
|
||||||
|
+----------------+------------------------------------+
|
||||||
|
| No. of vGPUs | |
|
||||||
|
| per GPU | 7 |
|
||||||
|
+----------------+------------------------------------+
|
||||||
|
|
||||||
|
In this spec, we will define a model to track vGPU resources.
|
||||||
|
|
||||||
|
Use Cases
|
||||||
|
----------
|
||||||
|
|
||||||
|
* As a cloud administrator, I should be able to define flavors which request
|
||||||
|
an amount of vGPU resources.
|
||||||
|
|
||||||
|
* As a cloud administrator, I should be able to specify the supported display
|
||||||
|
heads number and resolutions for vGPUs defined in the flavors; end users can
|
||||||
|
choose a proper flavor with the expected performance.
|
||||||
|
|
||||||
|
* As a cloud administrator, I should be able to define flavors which request
|
||||||
|
vGPUs that support some special features e.g. `OpenGL`_ to achieve
|
||||||
|
hardware-accelerated rendering.
|
||||||
|
|
||||||
|
* As an end user, I should be allowed to boot VMs which have vGPUs by using
|
||||||
|
the pre-defined flavor.
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Define resource tracking model for vGPU: There are both **quantitative**
|
||||||
|
and **qualitative** aspects need to be tracked for vGPU resources:
|
||||||
|
|
||||||
|
* Tracking **quantitative** aspects of the vGPU resource:
|
||||||
|
|
||||||
|
* Define a new standard resource class `resource-classes`_ to track the
|
||||||
|
amount of vGPUs (``ResourceClass.VGPU``) and define another resource
|
||||||
|
class (``ResourceClass.VGPU_DISPLAY_HEAD``) to track the display
|
||||||
|
heads in the resource providers.
|
||||||
|
|
||||||
|
* Generate the resource provider(RP) tree to track the amount of vGPUs
|
||||||
|
available and the number of vGPU display heads.
|
||||||
|
The resource tracking model is as the following::
|
||||||
|
|
||||||
|
resource provider: compute_node
|
||||||
|
/ | \
|
||||||
|
resource provider: RP_1 RP_2 ... RP_n
|
||||||
|
/ | \
|
||||||
|
inventory: vGPU_inv_1 vGPU_inv_2 ... vGPU_inv_n
|
||||||
|
DIS_HEAD_inv_1 DIS_HEAD_inv_2 ... DIS_HEAD_inv_n
|
||||||
|
|
||||||
|
In virt driver (in the function of ``get_inventory()``), it would ask
|
||||||
|
the hypervisor to get the existing pGPUs, their capacity for vGPUs and
|
||||||
|
the number of vGPU display heads. Note: if the hypervisor doesn't return
|
||||||
|
the number of display heads, then the VGPU_DISPLAY_HEAD inventory record
|
||||||
|
should not be created.
|
||||||
|
With the inventory data, virt driver makes resource providers for each
|
||||||
|
pGPU or each pGPU group (depend on how the pGPUs are managed by
|
||||||
|
hypervisors). These resource providers will be associated as the
|
||||||
|
compute_node's children `nested-resource-providers`_.
|
||||||
|
|
||||||
|
* *RP for GPU*: For example, libvirt will report the available vGPU
|
||||||
|
number for each pGPU. In this way, if there are multiple pGPUs (same
|
||||||
|
model), it can create one type of vGPUs on a pGPU and create other
|
||||||
|
types of vGPUs on the remaining pGPUs.
|
||||||
|
|
||||||
|
* *RP for pGPU group*: XenServer uses pGPU groups to manage pGPUs. A
|
||||||
|
pGPU group is a collection of pGPUs which belong to the same model.
|
||||||
|
On creating vGPU, it will search the target group for a GPU which can
|
||||||
|
supply the requested vGPU. In another word, **it is not possible to
|
||||||
|
specify which pGPU the vGPU to be created on**. So XenAPI (the virt
|
||||||
|
of XenServer) should make RP for each pGPU group. And the amount of
|
||||||
|
in the inventory should be total number of vGPUs which can be supplied
|
||||||
|
by pGPUs belong the group.
|
||||||
|
|
||||||
|
As described above, some pGPUs (e.g. NVIDIA GRID K1) support different
|
||||||
|
sized vGPU types. The capacity for different vGPU types varies. In order
|
||||||
|
to make resource tracking easier, we need to make sure the number of the
|
||||||
|
vGPU is predictable. So we will add a new whitelist in nova.conf to
|
||||||
|
specify the enabled vGPU types to ensure each resource provider of vGPUs
|
||||||
|
only has one type of vGPUs. The whitelist is defined as the following::
|
||||||
|
|
||||||
|
enabled_vgpu_types = [ str_vgpu_type_1, str_vgpu_type_2, ... ]
|
||||||
|
|
||||||
|
Note: the str_vgpu_type_x is a string representing a vGPU type. Different
|
||||||
|
hypervisors may expose the vGPU types with different strings. The virt
|
||||||
|
driver should handle that properly and map the whitelist to the correct
|
||||||
|
vGPUs types.
|
||||||
|
|
||||||
|
For example, NVIDIA's vGPU type M60-0B is exposed with the type id:
|
||||||
|
"nvidia-11" in libvirt; but that's exposed in XenServer with the type name:
|
||||||
|
"GRID M60-0B". If we want to enable this vGPU type::
|
||||||
|
|
||||||
|
* the whitelist when libvirt is the hypervisor should be:
|
||||||
|
|
||||||
|
enabled_vgpu_types = [ "nvidia-11" ]
|
||||||
|
|
||||||
|
* the whitelist when XenServer is the hypervisor should be:
|
||||||
|
|
||||||
|
enabled_vgpu_types = [ "GRID M60-0B" ]
|
||||||
|
|
||||||
|
The vGPU resource number should be 8 (4 GPU per card * 2 vGPU per GPU);
|
||||||
|
The display heads's total number is 32 (4 heads per vGPU * 8 vGPUs).
|
||||||
|
And the inventory data for the resource provider for vGPUs should be as::
|
||||||
|
|
||||||
|
{
|
||||||
|
obj_fields.ResourceClass.vGPU: {
|
||||||
|
"total": 8,
|
||||||
|
"reserved": 0,
|
||||||
|
"min_unit": 1,
|
||||||
|
"max_unit": 1,
|
||||||
|
"step_size": 1,
|
||||||
|
"allocation_ratio": 1.0
|
||||||
|
},
|
||||||
|
obj_fields.ResourceClass.GPU_DISPLAY_HEADS: {
|
||||||
|
"total":32,
|
||||||
|
"reserved": 0,
|
||||||
|
"min_unit": 4,
|
||||||
|
"max_unit": 4,
|
||||||
|
"step_size": 4,
|
||||||
|
"allocation_ratio": 1.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
* Tracking **qualitative** aspects of the vGPU resources:
|
||||||
|
The feature of traits is targeted to support representing *qualitative*
|
||||||
|
aspects for resources to differentiate their characteristics(`os-traits`_)
|
||||||
|
GPUs also have different characteristics: e.g. the maximum resolutions,
|
||||||
|
supported features.
|
||||||
|
We need define traits for GPUs. In virt driver (in the function of
|
||||||
|
``get_inventory()``), it should query for the **qualitative** aspects of
|
||||||
|
the vGPU resources; map them to the defined traits and associate these
|
||||||
|
traits to the resource providers.
|
||||||
|
|
||||||
|
* Define traits in os-traits
|
||||||
|
Note: `_gpu-traits` the following two trait types for vGPU have already
|
||||||
|
be merged to os-traits.
|
||||||
|
|
||||||
|
* `supported-resolutions`_
|
||||||
|
|
||||||
|
* `supported-features`_
|
||||||
|
|
||||||
|
# Define flavor: allow the cloud administrator to create different flavors
|
||||||
|
to specify the required amount of vGPU and/or a set of required traits to
|
||||||
|
meet different users' demands.
|
||||||
|
|
||||||
|
# Scheduler: Basing on the amount of vGPU and the required traits, the resource
|
||||||
|
providers which can meet the conditions will be filtered out.
|
||||||
|
|
||||||
|
# At spawning an instance, the virt drivers should retrieve the vGPU
|
||||||
|
resource specs from the instance request specs and map them to the proper
|
||||||
|
information (e.g. the GPU group in XenAPI) which is needed to create a vGPU;
|
||||||
|
then create and/or associating vGPU to the instance.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
* It has been attempted to support vGPU by creating fake SRIOV-VF PCIs for
|
||||||
|
vGPUs and then passthrough PCI devices `vGPU-passthrough-PCI`_. But there is
|
||||||
|
problem to populate the fake PCI's address. And it can't reflect the real
|
||||||
|
situation that some vGPUs are not really PCI devices.
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
No particular data model changes needed, but it depends on the data model
|
||||||
|
defined in `custom-resource-classes`_ and `nested-resource-providers`_.
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Notifications impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
In order to enable the vGPU feature:
|
||||||
|
|
||||||
|
* the operators should change the nova configure settings to enable the vGPU
|
||||||
|
type for each pGPU model which will provide vGPU capabilites.
|
||||||
|
|
||||||
|
* the operators should create new or update existing flavors to specify the
|
||||||
|
amount of vGPU to be requested, the expected amount of display heads, and
|
||||||
|
other expected traits (e.g. the dispaly resolutions, features), so that users
|
||||||
|
can use different flavor to request vGPUs basing on their graphics processing
|
||||||
|
demands.
|
||||||
|
|
||||||
|
* for rolling upgrads, the operators should create or update flavors requesting
|
||||||
|
vGPU after they rolled out all of their nodes into release where this spec
|
||||||
|
got implemented.
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
jianghuaw
|
||||||
|
|
||||||
|
Other contributors:
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
# Define standard traits into os-traits for GPUs;
|
||||||
|
# In virt driver, add code to:
|
||||||
|
|
||||||
|
* add whitelist for enabled vGPU types in the config file
|
||||||
|
* query needed data for enabled vGPU types
|
||||||
|
* generate the nested resource providers
|
||||||
|
* generate the inventory data in resource providers
|
||||||
|
* mapping GPU characteristics to the traits defined in os-traits
|
||||||
|
* associate these traits to the resource providers
|
||||||
|
* mapping traits in the boot request spec to the required metadata
|
||||||
|
* create or/and attach vGPU to the instance basing on the metadata
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
This spec depends on the following specs to be implemented:
|
||||||
|
|
||||||
|
* custom-resource-classes-pike: https://blueprints.launchpad.net/nova/+spec/custom-resource-classes-pike
|
||||||
|
|
||||||
|
* nested-resource-providers: https://specs.openstack.org/openstack/nova-specs/specs/ocata/approved/nested-resource-providers.html
|
||||||
|
|
||||||
|
* resource-provider-traits: https://specs.openstack.org/openstack/nova-specs/specs/pike/approved/resource-provider-traits.html
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
* Unit tests.
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
Need document the configuration for vGPU.
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. _Intel's GVT-g: https://01.org/igvt-g
|
||||||
|
|
||||||
|
.. _NVIDIA GRID vGPU: http://images.nvidia.com/content/grid/pdf/GRID-vGPU-User-Guide.pdf
|
||||||
|
|
||||||
|
.. _resource-classes: http://specs.openstack.org/openstack/nova-specs/specs/mitaka/implemented/resource-classes.html
|
||||||
|
|
||||||
|
.. _custom-resource-classes: https://blueprints.launchpad.net/nova/+spec/custom-resource-classes
|
||||||
|
|
||||||
|
.. _resource-provider: https://specs.openstack.org/openstack/nova-specs/specs/mitaka/approved/resource-providers.html
|
||||||
|
|
||||||
|
.. _resource-provider-traits: https://specs.openstack.org/openstack/nova-specs/specs/pike/approved/resource-provider-traits.html
|
||||||
|
|
||||||
|
|
||||||
|
.. _Resource-providers-scheduler: https://blueprints.launchpad.net/nova/+spec/resource-providers-scheduler-db-filters
|
||||||
|
|
||||||
|
.. _nested-resource-providers: https://specs.openstack.org/openstack/nova-specs/specs/ocata/approved/nested-resource-providers.html
|
||||||
|
|
||||||
|
.. _OpenGL: https://en.wikipedia.org/wiki/OpenGL
|
||||||
|
|
||||||
|
.. _vGPU-passthrough-PCI: https://review.openstack.org/#/c/280099/17
|
||||||
|
|
||||||
|
.. _os-traits: http://docs.openstack.org/developer/os-traits
|
||||||
|
|
||||||
|
.. _gpu-traits: https://github.com/openstack/os-traits/tree/master/os_traits/hw/gpu
|
||||||
|
|
||||||
|
.. _supported-resolutions: https://github.com/openstack/os-traits/blob/master/os_traits/hw/gpu/resolution.py
|
||||||
|
|
||||||
|
.. _supported-features: https://github.com/openstack/os-traits/blob/master/os_traits/hw/gpu/api.py
|
||||||
|
|
||||||
|
History
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. list-table:: Revisions
|
||||||
|
:header-rows: 1
|
||||||
|
|
||||||
|
* - Release Name
|
||||||
|
- Description
|
||||||
|
* - Queens
|
||||||
|
- Introduced
|
||||||
|
|
||||||
Reference in New Issue
Block a user