Crear una instancia A3 Mega, A3 High o A3 Edge con GPUDirect habilitado

En este documento se describe la configuración de instancias de máquinas virtuales (VMs) A3 Mega, A3 High o A3 Edge que tienen ocho GPUs NVIDIA H100 conectadas y usan una de las siguientes tecnologías GPUDirect: GPUDirect-TCPX o GPUDirect-TCPXO. Para crear una instancia A3 de alto rendimiento con menos de 8 GPUs, consulta Crear una instancia A3 de alto rendimiento o A2.

La tecnología GPUDirect que utilices dependerá del tipo de máquina A3 que selecciones.

  • GPUDirect-TCPXO: es una pila de redes descargada similar a RDMA que se admite en los tipos de máquina A3 Mega (a3-megagpu-8g) que tienen ocho GPUs H100.
  • GPUDirect-TCPX: es una versión optimizada de TCP de invitado que proporciona una latencia más baja y es compatible con los tipos de máquina A3 High (a3-highgpu-8g) y A3 Edge (a3-edgegpu-8g), que tienen ocho GPUs H100.

La serie de máquinas A3 optimizadas para aceleradores tiene 208 vCPUs y hasta 1872 GB de memoria. Los tipos de máquina a3-megagpu-8g, a3-highgpu-8g y a3-edgegpu-8g ofrecen 80 GB de memoria de GPU por GPU. Estos tipos de máquina pueden alcanzar hasta 1800 Gbps de ancho de banda de red, lo que los hace ideales para modelos de lenguaje grandes basados en transformadores, bases de datos y computación de alto rendimiento (HPC).

Tanto GPUDirect-TCPX como GPUDirect-TCPXO usan la tecnología GPUDirect de NVIDIA para aumentar el rendimiento y reducir la latencia de tus máquinas virtuales A3. Para ello, permiten que las cargas útiles de los paquetes de datos se transfieran directamente de la memoria de la GPU a la interfaz de red, sin pasar por la CPU ni la memoria del sistema. Se trata de una forma de acceso directo a memoria remota (RDMA). Si se combinan con la NIC virtual de Google (gVNIC), las máquinas virtuales A3 pueden ofrecer el mayor rendimiento entre las máquinas virtuales de un clúster en comparación con los tipos de máquinas optimizadas para aceleradores A2 o G2 de la generación anterior.

En este documento se describe cómo crear una máquina virtual A3 mega, A3 high o A3 edge y cómo habilitar GPUDirect-TCPX o GPUDirect-TCPXO para probar el rendimiento mejorado de la red de GPU.

Antes de empezar

  • Para consultar las limitaciones y los pasos previos adicionales para crear instancias con GPUs conectadas, como seleccionar una imagen de SO y comprobar la cuota de GPUs, consulta el artículo sobre cómo crear una instancia con GPUs conectadas.
  • Si aún no lo has hecho, configura la autenticación. La autenticación verifica tu identidad para acceder a Google Cloud servicios y APIs. Para ejecutar código o ejemplos desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:
    1. Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

      gcloud init

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    2. Set a default region and zone.

Roles obligatorios

Para obtener los permisos que necesitas para crear VMs, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Administrador de instancias de Compute (v. 1) (roles/compute.instanceAdmin.v1) en el proyecto. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para crear máquinas virtuales. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para crear VMs, se necesitan los siguientes permisos:

  • compute.instances.create del proyecto
  • Para usar una imagen personalizada para crear la VM, sigue estos pasos: compute.images.useReadOnly en la imagen
  • Para usar una captura para crear la VM, sigue estos pasos: compute.snapshots.useReadOnly en la captura
  • Para usar una plantilla de instancia para crear la VM, haz lo siguiente: compute.instanceTemplates.useReadOnly en la plantilla de instancia
  • Para especificar una subred para tu VM, haz lo siguiente: compute.subnetworks.use en el proyecto o en la subred elegida
  • Para especificar una dirección IP estática para la máquina virtual, haz lo siguiente: compute.addresses.use en el proyecto
  • Para asignar una dirección IP externa a la VM cuando se usa una red de VPC, haz lo siguiente: compute.subnetworks.useExternalIp en el proyecto o en la subred elegida
  • Para asignar una red antigua a la VM, sigue estos pasos: compute.networks.use en el proyecto
  • Para asignar una dirección IP externa a la VM cuando se usa una red antigua, haz lo siguiente: compute.networks.useExternalIp en el proyecto
  • Para definir los metadatos de la instancia de VM: compute.instances.setMetadata en el proyecto
  • Para definir etiquetas en la VM, haz lo siguiente: compute.instances.setTags en la VM
  • Para definir etiquetas en la VM, sigue estos pasos: compute.instances.setLabels en la VM
  • Para definir una cuenta de servicio que use la VM, sigue estos pasos: compute.instances.setServiceAccount en la VM
  • Para crear un disco para la VM, sigue estos pasos: compute.disks.create en el proyecto
  • Para adjuntar un disco en modo de solo lectura o de lectura y escritura, sigue estos pasos: compute.disks.use en el disco
  • Para adjuntar un disco en modo de solo lectura: compute.disks.useReadOnly en el disco

También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.

Información general

Para probar el rendimiento de la red con GPUDirect, sigue estos pasos:

  1. Configura una o varias redes de nube privada virtual (VPC) que tengan un MTU grande.
  2. Crea tu instancia de GPU.

Configurar redes de VPC

Para habilitar una comunicación eficiente en tus VMs con GPU, debes crear una red de gestión y una o varias redes de datos. La red de gestión se usa para el acceso externo (por ejemplo, SSH) y para la mayoría de las comunicaciones de red generales. Las redes de datos se usan para la comunicación de alto rendimiento entre las GPUs de diferentes máquinas virtuales, por ejemplo, para el tráfico de acceso directo a memoria remoto (RDMA).

En estas redes de VPC, te recomendamos que asignes un valor más alto a la unidad de transmisión máxima (MTU). Los valores de MTU más altos aumentan el tamaño de los paquetes y reducen la sobrecarga del encabezado de los paquetes, lo que incrementa el rendimiento de los datos de la carga útil. Para obtener más información sobre cómo crear redes de VPC, consulta Crear y verificar una red con MTU de jumbo frame.

