Usa las GPU para modelos de entrenamiento en la nube

Las unidades de procesamiento de gráficos (GPU) pueden acelerar de manera significativa el proceso de entrenamiento para muchos modelos de aprendizaje profundo. Los modelos de entrenamiento para tareas como la clasificación de imágenes, el análisis de videos y el procesamiento de lenguaje natural implican la multiplicación de matrices de procesamiento intensivo y otras operaciones que pueden aprovechar la arquitectura masivamente paralela de una GPU.

Entrenar un modelo de aprendizaje profundo que implica tareas de procesamiento intensivo en conjuntos de datos extremadamente grandes puede demorar varios días en ejecutarse en un solo procesador. Sin embargo, si diseñas tu programa para descargar esas tareas a una GPU o más, puedes reducir el tiempo de entrenamiento a horas en lugar de días.

Antes de comenzar

AI Platform te permite ejecutar la aplicación de entrenamiento de TensorFlow en una máquina habilitada para GPU. Lee la guía de TensorFlow para usar las GPU y la sección sobre la asignación de operaciones a las GPU a continuación, a fin de asegurarte de que tu aplicación use de las GPU disponibles.

También puedes usar las GPU con marcos de trabajo de aprendizaje automático que no sean de TensorFlow, si usas un contenedor personalizado para el entrenamiento.

Algunos modelos no se benefician de ejecutarse en GPU. Recomendamos GPU para modelos grandes y complejos que tienen muchas operaciones matemáticas. Incluso en ese caso, deberías probar el beneficio de la asistencia de GPU. Para ello, ejecuta una pequeña muestra de tus datos a través del entrenamiento.

Solicita máquinas habilitadas para GPU

Si quieres usar GPU en la nube, configura tu trabajo de entrenamiento a fin de acceder a máquinas habilitadas para GPU de una de las maneras siguientes:

  • Usa el nivel de escala BASIC_GPU.
  • Usa los tipos de máquina de Compute Engine y conecta las GPU.
  • Usa los tipos de máquinas heredadas compatibles con GPU.

Máquina básica habilitada para GPU

Si estás aprendiendo a usar AI Platform o experimentando con máquinas habilitadas para GPU, puedes establecer el nivel de escala en BASIC_GPU a fin de obtener una sola instancia de trabajador con una sola GPU de NVIDIA Tesla K80.

Tipos de máquinas de Compute Engine con adjuntos de GPU

Si configuras su trabajo de entrenamiento con los tipos de máquinas de Compute Engine, puedes conectar una cantidad personalizada de GPU para acelerar tu trabajo:

  • Establece el nivel de escala en CUSTOM.
  • Configura cada tipo de trabajador (principal, trabajador o servidor de parámetros) para usar un tipo de máquina de Compute Engine válido.
  • Agrega un campo acceleratorConfig con el tipo y la cantidad de GPU que quieras para masterConfig, workerConfig o parameterServerConfig, según las máquinas virtuales que necesites acelerar. Puedes usar los tipos siguientes de GPU:
    • NVIDIA_TESLA_K80
    • NVIDIA_TESLA_P4
    • NVIDIA_TESLA_P100
    • NVIDIA_TESLA_T4
    • NVIDIA_TESLA_V100

Si quieres crear un acceleratorConfig válido, debes tener en cuenta varias restricciones:

  1. Solo puedes usar una cantidad determinada de GPU en tu configuración. Por ejemplo, puedes adjuntar 2 o 4 NVIDIA Tesla K80, pero no 3. A fin de averiguar qué recuentos son válidos para cada tipo de GPU, consulta la tabla de compatibilidad que figura a continuación.

  2. Debes asegurarte de que cada una de las configuraciones de tu GPU proporcione suficientes CPU virtuales y memoria para el tipo de máquina al que realizas la conexión. Por ejemplo, si usas n1-standard-32 para tus trabajadores, cada trabajador tendrá 32 CPU virtuales y 120 GB de memoria. Cada NVIDIA Tesla V100 puede proporcionar hasta 8 CPU virtuales y 52 GB de memoria, por lo que debes conectar, al menos, 4 a cada trabajador n1-standard-32 para cumplir con los requisitos.

    Revisa la tabla de especificaciones del tipo de máquina y la comparación de las GPU para las cargas de trabajo de procesamiento a fin de determinar estas compatibilidades, o consulta la tabla de compatibilidad que figura a continuación.

    Ten en cuenta las limitaciones siguientes adicionales sobre los recursos de GPU para AI Platform que aplican a casos particulares:

    • Una configuración con 8 GPU NVIDIA Tesla K80 proporciona un máximo de 208 GB de memoria en todas las regiones y zonas.
    • Una configuración con 4 GPU NVIDIA Tesla P100 admite un máximo de 64 CPU virtuales y 208 GB de memoria en todas las regiones y zonas.
  3. Debes enviar tu trabajo de entrenamiento a una región que admita la configuración de tu GPU. Lee acerca de la compatibilidad por región que figura a continuación.

