Optimiza el rendimiento de las GPU

Puedes usar las siguientes opciones para mejorar el rendimiento de las GPU en instancias de máquina virtual (VM):

Inhabilita la mejora automática

Cuando usas la función de mejora automática con las GPU NVIDIA® K80, el sistema ajusta la velocidad del reloj de forma automática a fin de encontrar la tasa óptima para una aplicación determinada. Sin embargo, ajustar la velocidad del reloj todo el tiempo también puede provocar una reducción en el rendimiento de tus GPU. Para obtener más información sobre la mejora automática, consulta la página sobre cómo aumentar el rendimiento con la mejora de GPU y la mejora automática de K80.

Se recomienda que inhabilites la mejora automática cuando ejecutes GPU NVIDIA® Tesla® K80 en Compute Engine.

Para inhabilitar la mejora automática en instancias con GPU NVIDIA® K80 adjuntas, ejecuta el siguiente comando:

sudo nvidia-smi --auto-boost-default=DISABLED

El resultado es similar al siguiente:

All done.

Establece la velocidad del reloj de la GPU en la frecuencia máxima

Para establecer la velocidad del reloj de la GPU en la frecuencia máxima en instancias con GPU NVIDIA® K80 adjuntas, ejecuta el siguiente comando:

sudo nvidia-smi --applications-clocks=2505,875

Usa anchos de banda de red de hasta 100 Gbps

Crea VM que usen anchos de banda más altos

Puedes usar anchos de banda de red más altos para mejorar el rendimiento de las cargas de trabajo distribuidas en VM que se ejecutan en Compute Engine que usan GPU NVIDIA® A100, T4 o V100.

Si deseas obtener más información sobre los anchos de banda de red admitidos para tus instancias de GPU, consulta Anchos de banda de red y GPU.

Para crear una VM con GPU adjuntas y un ancho de banda de red de hasta 100 Gbps, haz lo siguiente:

  1. Revisa la configuración mínima de CPU, GPU y memoria necesaria para obtener el ancho de banda máximo disponible.
  2. Crea tu VM con las GPU A100, T4, o V100 adjuntas, consulta Crea VM con GPU adjuntas. Esta VM de GPU también debe tener la siguiente configuración:

    Como alternativa, puedes crear una VM con cualquier imagen compatible con GPU del proyecto de imagen de VM de aprendizaje profundo (DLVM). Todas las imágenes DLVM compatibles con GPU tienen el controlador de GPU, el software de AA y gVNIC preinstalados. Para obtener una lista de imágenes de DLVM, consulta Elige una imagen.

    Ejemplo

    Por ejemplo, para crear una VM que tenga un ancho de banda máximo de 100 Gbps, ocho GPU V100 conectadas y use la imagen DLVM tf-latest-gpu, ejecuta el siguiente comando:

     gcloud compute instances create VM_NAME \
       --project PROJECT_ID \
       --custom-cpu 96 \
       --custom-memory 624 \
       --image-project=deeplearning-platform-release \
       --image-family=tf-latest-gpu \
       --accelerator type=nvidia-tesla-v100,count=8 \
       --maintenance-policy TERMINATE \
       --metadata="install-nvidia-driver=True"  \
       --boot-disk-size 200GB \
       --network-interface=nic-type=GVNIC \
       --zone=ZONE
    

    Ejemplo

    Por ejemplo, para crear una VM que tenga un ancho de banda máximo de 100 Gbps, utiliza ocho GPU A100 y usa la imagen DLVM tf-latest-gpu, ejecuta el siguiente comando:

    gcloud compute instances create VM_NAME \
       --project=PROJECT_ID \
       --zone=ZONE \
       --machine-type=a2-highgpu-8g \
       --maintenance-policy=TERMINATE --restart-on-failure \
       --image-family=tf-latest-gpu \
       --image-project=deeplearning-platform-release \
       --boot-disk-size=200GB \
       --network-interface=nic-type=GVNIC \
       --metadata="install-nvidia-driver=True,proxy-mode=project_editors" \
       --scopes=https://www.googleapis.com/auth/cloud-platform
    

    Reemplaza lo siguiente:

    • VM_NAME: El nombre de tu VM.
    • PROJECT_ID: El ID de tu proyecto
    • ZONE: La zona para la VM. Esta zona debe ser compatible con el tipo de GPU especificado. Para obtener más información sobre las zonas, consulta Disponibilidad de zonas y regiones de GPU.
  3. Después de crear la instancia de VM, puedes verificar el ancho de banda de la red.