Crear una red de gestión, una subred y una regla de cortafuegos

Sigue estos pasos para configurar la red de gestión:

  1. Crea la red de gestión con el comando networks create:

    gcloud compute networks create NETWORK_NAME_PREFIX-mgmt-net \
        --project=PROJECT_ID \
        --subnet-mode=custom \
        --mtu=8244
    
  2. Crea la subred de gestión con el comando networks subnets create:

    gcloud compute networks subnets create NETWORK_NAME_PREFIX-mgmt-sub \
        --project=PROJECT_ID \
        --network=NETWORK_NAME_PREFIX-mgmt-net \
        --region=REGION \
        --range=192.168.0.0/24
    
  3. Crea reglas de cortafuegos con el comando firewall-rules create.

    1. Crea una regla de cortafuegos para la red de gestión.

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-internal \
          --project=PROJECT_ID \
          --network=NETWORK_NAME_PREFIX-mgmt-net \
          --action=ALLOW \
          --rules=tcp:0-65535,udp:0-65535,icmp \
          --source-ranges=192.168.0.0/16
      
    2. Crea la regla de cortafuegos tcp:22 para limitar las direcciones IP de origen que pueden conectarse a tu VM mediante SSH.

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-external-ssh \
          --project=PROJECT_ID \
          --network=NETWORK_NAME_PREFIX-mgmt-net \
          --action=ALLOW \
          --rules=tcp:22 \
          --source-ranges=SSH_SOURCE_IP_RANGE
      
    3. Crea la regla de cortafuegos icmp que se puede usar para comprobar si hay problemas de transmisión de datos en la red.

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-external-ping \
          --project=PROJECT_ID \
          --network=NETWORK_NAME_PREFIX-mgmt-net \
          --action=ALLOW \
          --rules=icmp \
          --source-ranges=0.0.0.0/0
      

Haz los cambios siguientes:

  • NETWORK_NAME_PREFIX: el prefijo de nombre que se usará para las redes y subredes de VPC.
  • PROJECT_ID : tu ID de proyecto.
  • REGION: la región en la que quieras crear las redes.
  • SSH_SOURCE_IP_RANGE: intervalo de IPs en formato CIDR. Especifica qué direcciones IP de origen pueden conectarse a tu VM mediante SSH.

Crear redes de datos, subredes y reglas de cortafuegos

El número de redes de datos varía en función del tipo de máquina con GPU que cree.

A3 Mega

A3 Mega requiere ocho cadenas de datos. Usa el siguiente comando para crear ocho redes de datos, cada una con subredes y reglas de cortafuegos.

for N in $(seq 1 8); do
gcloud compute networks create NETWORK_NAME_PREFIX-data-net-$N \
    --project=PROJECT_ID \
    --subnet-mode=custom \
    --mtu=8244

gcloud compute networks subnets create NETWORK_NAME_PREFIX-data-sub-$N \
    --project=PROJECT_ID \
    --network=NETWORK_NAME_PREFIX-data-net-$N \
    --region=REGION \
    --range=192.168.$N.0/24

gcloud compute firewall-rules create NETWORK_NAME_PREFIX-data-internal-$N \
    --project=PROJECT_ID \
    --network=NETWORK_NAME_PREFIX-data-net-$N \
    --action=ALLOW \
    --rules=tcp:0-65535,udp:0-65535,icmp \
    --source-ranges=192.168.0.0/16
done

A3 High y A3 Edge

A3 High y A3 Edge requieren cuatro redes de datos. Usa el siguiente comando para crear cuatro redes de datos, cada una con subredes y reglas de cortafuegos.

for N in $(seq 1 4); do
gcloud compute networks create NETWORK_NAME_PREFIX-data-net-$N \
    --project=PROJECT_ID \
    --subnet-mode=custom \
    --mtu=8244

gcloud compute networks subnets create NETWORK_NAME_PREFIX-data-sub-$N \
    --project=PROJECT_ID \
    --network=NETWORK_NAME_PREFIX-data-net-$N \
    --region=REGION \
    --range=192.168.$N.0/24

gcloud compute firewall-rules create NETWORK_NAME_PREFIX-data-internal-$N \
    --project=PROJECT_ID \
    --network=NETWORK_NAME_PREFIX-data-net-$N \
    --action=ALLOW \
    --rules=tcp:0-65535,udp:0-65535,icmp \
    --source-ranges=192.168.0.0/16
done

Crear instancias A3 Mega (GPUDirect-TCPXO)

Crea tus instancias A3 Mega con la imagen de Container-Optimized OS cos-121-lts o una posterior, o con la imagen de Rocky Linux rocky-linux-8-optimized-gcp-nvidia-580.

COS

Para probar el rendimiento de la red con GPUDirect-TCPXO, crea al menos dos instancias de VM A3 Mega. Crea cada VM con la imagen de Container-Optimized OS cos-121-lts o una versión posterior y especifica las redes VPC que has creado en el paso anterior.

Las VMs A3 Mega requieren nueve interfaces de red de NIC virtual de Google (gVNIC): una para la red de gestión y ocho para las redes de datos.

En función del modelo de aprovisionamiento que quieras usar para crear tu VM, selecciona una de las siguientes opciones:

Estándar

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address

Haz los cambios siguientes:

  • VM_NAME: el nombre de tu instancia de VM.
  • PROJECT_ID: el ID de tu proyecto.
  • ZONE: una zona que admita tu tipo de máquina.
  • BOOT_DISK_SIZE: el tamaño del disco de arranque en GB. Por ejemplo, 50.
  • NETWORK_NAME_PREFIX: el prefijo de nombre que se va a usar en las redes de VPC y las subredes.

Spot

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=SPOT \
    --instance-termination-action=TERMINATION_ACTION