En la tabla siguiente, se brinda una referencia rápida sobre el número de cada tipo de acelerador que puedes conectar a cada tipo de máquina de Compute Engine:

Números válidos de GPU para cada tipo de máquina
Tipo de máquina NVIDIA Tesla K80 NVIDIA Tesla P4 NVIDIA Tesla P100 NVIDIA Tesla T4 NVIDIA Tesla V100
n1-standard-4 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-standard-8 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-standard-16 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 2, 4, 8
n1-standard-32 4, 8 2, 4 2, 4 2, 4 4, 8
n1-standard-64 4 4 8
n1-standard-96 4 4 8
n1-highmem-2 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-4 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-8 1, 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 1, 2, 4, 8
n1-highmem-16 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 2, 4, 8
n1-highmem-32 4, 8 2, 4 2, 4 2, 4 4, 8
n1-highmem-64 4 4 8
n1-highmem-96 4 4 8
n1-highcpu-16 2, 4, 8 1, 2, 4 1, 2, 4 1, 2, 4 2, 4, 8
n1-highcpu-32 4, 8 2, 4 2, 4 2, 4 4, 8
n1-highcpu-64 8 4 4 4 8
n1-highcpu-96 4 4 8

A continuación, se incluye un ejemplo para enviar un trabajo con los tipos de máquinas de Compute Engine con GPU conectadas.

Tipos de máquina con GPU incluidas

Como alternativa, en lugar de usar un acceleratorConfig, puedes seleccionar un tipo de máquina heredado que tenga las GPU incluidas:

  • Establece el nivel de escala en CUSTOM.
  • Configura cada tipo de trabajador (principal, trabajador o servidor de parámetros) a fin de usar uno de los tipos de máquinas habilitadas de GPU que figuran a continuación, según la cantidad de GPU y el tipo de acelerador que se requiere para tu tarea:
    • standard_gpu: una sola GPU de NVIDIA Tesla K80
    • complex_model_m_gpu: cuatro GPU de NVIDIA Tesla K80
    • complex_model_l_gpu: ocho GPU de NVIDIA Tesla K80
    • standard_p100: una sola GPU de NVIDIA Tesla P100
    • complex_model_m_p100: cuatro GPU de NVIDIA Tesla P100
    • standard_v100: una sola GPU de NVIDIA Tesla V100
    • large_model_v100: una sola GPU de NVIDIA Tesla V100
    • complex_model_m_v100: cuatro GPU de NVIDIA Tesla V100
    • complex_model_l_v100: ocho GPU de NVIDIA Tesla V100

A continuación, se muestra un ejemplo a fin de enviar un trabajo con los tipos de máquinas habilitados para GPU con el comando gcloud.

Consulta más información sobre la comparación de tipos de máquinas.

Regiones que admiten GPU

Debes ejecutar tu trabajo en una región que admita las GPU. En la actualidad, las regiones siguientes proporcionan acceso a las GPU:

  • us-west1
  • us-central1
  • us-east1
  • europe-west1
  • europe-west4
  • asia-southeast1
  • asia-east1

Además, algunas de estas regiones solo brindan acceso a determinados tipos de GPU. A fin de comprender a fondo las regiones disponibles para los servicios de AI Platform, incluidos el entrenamiento de modelos y la predicción en línea o por lotes, consulta la guía de regiones.