Comprueba el ancho de banda de la red

Cuando trabajas con GPU con ancho de banda alto, puedes usar una herramienta de tráfico de red, como iperf2, para medir el ancho de banda de la red.

Para comprobar la velocidad del ancho de banda, necesitas al menos dos instancias de VM que tengan GPU conectadas y puedan admitir la velocidad de ancho de banda que estás probando. Si quieres conocer las opciones de configuración de VM mínimas recomendadas para anchos de banda específicos, consulta Configuración de VM.

Usa iPerf para realizar comparativas en sistemas basados en Debian.

  1. Crea dos VM que admitan las velocidades de ancho de banda necesarias.

  2. Una vez que ambas VM estén en ejecución, usa SSH para conectarte a una de las VM.

    gcloud compute ssh VM_NAME \
        --project=PROJECT_ID
    

    Reemplaza lo siguiente:

    • VM_NAME: el nombre de la primera VM
    • PROJECT_ID: el ID de tu proyecto
  3. En la primera VM, completa los siguientes pasos:

    1. Instala iperf.

      sudo apt-get update && sudo apt-get install iperf
      
    2. Obtén la dirección IP interna de esta VM. Anota el mensaje para escribirlo.

      ip a
      
    3. Inicia el servidor de iPerf.

      iperf -s
      

      Esto inicia un servidor que escucha las conexiones para realizar las comparativas. Déjalo en ejecución durante la prueba.

  4. Desde una terminal de cliente nueva, conéctate a la segunda VM mediante SSH.

    gcloud compute ssh VM_NAME \
       --project=PROJECT_ID
    

    Reemplaza lo siguiente:

    • VM_NAME: el nombre de la segunda VM
    • PROJECT_ID: el ID de tu proyecto
  5. En la segunda VM, completa los siguientes pasos:

    1. Instala iPerf.

      sudo apt-get update && sudo apt-get install iperf
      
    2. Ejecuta la prueba de iperf y especifica la dirección IP de la primera VM como destino.

      iperf -t 30 -c internal_ip_of_instance_1 -P 16
      

      Esta ejecuta una prueba de 30 segundos y produce un resultado similar al siguiente. Si iPerf no puede acceder a la otra VM, es posible que debas ajustar la red o la configuración del firewall en las VM o, tal vez, en Cloud Console.

Cuando uses el ancho de banda máximo disponible de 100 Gbps, ten en cuenta lo siguiente:

  • Debido a los gastos generales de encabezado para protocolos como Ethernet, IP y TCP en la pila de virtualización, el rendimiento, medido por netperf, se satura aproximadamente en 90 Gbps.

    El protocolo TCP puede alcanzar una velocidad de red de 100 Gbps. Actualmente, otros protocolos, como UDP, son más lentos.

  • Debido a factores como la sobrecarga del protocolo y la congestión de la red, el rendimiento de extremo a extremo de las transmisiones de datos puede ser levemente inferior a 100 Gbps.

  • Debes usar varias transmisiones de TCP para alcanzar el ancho de banda máximo entre instancias de VM. Google recomienda entre 4 y 16 transmisiones. En 16 flujos, con frecuencia, se maximiza la capacidad de procesamiento. Según la aplicación y la pila de software, es posible que debas ajustar la configuración o el código para configurar varias transmisiones.

  • El ancho de banda de red de 100 Gbps solo se puede obtener de forma unidireccional. Es posible que la suma de TX + RX sea aproximadamente de 100 Gbps.