Haz los cambios siguientes:

  • VM_NAME: el nombre de tu instancia de VM.
  • PROJECT_ID: el ID de tu proyecto.
  • ZONE: una zona que admita tu tipo de máquina.
  • BOOT_DISK_SIZE: el tamaño del disco de arranque en GB. Por ejemplo, 50.
  • NETWORK_NAME_PREFIX: el prefijo de nombre que se va a usar en las redes de VPC y las subredes.
  • TERMINATION_ACTION: si se debe detener o eliminar la VM cuando se interrumpa. Especifica uno de los siguientes valores:
    • Para detener la VM, haz lo siguiente: STOP
    • Para eliminar la VM, haz lo siguiente: DELETE

Inicio flexible

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=FLEX_START \
    --instance-termination-action=TERMINATION_ACTION \
    --max-run-duration=RUN_DURATION \
    --request-valid-for-duration=VALID_FOR_DURATION \
    --reservation-affinity=none

Haz los cambios siguientes:

  • VM_NAME: el nombre de tu instancia de VM.
  • PROJECT_ID: el ID de tu proyecto.
  • ZONE: una zona que admita tu tipo de máquina.
  • BOOT_DISK_SIZE: el tamaño del disco de arranque en GB. Por ejemplo, 50.
  • NETWORK_NAME_PREFIX: prefijo de nombre que se usará para las redes de VPC y las subredes.
  • TERMINATION_ACTION: indica si se debe detener o eliminar la VM al final de su duración. Especifica uno de los siguientes valores:
    • Para detener la VM, haz lo siguiente: STOP
    • Para eliminar la VM, haz lo siguiente: DELETE
  • RUN_DURATION: tiempo máximo que la VM se ejecuta antes de que Compute Engine la detenga o la elimine. Debes dar formato al valor como el número de días, horas, minutos o segundos seguido de d, h, m y s, respectivamente. Por ejemplo, el valor 30m define un tiempo de 30 minutos, y el valor 1h2m3s define un tiempo de una hora, dos minutos y tres segundos. Puedes especificar un valor entre 10 minutos y 7 días.
  • VALID_FOR_DURATION`: tiempo máximo que se espera para aprovisionar los recursos solicitados. Debes dar formato al valor como el número de días, horas, minutos o segundos seguido de d, h, m y s, respectivamente. En función de los requisitos zonales de tu carga de trabajo, especifica una de las siguientes duraciones para aumentar las probabilidades de que se complete tu solicitud de creación de VM:
    • Si tu carga de trabajo requiere que crees la VM en una zona específica, especifica una duración de entre 90 segundos (90s) y dos horas (2h). Cuanto mayor sea la duración, más probabilidades tendrás de obtener recursos.
    • Si la VM puede ejecutarse en cualquier zona de la región, especifica una duración de cero segundos (0s). Este valor indica que Compute Engine solo asigna recursos si están disponibles de inmediato. Si la solicitud de creación falla porque los recursos no están disponibles, vuelve a intentarlo en otra zona.

Con reserva

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=RESERVATION_BOUND \
    --instance-termination-action=TERMINATION_ACTION \
    --reservation-affinity=specific \
    --reservation=RESERVATION_URL

Haz los cambios siguientes:

  • VM_NAME: el nombre de tu instancia de VM.
  • PROJECT_ID: el ID de tu proyecto.
  • ZONE: una zona que admita tu tipo de máquina.
  • BOOT_DISK_SIZE: el tamaño del disco de arranque en GB. Por ejemplo, 50.
  • NETWORK_NAME_PREFIX: prefijo de nombre que se usará para las redes de VPC y las subredes.
  • TERMINATION_ACTION: indica si se debe detener o eliminar la VM al final del periodo de reserva. Especifica uno de los siguientes valores:
    • Para detener la VM, haz lo siguiente: STOP
    • Para eliminar la VM, haz lo siguiente: DELETE
  • RESERVATION_URL: la URL de la reserva que quieres consumir. Especifica uno de los siguientes valores:
    • Si has creado la reserva en el mismo proyecto: RESERVATION_NAME
    • Si la reserva está en otro proyecto y tu proyecto puede usarla: projects/PROJECT_ID/reservations/RESERVATION_NAME.

Instalar controladores de GPU

En cada VM A3 Mega, instala los controladores de GPU.

  1. Instala los controladores de la GPU NVIDIA.

    sudo cos-extensions install gpu -- --version=latest
    
  2. Vuelve a montar la ruta.

    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    

Dar acceso a las NICs a las GPUs

En cada VM A3 Mega, da a las NICs acceso a las GPUs.

  1. Ajusta la configuración del cortafuegos para aceptar todas las conexiones TCP entrantes y habilitar la comunicación entre los nodos de tu clúster:
    sudo /sbin/iptables -I INPUT -p tcp -m tcp -j ACCEPT
  2. Configura el módulo dmabuf. Carga el módulo import-helper, que forma parte del framework dmabuf. Este framework permite compartir memoria a alta velocidad y sin copias entre la GPU y la tarjeta de interfaz de red (NIC), un componente fundamental de la tecnología GPUDirect:
    sudo modprobe import-helper
  3. Configura Docker para autenticar las solicitudes a Artifact Registry.
    docker-credential-gcr configure-docker --registries us-docker.pkg.dev
  4. Inicia RxDM en el contenedor. RxDM es un servicio de gestión que se ejecuta junto con la aplicación de GPU para gestionar la memoria de la GPU. Este servicio preasigna y gestiona la memoria de la GPU para el tráfico de red entrante, que es un elemento clave de la tecnología GPUDirect y esencial para las redes de alto rendimiento. Inicia un contenedor Docker llamado rxdm:
    docker run --pull=always --rm --detach --name rxdm \
        --network=host  --cap-add=NET_ADMIN  \
        --privileged \
        --volume /var/lib/nvidia:/usr/local/nvidia \
        --device /dev/nvidia0:/dev/nvidia0 \
        --device /dev/nvidia1:/dev/nvidia1 \
        --device /dev/nvidia2:/dev/nvidia2 \
        --device /dev/nvidia3:/dev/nvidia3 \
        --device /dev/nvidia4:/dev/nvidia4 \
        --device /dev/nvidia5:/dev/nvidia5 \
        --device /dev/nvidia6:/dev/nvidia6 \
        --device /dev/nvidia7:/dev/nvidia7 \
        --device /dev/nvidia-uvm:/dev/nvidia-uvm \
        --device /dev/nvidiactl:/dev/nvidiactl \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64 \
        us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/tcpgpudmarxd-dev:v1.0.21 \
        --num_hops=2 --num_nics=8

    Para verificar que RxDM se ha iniciado correctamente, ejecuta el comando. Espera a que aparezca el mensaje "Buffer manager initialization complete" (Inicialización del gestor de búferes completada) para confirmar que la inicialización de RxDM se ha realizado correctamente.

    docker container logs --follow  rxdm

    También puedes consultar el registro de finalización de la inicialización de RxDM.

    docker container logs rxdm 2>&1 | grep "Buffer manager initialization complete"

Configurar el entorno de NCCL

En cada VM A3 Mega, siga estos pasos:

  1. Instala la biblioteca nccl-net, un complemento de NCCL que permite la comunicación de GPUDirect a través de la red. El siguiente comando extrae la imagen del instalador e instala los archivos de biblioteca necesarios en /var/lib/tcpxo/lib64/.
    NCCL_NET_IMAGE="us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx-dev:v1.0.15"
    
    docker run --pull=always --rm --privileged \
        --network=host --cap-add=NET_ADMIN \
        --volume /var/lib/nvidia:/usr/local/nvidia  \
        --volume /var/lib:/var/lib \
        --device /dev/nvidia0:/dev/nvidia0   \
        --device /dev/nvidia1:/dev/nvidia1  \
        --device /dev/nvidia2:/dev/nvidia2  \
        --device /dev/nvidia3:/dev/nvidia3  \
        --device /dev/nvidia4:/dev/nvidia4  \
        --device /dev/nvidia5:/dev/nvidia5  \
        --device /dev/nvidia6:/dev/nvidia6  \
        --device /dev/nvidia7:/dev/nvidia7  \
        --device /dev/nvidia-uvm:/dev/nvidia-uvm  \
        --device /dev/nvidiactl:/dev/nvidiactl  \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper  \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/var/lib/tcpxo/lib64 \
        ${NCCL_NET_IMAGE} install  --install-nccl
    
    sudo mount --bind /var/lib/tcpxo /var/lib/tcpxo && sudo mount -o remount,exec /var/lib/tcpxo
    
  2. Lanza un contenedor específico nccl-tests para las pruebas de NCCL. Este contenedor viene preconfigurado con las herramientas y las secuencias de comandos de utilidad necesarias, lo que garantiza un entorno limpio y coherente para verificar el rendimiento de la configuración de GPUDirect.

    Este comando reutiliza la variable NCCL_NET_IMAGE que has definido en el paso anterior.

    docker run --pull=always --rm --detach --name nccl \
        --network=host --cap-add=NET_ADMIN \
        --privileged \
        --volume /var/lib/nvidia:/usr/local/nvidia  \
        --volume /var/lib/tcpxo:/var/lib/tcpxo \
        --shm-size=8g \
        --device /dev/nvidia0:/dev/nvidia0 \
        --device /dev/nvidia1:/dev/nvidia1 \
        --device /dev/nvidia2:/dev/nvidia2 \
        --device /dev/nvidia3:/dev/nvidia3 \
        --device /dev/nvidia4:/dev/nvidia4 \
        --device /dev/nvidia5:/dev/nvidia5 \
        --device /dev/nvidia6:/dev/nvidia6 \
        --device /dev/nvidia7:/dev/nvidia7 \
        --device /dev/nvidia-uvm:/dev/nvidia-uvm \
        --device /dev/nvidiactl:/dev/nvidiactl \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/var/lib/tcpxo/lib64 \
        ${NCCL_NET_IMAGE} daemon

Ejecutar la comparativa nccl-tests

Para ejecutar la prueba de rendimiento de nccl-tests en una sola máquina virtual A3 Mega, sigue estos pasos:

  1. Abre un shell de bash interactivo en el contenedor nccl-tests.
    docker exec -it nccl bash
  2. Desde el shell bash del contenedor nccl-tests, sigue estos pasos.

    1. Configura el entorno para una ejecución de varios nodos configurando SSH y generando archivos de host. Sustituye VM_NAME_1 y VM_NAME_2 por los nombres de cada VM.
      /scripts/init_ssh.sh VM_NAME_1 VM_NAME_2
      /scripts/gen_hostfiles.sh VM_NAME_1 VM_NAME_2
        

      De esta forma, se crea un directorio llamado /scripts/hostfiles2.

    2. Ejecuta la prueba de all_gather_perf para medir el rendimiento de la comunicación colectiva:
      /scripts/run-nccl-tcpxo.sh all_gather_perf "${LD_LIBRARY_PATH}" 8 eth1,eth2,eth3,eth4,eth5,eth6,eth7,eth8 1M 512M 3 2 10 8 2 10

Rocky

Para probar el rendimiento de la red con GPUDirect-TCPXO, crea al menos dos instancias de VM A3 Mega. Crea cada VM con la imagen de rocky-linux-8-optimized-gcp-nvidia-580 o una versión posterior de Rocky Linux y especifica las redes VPC que has creado en el paso anterior.

Las VMs A3 Mega requieren nueve interfaces de red de NIC virtual de Google (gVNIC): una para la red de gestión y ocho para las redes de datos.

En función del modelo de aprovisionamiento que quieras usar para crear tu VM, selecciona una de las siguientes opciones:

Estándar

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=rocky-linux-8-optimized-gcp-nvidia-580 \
    --image-project=rocky-linux-accelerator-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address

Haz los cambios siguientes:

  • VM_NAME: el nombre de tu instancia de VM.
  • PROJECT_ID: el ID de tu proyecto.
  • ZONE: una zona que admita tu tipo de máquina.
  • BOOT_DISK_SIZE: el tamaño del disco de arranque en GB. Por ejemplo, 50.
  • NETWORK_NAME_PREFIX: el prefijo de nombre que se va a usar en las redes de VPC y las subredes.

Spot

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=rocky-linux-8-optimized-gcp-nvidia-580 \
    --image-project=rocky-linux-accelerator-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=SPOT \
    --instance-termination-action=TERMINATION_ACTION

Haz los cambios siguientes:

  • VM_NAME: el nombre de tu instancia de VM.
  • PROJECT_ID: el ID de tu proyecto.
  • ZONE: una zona que admita tu tipo de máquina.
  • BOOT_DISK_SIZE: el tamaño del disco de arranque en GB. Por ejemplo, 50.
  • NETWORK_NAME_PREFIX: el prefijo de nombre que se va a usar en las redes de VPC y las subredes.
  • TERMINATION_ACTION: si se debe detener o eliminar la VM cuando se interrumpa. Especifica uno de los siguientes valores:
    • Para detener la VM, haz lo siguiente: STOP
    • Para eliminar la VM, haz lo siguiente: DELETE

Inicio flexible

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=rocky-linux-8-optimized-gcp-nvidia-580 \
    --image-project=rocky-linux-accelerator-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=FLEX_START \
    --instance-termination-action=TERMINATION_ACTION \
    --max-run-duration=RUN_DURATION \
    --request-valid-for-duration=VALID_FOR_DURATION \
    --reservation-affinity=none

Haz los cambios siguientes:

  • VM_NAME: el nombre de tu instancia de VM.
  • PROJECT_ID: el ID de tu proyecto.
  • ZONE: una zona que admita tu tipo de máquina.
  • BOOT_DISK_SIZE: el tamaño del disco de arranque en GB. Por ejemplo, 50.
  • NETWORK_NAME_PREFIX: prefijo de nombre que se usará para las redes de VPC y las subredes.
  • TERMINATION_ACTION: indica si se debe detener o eliminar la VM al final de su duración. Especifica uno de los siguientes valores:
    • Para detener la VM, haz lo siguiente: STOP
    • Para eliminar la VM, haz lo siguiente: DELETE
  • RUN_DURATION: tiempo máximo que la VM se ejecuta antes de que Compute Engine la detenga o la elimine. Debes dar formato al valor como el número de días, horas, minutos o segundos seguido de d, h, m y s, respectivamente. Por ejemplo, el valor 30m define un tiempo de 30 minutos, y el valor 1h2m3s define un tiempo de una hora, dos minutos y tres segundos. Puedes especificar un valor entre 10 minutos y 7 días.
  • VALID_FOR_DURATION`: tiempo máximo que se espera para aprovisionar los recursos solicitados. Debes dar formato al valor como el número de días, horas, minutos o segundos seguido de d, h, m y s, respectivamente. En función de los requisitos zonales de tu carga de trabajo, especifica una de las siguientes duraciones para aumentar las probabilidades de que se complete tu solicitud de creación de VM:
    • Si tu carga de trabajo requiere que crees la VM en una zona específica, especifica una duración de entre 90 segundos (90s) y dos horas (2h). Cuanto mayor sea la duración, más probabilidades tendrás de obtener recursos.
    • Si la VM puede ejecutarse en cualquier zona de la región, especifica una duración de cero segundos (0s). Este valor indica que Compute Engine solo asigna recursos si están disponibles de inmediato. Si la solicitud de creación falla porque los recursos no están disponibles, vuelve a intentarlo en otra zona.