Si tu trabajo de entrenamiento usa varios tipos de GPU, todos deben estar disponibles en una única zona de tu región. Por ejemplo, no puedes ejecutar un trabajo en us-central1 con un trabajador principal con GPU de NVIDIA Tesla V100, servidores de parámetros que usan GPU de NVIDIA Tesla K80 ni trabajadores que usan GPU de NVIDIA Tesla P100. Si bien todas estas GPU están disponibles para trabajos de entrenamiento en us-central1, ninguna zona de esa región ofrece los tres tipos de GPU. Si quieres obtener más información sobre la disponibilidad de zona de las GPU, consulta la comparación de las GPU para las cargas de trabajo de procesamiento.

Envía el trabajo de entrenamiento

Puedes enviar tu trabajo de entrenamiento con el comando gcloud ai-platform jobs submit training.

  1. Define un archivo config.yaml que describa las opciones de GPU que deseas. La estructura del archivo YAML representa el recurso de trabajo. A continuación, se presentan dos ejemplos de archivos config.yaml.

    En el primer ejemplo, se muestra un archivo de configuración para un trabajo de entrenamiento que usa tipos de máquina de Compute Engine, algunos de los cuales tienen GPU conectadas:

    trainingInput:
      scaleTier: CUSTOM
      # Configure a master worker with 4 K80 GPUs
      masterType: n1-highcpu-16
      masterConfig:
        acceleratorConfig:
          count: 4
          type: NVIDIA_TESLA_K80
      # Configure 9 workers, each with 4 K80 GPUs
      workerCount: 9
      workerType: n1-highcpu-16
      workerConfig:
        acceleratorConfig:
          count: 4
          type: NVIDIA_TESLA_K80
      # Configure 3 parameter servers with no GPUs
      parameterServerCount: 3
      parameterServerType: n1-highmem-8
    

    En el ejemplo siguiente, se muestra un archivo de configuración para un trabajo con una configuración similar a la anterior. Sin embargo, esta configuración usas tipos de máquina heredados que incluyen las GPU, en lugar de conectar las GPU a un acceleratorConfig:

    trainingInput:
      scaleTier: CUSTOM
      # Configure a master worker with 4 K80 GPUs
      masterType: complex_model_m_gpu
      # Configure 9 workers, each with 4 K80 GPUs
      workerCount: 9
      workerType: complex_model_m_gpu
      # Configure 3 parameter servers with no GPUs
      parameterServerCount: 3
      parameterServerType: large_model
    
  2. Usa el comando de gcloud para enviar el trabajo, incluido un argumento de --config que apunte a tu archivo config.yaml. En el ejemplo siguiente, suponemos que ya configuraste las variables de entorno, que se indican con un signo $ seguido de letras mayúsculas, para los valores de algunos argumentos:

    gcloud ai-platform jobs submit training $JOB_NAME \
            --package-path $APP_PACKAGE_PATH \
            --module-name $MAIN_APP_MODULE \
            --job-dir $JOB_DIR \
            --region us-central1 \
            --config config.yaml \
            -- \
            --user_arg_1 value_1 \
             ...
            --user_arg_n value_n
    

Como alternativa, puedes especificar los detalles de la configuración del clúster con marcas de la línea de comandos, en lugar de un archivo de configuración. Obtén más información sobre cómo usar estas marcas.

En el ejemplo siguiente, se muestra cómo enviar un trabajo con la misma configuración que en el primer ejemplo (con los tipos de máquinas de Compute Engine con GPU conectadas), pero lo hace sin usar un archivo config.yaml:

gcloud ai-platform jobs submit training $JOB_NAME \
        --package-path $APP_PACKAGE_PATH \
        --module-name $MAIN_APP_MODULE \
        --job-dir $JOB_DIR \
        --region us-central1 \
        --scale-tier custom \
        --master-machine-type n1-highcpu-16 \
        --master-accelerator count=4,type=nvidia-tesla-k80 \
        --worker-count 9 \
        --worker-machine-type n1-highcpu-16 \
        --worker-accelerator count=4,type=nvidia-tesla-k80 \
        --parameter-server-count 3 \
        --parameter-server-machine-type n1-highmem-8 \
        -- \
        --user_arg_1 value_1 \
         ...
        --user_arg_n value_n