Uso de velocidades de ancho de banda de red más altas con Fast Socket

La biblioteca de comunicación colectiva de NVIDIA (NCCL) se usa en frameworks de aprendizaje profundo, como TensorFlow, PyTorch, Horovod para el entrenamiento de varias GPU y varios nodos.

Fast Socket es un sistema de transporte de red propiedad de Google para NCCL. En Compute Engine, Fast Socket mejora el rendimiento de NCCL en redes de 100 Gbps, ya que reduce la contención entre varias conexiones de TCP.

La evaluación actual demuestra que Fast Socket mejora la capacidad de procesamiento de reducción del 30% al 60%, según el tamaño del mensaje.

Para configurar un entorno de Fast Socket, puedes usar Deep Learning VM Image o una imagen pública de Compute Engine.

Usa Deep Learning VM Image

Para configurar Fast Socket, puedes usar una VM de aprendizaje profundo. Las imágenes de VM de aprendizaje profundo tienen preinstalados el controlador de GPU, el software de AA, el Socket rápido y gVNIC.

Estas imágenes incluyen lo siguiente:

  • tf-latest-gpu-debian-10
  • tf-latest-gpu-ubuntu-1804

Ejemplo de V100

Por ejemplo, para crear una VM de Debian 10 que tenga un ancho de banda máximo de 100 Gbps, ocho GPU V100 conectadas y use una imagen de VM de aprendizaje profundo con Socket, ejecuta el siguiente comando:

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --custom-cpu=96 \
    --custom-memory=624 \
    --image-project=deeplearning-platform-release \
    --image-family=tf-latest-gpu-debian-10 \
    --accelerator=type=nvidia-tesla-v100,count=8 \
    --maintenance-policy=TERMINATE \
    --metadata="install-nvidia-driver=True"  \
    --network-interface=nic-type=GVNIC \
    --boot-disk-size=200GB

Ejemplo de A100

Por ejemplo, para crear una VM de Ubuntu 18.04 que tenga un ancho de banda máximo de 100 Gbps, ocho GPU A100 adjuntas y Deep Learning VM Image con Fast Socket, ejecuta el siguiente comando:

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a2-highgpu-8g \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=tf-latest-gpu-ubuntu-1804 \
    --image-project=deeplearning-platform-release \
    --boot-disk-size=200GB \
    --network-interface=nic-type=GVNIC \
    --metadata="install-nvidia-driver=True,proxy-mode=project_editors" \
    --scopes=https://www.googleapis.com/auth/cloud-platform

Reemplaza lo siguiente:

  • VM_NAME: El nombre de tu VM.
  • PROJECT_ID: el ID de tu proyecto
  • ZONE: La zona para la VM. Esta zona debe ser compatible con el tipo de GPU especificado. Para obtener más información sobre las zonas, consulta Disponibilidad de zonas y regiones de GPU.

Después de configurar el entorno, puedes verificar que esté habilitado Fast Socket.

Usa imágenes públicas de Compute Engine

Para configurar el protocolo rápido, puedes usar una imagen pública de Compute Engine. Para usar una imagen pública de Compute Engine, completa los siguientes pasos:

  1. Crea tu VM con las GPU A100, T4, o V100 adjuntas, consulta Crea VM con GPU adjuntas.

  2. Usa esta imagen para crear tu VM con las GPU A100, T4 o V100 conectadas. Para obtener más información, consulta Crea VM con GPU adjuntas.

  3. Instala los controladores de GPU. Para obtener más información, consulta Instala controladores de GPU.

  4. Instala Fast Socket. Para obtener instrucciones, consulta Instala de forma rápida Fast Socket.

  5. Verifica que Fast Socket esté habilitado. Para obtener instrucciones, consulta Verifica si Fast Socket está habilitado.