Con reserva

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=rocky-linux-8-optimized-gcp-nvidia-580 \
    --image-project=rocky-linux-accelerator-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=RESERVATION_BOUND \
    --instance-termination-action=TERMINATION_ACTION \
    --reservation-affinity=specific \
    --reservation=RESERVATION_URL

Haz los cambios siguientes:

  • VM_NAME: el nombre de tu instancia de VM.
  • PROJECT_ID: el ID de tu proyecto.
  • ZONE: una zona que admita tu tipo de máquina.
  • BOOT_DISK_SIZE: el tamaño del disco de arranque en GB. Por ejemplo, 50.
  • NETWORK_NAME_PREFIX: prefijo de nombre que se usará para las redes de VPC y las subredes.
  • TERMINATION_ACTION: indica si se debe detener o eliminar la VM al final del periodo de reserva. Especifica uno de los siguientes valores:
    • Para detener la VM, haz lo siguiente: STOP
    • Para eliminar la VM, haz lo siguiente: DELETE
  • RESERVATION_URL: la URL de la reserva que quieres consumir. Especifica uno de los siguientes valores:
    • Si has creado la reserva en el mismo proyecto: RESERVATION_NAME
    • Si la reserva está en otro proyecto y tu proyecto puede usarla: projects/PROJECT_ID/reservations/RESERVATION_NAME.

