Este documento ha sido traducido utilizando tecnología de traducción automática. Si bien nos esforzamos por proporcionar traducciones precisas, no ofrecemos garantías sobre la integridad, precisión o confiabilidad del contenido traducido. En caso de discrepancia, la versión original en inglés prevalecerá y constituirá el texto autorizado.

Soporte de vGPU

SUSE Virtualization es capaz de compartir el soporte de GPU NVIDIA para la Virtualización de Entrada/Salida de Raíz Única (SR-IOV). Esta capacidad adicional, que es proporcionada por el complemento controlador-pcidevices, aprovecha sriov-manage para la gestión de GPU.

Para determinar si tu GPU soporta SR-IOV, consulta la documentación del dispositivo. Para más información sobre cómo crear un vGPU de NVIDIA que soporte SR-IOV, consulta la documentación de NVIDIA.

Debes habilitar el complemento nvidia-driver-toolkit para poder gestionar el ciclo de vida de los vGPUs en los dispositivos GPU.

Uso

  1. En la interfaz de usuario, ve a Avanzado → Dispositivos GPU SR-IOV y verifica lo siguiente:

    • Los dispositivos GPU han sido escaneados.

    • Se ha creado un objeto sriovgpudevices.devices.harvesterhci.io asociado.

      sriovgpudevices disabled
  2. Localiza el dispositivo que deseas habilitar y luego selecciona ⋮ → Habilitar.

    sriovgpudevices enabled
  3. Ve a la pantalla de Dispositivos vGPU y comprueba los objetos vgpudevices.devices.harvesterhci.io asociados.

    Permite un tiempo para que el controlador-pcidevices escanee los dispositivos vGPU y para que la interfaz de usuario SUSE Virtualization muestre la información del dispositivo.

    vgpudevicelist
  4. Selecciona un vGPU y configura un perfil.

    vgpuprofiles

    La lista de perfiles depende de la GPU y del árbol /sys subyacente del host. Para más información sobre los perfiles disponibles y sus capacidades, consulta la documentación de NVIDIA.

    Después de seleccionar el primer perfil, el controlador NVIDIA configura automáticamente los perfiles disponibles para los vGPUs restantes.

  5. Adjunta el vGPU a una nueva máquina virtual o a una existente.

    vgpuattachment

    Una vez que un vGPU ha sido asignado a una máquina virtual, puede que no sea posible deshabilitar la máquina virtual hasta que el vGPU sea eliminado.

Dispositivos vGPU respaldados por MIG

La siguiente información se aplica solo a las NVIDIA GPU que soportan la partición basada en GPU de Múltiples Instancias (MIG), como la A100, H100 y H200.

SUSE Virtualization permite compartir vGPUs respaldadas por MIG entre máquinas virtuales. Las vGPUs respaldadas por MIG residen en una instancia de GPU en una GPU física compatible con MIG. Cada vGPU respaldada por MIG tiene acceso exclusivo a los motores de la instancia de GPU, incluidos los motores de computación y de decodificación de video.

SUSE Virtualization crea el objeto MIGConfiguration solo si la GPU detectada admite particionamiento basado en MIG.

Habilitando dispositivos vGPU respaldados por MIG

  1. En la interfaz de usuario de SUSE Virtualization, ve a Configuraciones de → vGPU MIG Avanzadas y verifica lo siguiente:

    • Se ha creado una configuración de MIG para admitir dispositivos GPU.

    • Se ha creado un objeto migconfiguration.devices.harvesterhci.io asociado.

  2. Define los perfiles de MIG para tu GPU y habilita la configuración de MIG.

    Consulta la documentación de la GPU para obtener información sobre la configuración de MIG y las combinaciones disponibles.

    Configuración de MIG de ejemplo
  3. Ve a Dispositivos vGPU Avanzados y habilita el dispositivo vGPU asociado con la configuración de MIG.

    Los nuevos perfiles de MIG creados están disponibles como tipos de vGPU válidos.

Una vez habilitado, el dispositivo vGPU puede ser utilizado con una máquina virtual.

Máquina virtual con vGPU

limitaciones

Adjuntar múltiples vGPUs

