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:
-
Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:
gcloud initSi utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
- 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.createdel proyecto -
Para usar una imagen personalizada para crear la VM, sigue estos pasos:
compute.images.useReadOnlyen la imagen -
Para usar una captura para crear la VM, sigue estos pasos:
compute.snapshots.useReadOnlyen la captura -
Para usar una plantilla de instancia para crear la VM, haz lo siguiente:
compute.instanceTemplates.useReadOnlyen la plantilla de instancia -
Para especificar una subred para tu VM, haz lo siguiente:
compute.subnetworks.useen 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.useen el proyecto -
Para asignar una dirección IP externa a la VM cuando se usa una red de VPC, haz lo siguiente:
compute.subnetworks.useExternalIpen el proyecto o en la subred elegida -
Para asignar una red antigua a la VM, sigue estos pasos:
compute.networks.useen el proyecto -
Para asignar una dirección IP externa a la VM cuando se usa una red antigua, haz lo siguiente:
compute.networks.useExternalIpen el proyecto -
Para definir los metadatos de la instancia de VM:
compute.instances.setMetadataen el proyecto -
Para definir etiquetas en la VM, haz lo siguiente:
compute.instances.setTagsen la VM -
Para definir etiquetas en la VM, sigue estos pasos:
compute.instances.setLabelsen la VM -
Para definir una cuenta de servicio que use la VM, sigue estos pasos:
compute.instances.setServiceAccounten la VM -
Para crear un disco para la VM, sigue estos pasos:
compute.disks.createen el proyecto -
Para adjuntar un disco en modo de solo lectura o de lectura y escritura, sigue estos pasos:
compute.disks.useen el disco -
Para adjuntar un disco en modo de solo lectura:
compute.disks.useReadOnlyen 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:
- Configura una o varias redes de nube privada virtual (VPC) que tengan un MTU grande.
- 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:
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=8244Crea 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/24Crea reglas de cortafuegos con el comando
firewall-rules create.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/16Crea la regla de cortafuegos
tcp:22para 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_RANGECrea la regla de cortafuegos
icmpque 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
- Para detener la VM, haz lo siguiente:
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
- Para detener la VM, haz lo siguiente:
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 ded,h,mys, respectivamente. Por ejemplo, el valor30mdefine un tiempo de 30 minutos, y el valor1h2m3sdefine 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 ded,h,mys, 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.
- Si tu carga de trabajo requiere que crees la VM en una zona específica, especifica una duración
de entre 90 segundos (
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
- Para detener la VM, haz lo siguiente:
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.
- Si has creado la reserva en el mismo proyecto:
Instalar controladores de GPU
En cada VM A3 Mega, instala los controladores de GPU.
Instala los controladores de la GPU NVIDIA.
sudo cos-extensions install gpu -- --version=latest
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.
- 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
- Configura el módulo
dmabuf. Carga el móduloimport-helper, que forma parte del frameworkdmabuf. 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
- Configura Docker para autenticar las solicitudes a Artifact Registry.
docker-credential-gcr configure-docker --registries us-docker.pkg.dev
- Inicia
RxDMen el contenedor.RxDMes 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 llamadorxdm: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=8Para verificar que
RxDMse 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 deRxDMse 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:
- 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 - Lanza un contenedor específico
nccl-testspara 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_IMAGEque 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:
- Abre un shell de bash interactivo en el contenedor
nccl-tests.docker exec -it nccl bash
- Configura el entorno para una ejecución de varios nodos configurando SSH y generando archivos de host. Sustituye
VM_NAME_1yVM_NAME_2por 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. - Ejecuta la prueba de
all_gather_perfpara 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
Desde el shell bash del contenedor nccl-tests, sigue estos pasos.
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
- Para detener la VM, haz lo siguiente:
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
- Para detener la VM, haz lo siguiente:
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 ded,h,mys, respectivamente. Por ejemplo, el valor30mdefine un tiempo de 30 minutos, y el valor1h2m3sdefine 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 ded,h,mys, 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.
- Si tu carga de trabajo requiere que crees la VM en una zona específica, especifica una duración
de entre 90 segundos (
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
- Para detener la VM, haz lo siguiente:
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.
- Si has creado la reserva en el mismo proyecto:
Dar acceso a las NICs a las GPUs
En cada VM A3 Mega, da a las NICs acceso a las GPUs.
- 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
- Instala y carga el módulo
import-helper, que forma parte del frameworkdmabuf. 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
- 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.devDespués de ejecutar los comandos anteriores, debes cerrar sesión y volver a iniciarla para que los cambios se apliquen.
- Inicia
RxDMen el contenedor.RxDMes 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 llamadorxdm: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=/tmpPara comprobar que
RxDMse 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 deRxDMse 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:
- 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 - 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') - Lanza un contenedor específico
nccl-testspara 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_IMAGEque 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:
- Abre un shell de bash interactivo en el contenedor
nccl-tests.docker exec -it nccl bash
- Configura el entorno para una ejecución de varios nodos configurando SSH y generando archivos de host. Sustituye
VM_NAME_1yVM_NAME_2por 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. - Ejecuta la prueba de
all_gather_perfpara 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
Desde el shell bash del contenedor nccl-tests, sigue estos pasos.
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. Especificaa3-highgpu-8goa3-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. Especificaa3-highgpu-8goa3-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
- Para detener la VM, haz lo siguiente:
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. Especificaa3-highgpu-8goa3-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
- Para detener la VM, haz lo siguiente:
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 ded,h,mys, respectivamente. Por ejemplo, el valor30mdefine un tiempo de 30 minutos, y el valor1h2m3sdefine 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 ded,h,mys, 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.
- Si tu carga de trabajo requiere que crees la VM en una zona específica, especifica una duración
de entre 90 segundos (
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. Especificaa3-highgpu-8goa3-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
- Para detener la VM, haz lo siguiente:
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.
- Si has creado la reserva en el mismo proyecto:
Instalar controladores de GPU
En cada máquina virtual A3 High o Edge, completa los pasos siguientes.
- Instala los controladores de la GPU NVIDIA ejecutando el siguiente comando:
sudo cos-extensions install gpu -- --version=latest
- 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:
- 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
- Si usas Container Registry, ejecuta el siguiente comando:
- 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" - Verifica que el contenedor
receive-datapath-managerse 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...
- Para dejar de ver los registros, pulsa
ctrl-c. - Instala reglas de tabla de IP.
sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
- 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.soylibnccl.sose 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:
- 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
/deven 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_LOCKa las funciones del contenedor. - Monta
/tmpdel host en/tmpdel 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.
- Monta dispositivos NVIDIA de
- 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:- 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
- En una de las máquinas virtuales, ejecuta los siguientes comandos:
- Configura la conexión entre las VMs. Sustituye
VM-0yVM-1por 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/hostfiles2en cada máquina virtual. - Ejecuta la secuencia de comandos.
/scripts/run-allgather.sh 8 eth1,eth2,eth3,eth4 1M 512M 2
- Configura la conexión entre las VMs. Sustituye
El script
run-allgathertarda unos dos minutos en ejecutarse. Al final de los registros, verás losall-gatherresultados.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.
- En cada máquina virtual A3 High o Edge, ejecuta lo siguiente:
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:
Crea tus instancias A3 Mega, A3 High o A3 Edge.
Instala los controladores de la GPU.
Habilita el modo MIG. Para obtener instrucciones, consulta Habilitar MIG.
Configura tus particiones de GPU. Para obtener instrucciones, consulta Trabajar con particiones de GPU.