Dar acceso a las NICs a las GPUs

En cada VM A3 Mega, da a las NICs acceso a las GPUs.

  1. Instala los paquetes necesarios para el módulo dmabuf:
    sudo dnf -y install epel-release kernel-devel-$(uname -r) git
    sudo dnf -y install dkms
      
  2. Instala y carga el módulo import-helper, que forma parte del framework dmabuf. Este framework permite compartir memoria a alta velocidad y sin copias entre la GPU y la tarjeta de interfaz de red (NIC), un componente fundamental de la tecnología GPUDirect:
    sudo git clone https://github.com/google/dmabuf_importer_helper.git /usr/src/import_helper-1.0
    sudo dkms install import_helper/1.0
    sudo modprobe import_helper
      
  3. Instala y configura Docker para autenticar las solicitudes a Artifact Registry.
    sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
    sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    sudo systemctl --now enable docker
    sudo usermod -a -G docker $(whoami)
    curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
      sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
    export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.17.8-1
    sudo dnf install -y \
          nvidia-container-toolkit-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
          nvidia-container-toolkit-base-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
          libnvidia-container-tools-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
          libnvidia-container1-${NVIDIA_CONTAINER_TOOLKIT_VERSION}
    sudo nvidia-ctk runtime configure --runtime=docker
    sudo systemctl restart docker
    gcloud auth configure-docker us-docker.pkg.dev
      

    Después de ejecutar los comandos anteriores, debes cerrar sesión y volver a iniciarla para que los cambios se apliquen.

  4. Inicia RxDM en el contenedor. RxDM es un servicio de gestión que se ejecuta junto con la aplicación de GPU para gestionar la memoria de la GPU. Este servicio preasigna y gestiona la memoria de la GPU para el tráfico de red entrante, que es un elemento clave de la tecnología GPUDirect y esencial para las redes de alto rendimiento. Inicia un contenedor Docker llamado rxdm:
    docker run --pull=always --rm --detach --name rxdm \
        --network=host  --cap-add=NET_ADMIN  \
        --gpus all \
        --privileged \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper \
        --env LD_LIBRARY_PATH=/usr/lib64  \
        us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/tcpgpudmarxd-dev:v1.0.21 \
        --num_hops=2 --nic_metric_directory=/tmp

    Para comprobar que RxDM se ha iniciado correctamente, ejecuta el siguiente comando. Espera a que aparezca el mensaje "Buffer manager initialization complete" (Inicialización del gestor de búferes completada) para confirmar que la inicialización de RxDM se ha realizado correctamente.

    docker container logs --follow  rxdm

    También puedes consultar el registro de finalización de la inicialización de RxDM.

    docker container logs rxdm 2>&1 | grep "Buffer manager initialization complete"