Adjuntar múltiples vGPUs a una máquina virtual puede fallar por las siguientes razones:

  • No todos los perfiles de vGPU admiten la conexión de múltiples vGPUs. La documentación de NVIDIA enumera los perfiles de vGPU que admiten esta función. Por ejemplo, si utilizas GPUs NVIDIA A2 o A16, ten en cuenta que solo las vGPUs de la serie Q te permiten adjuntar múltiples vGPUs.

    multiplevgpu
  • Solo 1 dispositivo GPU en la definición de la máquina virtual puede tener ramFB habilitado. Para adjuntar múltiples vGPUs, debes editar la configuración de la VM (en YAML) y añadir virtualGPUOptions a todos los dispositivos vGPU no primarios.

    virtualGPUOptions:
    display:
       ramFB:
         enabled: false

Límite de vGPUs utilizables

Cuando se habilita el soporte de vGPU en una GPU, el controlador NVIDIA crea 16 dispositivos vGPU por defecto. Después de seleccionar el primer perfil, el controlador NVIDIA configura automáticamente los perfiles disponibles para los vGPUs restantes.

El perfil utilizado también dicta el número máximo de vGPUs disponibles para cada GPU. Una vez que se agota el máximo, no se pueden seleccionar perfiles para los vGPUs restantes y esos dispositivos no pueden ser configurados.

Ejemplo (NVIDIA A2 GPU):

Si seleccionas el perfil NVIDIA A2-4Q, solo puedes configurar 4 dispositivos vGPU. Una vez que esos dispositivos están configurados, no puedes seleccionar ningún perfil para los vGPUs restantes.

nvidia a2 example

Análisis técnico en profundidad

pcidevices-controller introduce los siguientes CRD:

  • sriovgpudevices.devices.harvesterhci.io

  • vgpudevices.devices.harvesterhci.io

Al arrancar, pcidevices-controller escanea el host en busca de GPUs NVIDIA que soporten dispositivos vGPU SR-IOV. Cuando se encuentran tales dispositivos, se representan como un CRD.

Ejemplo:

apiVersion: devices.harvesterhci.io/v1beta1
kind: SRIOVGPUDevice
metadata:
  creationTimestamp: "2024-02-21T05:57:37Z"
  generation: 2
  labels:
    nodename: harvester-kgd9c
  name: harvester-kgd9c-000008000
  resourceVersion: "6641619"
  uid: e3a97ee4-046a-48d7-820d-8c6b45cd07da
spec:
  address: "0000:08:00.0"
  enabled: true
  nodeName: harvester-kgd9c
status:
  vGPUDevices:
  - harvester-kgd9c-000008004
  - harvester-kgd9c-000008005
  - harvester-kgd9c-000008016
  - harvester-kgd9c-000008017
  - harvester-kgd9c-000008020
  - harvester-kgd9c-000008021
  - harvester-kgd9c-000008022
  - harvester-kgd9c-000008023
  - harvester-kgd9c-000008006
  - harvester-kgd9c-000008007
  - harvester-kgd9c-000008010
  - harvester-kgd9c-000008011
  - harvester-kgd9c-000008012
  - harvester-kgd9c-000008013
  - harvester-kgd9c-000008014
  - harvester-kgd9c-000008015
  vfAddresses:
  - "0000:08:00.4"
  - "0000:08:00.5"
  - "0000:08:01.6"
  - "0000:08:01.7"
  - "0000:08:02.0"
  - "0000:08:02.1"
  - "0000:08:02.2"
  - "0000:08:02.3"
  - "0000:08:00.6"
  - "0000:08:00.7"
  - "0000:08:01.0"
  - "0000:08:01.1"
  - "0000:08:01.2"
  - "0000:08:01.3"
  - "0000:08:01.4"
  - "0000:08:01.5"

Cuando se habilita un SRIOVGPUDevice, el controlador pcidevices trabaja con el daemonset nvidia-driver-toolkit para gestionar los dispositivos GPU.

En un escaneo posterior del árbol /sys por parte de los pcidevices, los dispositivos vGPU son escaneados por el controlador pcidevices y gestionados como VGPUDevices CRD.