Instalación manual de Fast Socket

Antes de instalar Fast Socket en una VM de Linux, debes instalar la NCCL. Para obtener instrucciones detalladas, consulta la documentación de NCCL de NVIDIA.

CentOS/RHEL

Para descargar y, luego, instalar Fast Socket en una VM de CentOS o RHEL, completa los siguientes pasos:

  1. Agrega el repositorio de paquetes y, luego, importa claves públicas.

    sudo tee /etc/yum.repos.d/google-fast-socket.repo << EOM
    [google-fast-socket]
    name=Fast Socket Transport for NCCL
    baseurl=https://packages.cloud.google.com/yum/repos/google-fast-socket
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
          https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOM
    
  2. Instala Fast Socket.

    sudo yum install google-fast-socket
    
  3. Verifica que Fast Socket esté habilitado.

SLES

Para descargar y, luego, instalar Fast Socket en una VM de SLES, completa los siguientes pasos:

  1. Agrega el repositorio de paquetes.

    sudo zypper addrepo https://packages.cloud.google.com/yum/repos/google-fast-socket google-fast-socket
    
  2. Agrega claves de repositorio.

    sudo rpm --import https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    
  3. Instala Fast Socket.

    sudo zypper install google-fast-socket
    
  4. Verifica que Fast Socket esté habilitado.

Debian/Ubuntu

Para descargar y, luego, instalar Fast Socket en una VM de Debian o Ubuntu, completa los siguientes pasos:

  1. Agrega el repositorio de paquetes.

    echo "deb https://packages.cloud.google.com/apt google-fast-socket main" | sudo tee /etc/apt/sources.list.d/google-fast-socket.list
    
  2. Agrega claves de repositorio.

    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    
  3. Instala Fast Socket.

    sudo apt update && sudo apt install google-fast-socket
    
  4. Verifica que Fast Socket esté habilitado.

Verifica que Fast Socket esté habilitado

En tu VM, completa los siguientes pasos:

  1. Ubica el directorio principal de NCCL.

    sudo ldconfig -p | grep nccl

    Por ejemplo, en una imagen de DLVM, obtendrás el siguiente resultado:

    libnccl.so.2 (libc6,x86-64) => /usr/local/nccl2/lib/libnccl.so.2
    libnccl.so (libc6,x86-64) => /usr/local/nccl2/lib/libnccl.so
    libnccl-net.so (libc6,x86-64) => /usr/local/nccl2/lib/libnccl-net.so

    Esto muestra que el directorio principal de NCCL es /usr/local/nccl2.

  2. Comprueba que NCCL cargue el complemento de Fast Socket. Para comprobarlo, debes descargar el paquete de prueba NCCL. Para descargar el paquete de instalación, ejecute el siguiente comando:

    git clone https://github.com/NVIDIA/nccl-tests.git && \
    cd nccl-tests && make NCCL_HOME=NCCL_HOME_DIRECTORY

    Reemplaza NCCL_HOME_DIRECTORY por el directorio principal de NCCL.

  3. Desde el directorio nccl-tests, ejecuta el proceso all_reduce_perf:

    NCCL_DEBUG=INFO build/all_reduce_perf

    Si se habilita Fast Socket, el mensaje FastSocket plugin initialized se muestra en el registro de salida.

    # nThread 1 nGpus 1 minBytes 33554432 maxBytes 33554432 step: 1048576(bytes) warmup iters: 5 iters: 20 validation: 1
    #
    # Using devices
    #   Rank  0 Pid  63324 on fast-socket-gpu device  0 [0x00] Tesla V100-SXM2-16GB
    .....
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : Flow placement enabled.
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : queue skip: 0
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : Using [0]ens12:10.240.0.24
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket plugin initialized
    ......
    

Próximos pasos