Configurar el entorno de NCCL

En cada VM A3 Mega, siga estos pasos:

  1. Instala la biblioteca nccl-net, un complemento de NCCL que permite la comunicación de GPUDirect a través de la red. El siguiente comando extrae la imagen del instalador e instala los archivos de biblioteca necesarios en /var/lib/tcpxo/lib64/.
    NCCL_NET_IMAGE="us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx-dev:v1.0.15"
    
    docker run --pull=always --rm --privileged \
        --network=host --cap-add=NET_ADMIN \
        --volume /var/lib:/var/lib \
        --env LD_LIBRARY_PATH=/usr/lib64:/var/lib/tcpxo/lib64 \
        ${NCCL_NET_IMAGE} install  --install-nccl
    
    sudo mount --bind /var/lib/tcpxo /var/lib/tcpxo && sudo mount -o remount,exec /var/lib/tcpxo
    
  2. Configura las marcas de montaje de apertura.
    aperture_mount_flags="";
    while IFS= read -r line; do
        BDF=$( echo "$line" | awk '{print $1}' );
        host_aperture_device="/sys/bus/pci/devices/$BDF"
        # replace '/sys/bus/pci/devices' with '/dev/aperture_devices'
        container_aperture_device="${host_aperture_device/\/sys\/bus\/pci\/devices/\/dev\/aperture_devices}";
        aperture_mount_flags+="--mount type=bind,src=${host_aperture_device},target=${container_aperture_device} ";
    done < <(lspci -nn -D | grep '1ae0:0084')
    
  3. Lanza un contenedor específico nccl-tests para las pruebas de NCCL. Este contenedor viene preconfigurado con las herramientas y las secuencias de comandos de utilidad necesarias, lo que garantiza un entorno limpio y coherente para verificar el rendimiento de la configuración de GPUDirect.

    Este comando reutiliza la variable NCCL_NET_IMAGE que has definido en el paso anterior.

    docker run --pull=always --rm --detach --name nccl \
        --network=host --cap-add=NET_ADMIN \
        --privileged \
        --volume /var/lib/:/var/lib  \
        --shm-size=8g \
        --gpus all \
        $aperture_mount_flags \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper \
        --env LD_LIBRARY_PATH=/usr/lib64:/var/lib/tcpxo/lib64 \
        ${NCCL_NET_IMAGE} daemon

Ejecutar la comparativa nccl-tests

Para ejecutar la prueba de rendimiento de nccl-tests en una sola máquina virtual A3 Mega, sigue estos pasos:

  1. Abre un shell de bash interactivo en el contenedor nccl-tests.
    docker exec -it nccl bash
  2. Desde el shell bash del contenedor nccl-tests, sigue estos pasos.

    1. Configura el entorno para una ejecución de varios nodos configurando SSH y generando archivos de host. Sustituye VM_NAME_1 y VM_NAME_2 por los nombres de cada VM.
      /scripts/init_ssh.sh VM_NAME_1 VM_NAME_2
      /scripts/gen_hostfiles.sh VM_NAME_1 VM_NAME_2
        

      De esta forma, se crea un directorio llamado /scripts/hostfiles2.

    2. Ejecuta la prueba de all_gather_perf para medir el rendimiento de la comunicación colectiva:
      /scripts/run-nccl-tcpxo.sh all_gather_perf "${LD_LIBRARY_PATH}" 8 enp134s0,enp135s0,enp13s0,enp14s0,enp141s0,enp142s0,enp6s0,enp7s0 1M 8G 3 2 10 8 2 10 enp0s12

Crear instancias A3 High y Edge (GPUDirect-TCPX)

Crea tus instancias A3 High y Edge con la imagen de Container-Optimized OS cos-121-lts o una posterior.

COS

Para probar el rendimiento de la red con GPUDirect-TCPX, debes crear al menos dos VMs A3 High o Edge. Crea cada VM con la imagen de SO optimizado para contenedores cos-121-lts o una versión posterior y especifica las redes de VPC que has creado en el paso anterior.

Las VMs deben usar la interfaz de red de NIC virtual de Google (gVNIC). En las máquinas virtuales A3 High o Edge, debes usar la versión 1.4.0rc3 o una posterior del controlador gVNIC. Esta versión del controlador está disponible en Container-Optimized OS. La primera NIC virtual se usa como NIC principal para las redes y el almacenamiento generales, mientras que las otras cuatro NICs virtuales están alineadas con NUMA con dos de las ocho GPUs del mismo conmutador PCIe.

En función del modelo de aprovisionamiento que quieras usar para crear tu VM, selecciona una de las siguientes opciones:

Estándar

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address

Haz los cambios siguientes:

  • VM_NAME: el nombre de tu VM.
  • PROJECT_ID: el ID de tu proyecto.
  • ZONE: una zona que admita tu tipo de máquina.
  • MACHINE_TYPE: el tipo de máquina de la VM. Especifica a3-highgpu-8g o a3-edgegpu-8g.
  • BOOT_DISK_SIZE: el tamaño del disco de arranque en GB. Por ejemplo, 50.
  • NETWORK_NAME_PREFIX: prefijo de nombre que se usará para las redes y subredes de VPC.