Notas:

  • Si especificas una opción en tu archivo de configuración (config.yaml) y como una marca de línea de comandos, el valor en la línea de comandos anula el valor en el archivo de configuración.
  • La marca vacía -- indica el final de las marcas específicas gcloud y el inicio de los USER_ARGS que quieres pasar a tu aplicación.
  • Las marcas específicas de AI Platform, como --module-name, --runtime-version y --job-dir, deben aparecer antes de la marca vacía --. El servicio de AI Platform interpreta estas marcas.
  • Si se especifica la marca --job-dir, debe aparecer antes de la marca vacía --, ya que AI Platform usa para validar la ruta.
  • Tu aplicación también debe controlar la marca --job-dir, si se especifica. Aunque la marca aparezca antes de la -- vacía, --job-dir también se pasa a tu aplicación como una marca de línea de comandos.
  • Puedes definir tantos USER_ARGS como necesites. AI Platform pasa --user_first_arg, --user_second_arg y así de forma sucesiva a través de tu aplicación.

Con el propósito de obtener más detalles sobre las opciones de envío de trabajos, consulta la guía para comenzar un trabajo de entrenamiento.

Asigna operaciones a las GPU

Para usar las GPU en una máquina, aplica los cambios adecuados en tu aplicación de entrenamiento TensorFlow.

  • API de Estimator de alto nivel: no se necesitan cambios de código mientras que tu ClusterSpec esté configurado de forma correcta. Si un clúster es una combinación de CPU y GPU, debes asignar el nombre de trabajo ps a las CPU y el nombre de trabajo worker a las GPU.

  • API de Core TensorFlow: debes asignar operaciones a fin de que se ejecuten en máquinas habilitadas para GPU. Este proceso es el mismo que usar las GPU con TensorFlow de manera local. Puedes usar tf.train.replica_device_setter para asignar operaciones a los dispositivos.

Cuando asignas una máquina habilitada para GPU a un proceso de AI Platform, ese proceso tiene acceso exclusivo a las GPU de esa máquina; no puedes compartir las GPU de una sola máquina en tú clúster entre varios procesos. Este proceso corresponde a la tarea distribuida de TensorFlow en la especificación de tu clúster. La documentación distribuida de TensorFlow describe las especificaciones y tareas del clúster.

Strings de dispositivos de las GPU

La GPU standard_gpu única de una máquina se identifica como "/gpu:0". Las máquinas con varias GPU usan identificadores que comienzan con "/gpu:0", luego "/gpu:1", y así de forma sucesiva. Por ejemplo, las máquinas complex_model_m_gpu tienen cuatro GPU identificadas desde "/gpu:0" hasta "/gpu:3".

Paquetes de Python en máquinas habilitadas para GPU

Las máquinas habilitadas para GPU tienen preinstalado tensorflow-gpu, el paquete de Python de TensorFlow compatible con GPU. Consulta la lista de versiones del entorno de ejecución del AA en la nube para obtener una lista de todos los paquetes preinstalados.

Eventos de mantenimiento

Si usas GPU en tus trabajos de entrenamiento, ten en cuenta que las máquinas virtuales subyacentes estarán, en ciertas ocasiones, sujetas al mantenimiento del host de Compute Engine. Las máquinas virtuales habilitadas para GPU que se usan en tus trabajos de entrenamiento están configuradas con el fin de reiniciarse de forma automática después de estos eventos de mantenimiento, pero es posible que tengas que hacer algunos trabajos adicionales con el objetivo de garantizar que tu trabajo sea resistente a estos cierres. Configura tu aplicación de entrenamiento para guardar puntos de control del modelo con regularidad (por lo general, junto a la ruta de Cloud Storage que especifiques a través del argumento --job-dir en gcloud ai-platform jobs submit training) y para restablecer el punto de control más reciente en el caso de que ya exista uno.

La API de Estimator de TensorFlow implementa esta funcionalidad para ti, por lo que si tu modelo ya está unido a un Estimador, no tienes que preocuparte por los eventos de mantenimiento en tus trabajadores de la GPU.

Si no es posible unir tu modelo a un Estimador de TensorFlow y quieres que tus trabajos de entrenamiento habilitados para la GPU sean resistentes a los eventos de mantenimiento, debes escribir la función de guardado y restauración de puntos de control en tu modelo de forma manual. TensorFlow proporciona algunos recursos útiles para la implementación en el módulo tf.train, en especial, tf.train.checkpoint_exists y tf.train.latest_checkpoint.

Próximos pasos