NAME                        ADDRESS        NODE NAME         ENABLED   UUID                                   VGPUTYPE       PARENTGPUDEVICE
harvester-kgd9c-000008004   0000:08:00.4   harvester-kgd9c   true      dd6772a8-7db8-4e96-9a73-f94c389d9bc3   NVIDIA A2-4A   0000:08:00.0
harvester-kgd9c-000008005   0000:08:00.5   harvester-kgd9c   true      9534e04b-4687-412b-833e-3ae95b97d4d1   NVIDIA A2-4Q   0000:08:00.0
harvester-kgd9c-000008006   0000:08:00.6   harvester-kgd9c   true      a16e5966-9f7a-48a9-bda8-0d1670e740f8   NVIDIA A2-4A   0000:08:00.0
harvester-kgd9c-000008007   0000:08:00.7   harvester-kgd9c   true      041ee3ce-f95c-451e-a381-1c9fe71918b2   NVIDIA A2-4Q   0000:08:00.0
harvester-kgd9c-000008010   0000:08:01.0   harvester-kgd9c   false                                                           0000:08:00.0
harvester-kgd9c-000008011   0000:08:01.1   harvester-kgd9c   false                                                           0000:08:00.0
harvester-kgd9c-000008012   0000:08:01.2   harvester-kgd9c   false                                                           0000:08:00.0
harvester-kgd9c-000008013   0000:08:01.3   harvester-kgd9c   false                                                           0000:08:00.0
harvester-kgd9c-000008014   0000:08:01.4   harvester-kgd9c   false                                                           0000:08:00.0
harvester-kgd9c-000008015   0000:08:01.5   harvester-kgd9c   false                                                           0000:08:00.0
harvester-kgd9c-000008016   0000:08:01.6   harvester-kgd9c   false                                                           0000:08:00.0
harvester-kgd9c-000008017   0000:08:01.7   harvester-kgd9c   false                                                           0000:08:00.0
harvester-kgd9c-000008020   0000:08:02.0   harvester-kgd9c   false                                                           0000:08:00.0
harvester-kgd9c-000008021   0000:08:02.1   harvester-kgd9c   false                                                           0000:08:00.0
harvester-kgd9c-000008022   0000:08:02.2   harvester-kgd9c   false                                                           0000:08:00.0
harvester-kgd9c-000008023   0000:08:02.3   harvester-kgd9c   false                                                           0000:08:00.0

Cuando un usuario habilita y selecciona un perfil para el VGPUDevice, el controlador pcidevices configura el dispositivo y establece el perfil correcto en dicho dispositivo.

apiVersion: devices.harvesterhci.io/v1beta1
kind: VGPUDevice
metadata:
  creationTimestamp: "2024-02-26T03:04:47Z"
  generation: 8
  labels:
    harvesterhci.io/parentSRIOVGPUDevice: harvester-kgd9c-000008000
    nodename: harvester-kgd9c
  name: harvester-kgd9c-000008004
  resourceVersion: "21051017"
  uid: b9c7af64-1e47-467f-bf3d-87b7bc3a8911
spec:
  address: "0000:08:00.4"
  enabled: true
  nodeName: harvester-kgd9c
  parentGPUDeviceAddress: "0000:08:00.0"
  vGPUTypeName: NVIDIA A2-4A
status:
  configureVGPUTypeName: NVIDIA A2-4A
  uuid: dd6772a8-7db8-4e96-9a73-f94c389d9bc3
  vGPUStatus: vGPUConfigured

El controlador pcidevices también ejecuta un plugin de dispositivo vGPU, que publicita los detalles de los diversos perfiles vGPU al kubelet. Esto es utilizado luego por el programador de k8s para colocar las VM que solicitan vGPUs en los nodos correctos.

(⎈|local:harvester-system)➜  ~ k get nodes harvester-kgd9c -o yaml | yq .status.allocatable
cpu: "24"
devices.kubevirt.io/kvm: 1k
devices.kubevirt.io/tun: 1k
devices.kubevirt.io/vhost-net: 1k
ephemeral-storage: "149527126718"
hugepages-1Gi: "0"
hugepages-2Mi: "0"
intel.com/82599_ETHERNET_CONTROLLER_VIRTUAL_FUNCTION: "1"
memory: 131858088Ki
nvidia.com/NVIDIA_A2-4A: "2"
nvidia.com/NVIDIA_A2-4C: "0"
nvidia.com/NVIDIA_A2-4Q: "2"
pods: "200"

El controlador pcidevices también configura la integración con kubevirt y anuncia los dispositivos vGPU como dispositivos gestionados externamente en el CR de Kubevirt para asegurar que la VM pueda consumir los vGPU.