Spot

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --provisioning-model=SPOT \
    --instance-termination-action=TERMINATION_ACTION

Haz los cambios siguientes:

  • VM_NAME: el nombre de tu VM.
  • PROJECT_ID: el ID de tu proyecto.
  • ZONE: una zona que admita tu tipo de máquina.
  • MACHINE_TYPE: el tipo de máquina de la VM. Especifica a3-highgpu-8g o a3-edgegpu-8g.
  • BOOT_DISK_SIZE: el tamaño del disco de arranque en GB. Por ejemplo, 50.
  • NETWORK_NAME_PREFIX: prefijo de nombre que se usará para las redes y subredes de VPC.
  • TERMINATION_ACTION: si se debe detener o eliminar la VM cuando se interrumpa. Especifica uno de los siguientes valores:
    • Para detener la VM, haz lo siguiente: STOP
    • Para eliminar la VM, haz lo siguiente: DELETE

Inicio flexible

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --provisioning-model=FLEX_START \
    --instance-termination-action=TERMINATION_ACTION \
    --max-run-duration=RUN_DURATION \
    --request-valid-for-duration=VALID_FOR_DURATION \
    --reservation-affinity=none

Haz los cambios siguientes:

  • VM_NAME: el nombre de tu VM.
  • PROJECT_ID: el ID de tu proyecto.
  • ZONE: una zona que admita tu tipo de máquina.
  • MACHINE_TYPE: el tipo de máquina de la VM. Especifica a3-highgpu-8g o a3-edgegpu-8g.
  • BOOT_DISK_SIZE: el tamaño del disco de arranque en GB. Por ejemplo, 50.
  • NETWORK_NAME_PREFIX: prefijo de nombre que se usará para las redes y subredes de VPC.
  • TERMINATION_ACTION: indica si se debe detener o eliminar la VM al final de su duración. Especifica uno de los siguientes valores:
    • Para detener la VM, haz lo siguiente: STOP
    • Para eliminar la VM, haz lo siguiente: DELETE
  • RUN_DURATION: tiempo máximo que la VM se ejecuta antes de que Compute Engine la detenga o la elimine. Debes dar formato al valor como el número de días, horas, minutos o segundos seguido de d, h, m y s, respectivamente. Por ejemplo, el valor 30m define un tiempo de 30 minutos, y el valor 1h2m3s define un tiempo de una hora, dos minutos y tres segundos. Puedes especificar un valor entre 10 minutos y 7 días.
  • VALID_FOR_DURATION`: tiempo máximo que se espera para aprovisionar los recursos solicitados. Debes dar formato al valor como el número de días, horas, minutos o segundos seguido de d, h, m y s, respectivamente. En función de los requisitos zonales de tu carga de trabajo, especifica una de las siguientes duraciones para aumentar las probabilidades de que se complete tu solicitud de creación de VM:
    • Si tu carga de trabajo requiere que crees la VM en una zona específica, especifica una duración de entre 90 segundos (90s) y dos horas (2h). Cuanto mayor sea la duración, más probabilidades tendrás de obtener recursos.
    • Si la VM puede ejecutarse en cualquier zona de la región, especifica una duración de cero segundos (0s). Este valor indica que Compute Engine solo asigna recursos si están disponibles de inmediato. Si la solicitud de creación falla porque los recursos no están disponibles, vuelve a intentarlo en otra zona.

Con reserva

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --metadata=cos-update-strategy=update_disabled \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address \
    --provisioning-model=RESERVATION_BOUND \
    --instance-termination-action=TERMINATION_ACTION \
    --reservation-affinity=specific \
    --reservation=RESERVATION_URL

Haz los cambios siguientes:

  • VM_NAME: el nombre de tu VM.
  • PROJECT_ID: el ID de tu proyecto.
  • ZONE: una zona que admita tu tipo de máquina.
  • MACHINE_TYPE: el tipo de máquina de la VM. Especifica a3-highgpu-8g o a3-edgegpu-8g.
  • BOOT_DISK_SIZE: el tamaño del disco de arranque en GB. Por ejemplo, 50.
  • NETWORK_NAME_PREFIX: prefijo de nombre que se usará para las redes y subredes de VPC.
  • TERMINATION_ACTION: indica si se debe detener o eliminar la VM al final del periodo de reserva. Especifica uno de los siguientes valores:
    • Para detener la VM, haz lo siguiente: STOP
    • Para eliminar la VM, haz lo siguiente: DELETE
  • RESERVATION_URL: la URL de la reserva que quieres consumir. Especifica uno de los siguientes valores:
    • Si has creado la reserva en el mismo proyecto: example-reservation
    • Si la reserva está en otro proyecto y tu proyecto puede usarla: projects/PROJECT_ID/reservations/example-reservation.

Instalar controladores de GPU

En cada máquina virtual A3 High o Edge, completa los pasos siguientes.

  1. Instala los controladores de la GPU NVIDIA ejecutando el siguiente comando:
    sudo cos-extensions install gpu -- --version=latest
  2. Vuelve a montar la ruta ejecutando el siguiente comando:
    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia

Dar acceso a las NICs a las GPUs

En cada VM A3 High o Edge, da acceso a las GPUs a las NICs siguiendo estos pasos:

  1. Configura el registro.
    • Si usas Container Registry, ejecuta el siguiente comando:
      docker-credential-gcr configure-docker
    • Si usas Artifact Registry, ejecuta el siguiente comando:
      docker-credential-gcr configure-docker --registries us-docker.pkg.dev
  2. Configura el gestor de rutas de datos de recepción. Un servicio de gestión, GPUDirect - TCPX Receive Data Path Manager, debe ejecutarse junto con las aplicaciones que usan GPUDirect - TCPX. Para iniciar el servicio en cada máquina virtual de Container-Optimized OS, ejecuta el siguiente comando:
    docker run --pull=always --rm \
        --name receive-datapath-manager \
        --detach \
        --privileged \
        --cap-add=NET_ADMIN --network=host \
        --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
        --device /dev/nvidia0:/dev/nvidia0 \
        --device /dev/nvidia1:/dev/nvidia1 \
        --device /dev/nvidia2:/dev/nvidia2 \
        --device /dev/nvidia3:/dev/nvidia3 \
        --device /dev/nvidia4:/dev/nvidia4 \
        --device /dev/nvidia5:/dev/nvidia5 \
        --device /dev/nvidia6:/dev/nvidia6 \
        --device /dev/nvidia7:/dev/nvidia7 \
        --device /dev/nvidia-uvm:/dev/nvidia-uvm \
        --device /dev/nvidiactl:/dev/nvidiactl \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64 \
        --volume /run/tcpx:/run/tcpx \
        --entrypoint /tcpgpudmarxd/build/app/tcpgpudmarxd \
        us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd \
        --gpu_nic_preset a3vm --gpu_shmem_type fd --uds_path "/run/tcpx" --setup_param "--verbose 128 2 0"
       
  3. Verifica que el contenedor receive-datapath-manager se ha iniciado.
    docker container logs --follow receive-datapath-manager

    La salida debería ser similar a la siguiente:

    I0000 00:00:1687813309.406064       1 rx_rule_manager.cc:174] Rx Rule Manager server(s) started...
  4. Para dejar de ver los registros, pulsa ctrl-c.
  5. Instala reglas de tabla de IP.
    sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
  6. Configura la biblioteca de comunicaciones colectivas de NVIDIA (NCCL) y el complemento GPUDirect-TCPX.

    Para usar NCCL con compatibilidad con GPUDirect-TCPX, se necesita una combinación específica de la versión de la biblioteca NCCL y el complemento binario de GPUDirect-TCPX. Google Cloud has proporcionado paquetes que cumplen este requisito.

    Para instalar el paquete Google Cloud , ejecuta el siguiente comando:

    docker run --rm -v /var/lib:/var/lib us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx install --install-nccl
    sudo mount --bind /var/lib/tcpx /var/lib/tcpx
    sudo mount -o remount,exec /var/lib/tcpx

    Si este comando se ejecuta correctamente, los archivos libnccl-net.so y libnccl.so se colocarán en el directorio /var/lib/tcpx/lib64.

Ejecutar pruebas

En cada máquina virtual A3 High o Edge, ejecuta una prueba de NCCL siguiendo estos pasos:

  1. Inicia el contenedor.
    #!/bin/bash
    
    function run_tcpx_container() {
    docker run \
       -u 0 --network=host \
       --cap-add=IPC_LOCK \
       --userns=host \
       --volume /run/tcpx:/tmp \
       --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
       --volume /var/lib/tcpx/lib64:/usr/local/tcpx/lib64 \
       --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 \
       --device /dev/nvidia0:/dev/nvidia0 \
       --device /dev/nvidia1:/dev/nvidia1 \
       --device /dev/nvidia2:/dev/nvidia2 \
       --device /dev/nvidia3:/dev/nvidia3 \
       --device /dev/nvidia4:/dev/nvidia4 \
       --device /dev/nvidia5:/dev/nvidia5 \
       --device /dev/nvidia6:/dev/nvidia6 \
       --device /dev/nvidia7:/dev/nvidia7 \
       --device /dev/nvidia-uvm:/dev/nvidia-uvm \
       --device /dev/nvidiactl:/dev/nvidiactl \
       --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/usr/local/tcpx/lib64 \
       "$@"
    }
    

    El comando anterior hace lo siguiente:

    • Monta dispositivos NVIDIA de /dev en el contenedor.
    • Define el espacio de nombres de red del contenedor en el host.
    • Define el espacio de nombres de usuario del contenedor como host.
    • Añade CAP_IPC_LOCK a las funciones del contenedor.
    • Monta /tmp del host en /tmp del contenedor.
    • Monta la ruta de instalación del complemento NCCL y GPUDirect-TCPX NCCL en el contenedor y añade la ruta montada a LD_LIBRARY_PATH.
  2. Una vez que hayas iniciado el contenedor, las aplicaciones que usen NCCL se podrán ejecutar desde dentro del contenedor. Por ejemplo, para ejecutar la prueba run-allgather, sigue estos pasos:
    1. En cada máquina virtual A3 High o Edge, ejecuta lo siguiente:
      $ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
    2. En una de las máquinas virtuales, ejecuta los siguientes comandos:
      1. Configura la conexión entre las VMs. Sustituye VM-0 y VM-1 por los nombres de cada VM.
        /scripts/init_ssh.sh VM-0 VM-1
        pushd /scripts && /scripts/gen_hostfiles.sh VM-0 VM-1; popd

        De esta forma, se crea un directorio /scripts/hostfiles2 en cada máquina virtual.

      2. Ejecuta la secuencia de comandos.
        /scripts/run-allgather.sh 8 eth1,eth2,eth3,eth4 1M 512M 2

    El script run-allgather tarda unos dos minutos en ejecutarse. Al final de los registros, verás los all-gather resultados.

    Si ves la siguiente línea en los registros de NCCL, significa que GPUDirect-TCPX se ha inicializado correctamente.

    NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.
    

GPU con varias instancias

Una GPU con varias instancias divide una única GPU NVIDIA H100 en la misma VM en hasta siete instancias de GPU independientes. Se ejecutan simultáneamente y cada una tiene su propia memoria, caché y multiprocesadores de streaming. Esta configuración permite que la GPU NVIDIA H100 ofrezca una calidad de servicio (QoS) constante con una utilización hasta 7 veces mayor que los modelos de GPU anteriores.

Puedes crear hasta siete GPUs multiinstancia. Con las GPUs H100 de 80 GB, cada GPU de varias instancias tiene asignados 10 GB de memoria.

Para obtener más información sobre el uso de GPUs multiinstancia, consulta la guía del usuario de GPUs multiinstancia de NVIDIA.

Para crear GPUs multiinstancia, sigue estos pasos:

  1. Crea tus instancias A3 Mega, A3 High o A3 Edge.

  2. Instala los controladores de la GPU.

  3. Habilita el modo MIG. Para obtener instrucciones, consulta Habilitar MIG.

  4. Configura tus particiones de GPU. Para obtener instrucciones, consulta Trabajar con particiones de GPU.