Utiliza 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

Cloud Machine Learning Engine te permite ejecutar cualquier aplicación de entrenamiento TensorFlow en una máquina habilitada para GPU. Lee la guía de TensorFlow para usar las GPU y la sección a continuación sobre la asignación de operaciones a las GPU a fin de asegurarte de que tu aplicación haga uso de las GPU disponibles.

Algunos modelos no se benefician de la ejecución en las GPU. Recomendamos las 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

Para usar las GPU en la nube, configura tu trabajo de entrenamiento a fin de acceder a máquinas habilitadas para GPU:

  • Configura el nivel de escala en CUSTOM.
  • Configura cada tarea (instancia principal, trabajador o servidor de parámetros) a fin de usar uno de los tipos de máquinas habilitadas para GPU a continuación, en función de la cantidad de GPU y del tipo de acelerador requerido en el caso de 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, hay un ejemplo para enviar el trabajo con el comando de gcloud.

Alternativamente, si estás aprendiendo a usar Cloud ML Engine o experimentando con máquinas habilitadas para GPU, puedes configurar el nivel de escala en BASIC_GPU a fin de obtener una instancia de un solo trabajador con una sola GPU de NVIDIA Tesla K80.

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

Además, debes ejecutar tu trabajo en una región que admita las GPU. Las siguientes regiones actualmente proporcionan acceso a las GPU:

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

A fin de comprender en su totalidad las regiones disponibles para los servicios de Cloud ML Engine, incluidos el entrenamiento de modelos y la predicción en línea o por lotes, consulta la guía de regiones.

Envía el trabajo de entrenamiento

Puedes enviar tu trabajo de entrenamiento con el comando de gcloud ml-engine 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. Por ejemplo:

    trainingInput:
      scaleTier: CUSTOM
      masterType: complex_model_m_gpu
      workerType: complex_model_m_gpu
      parameterServerType: large_model
      workerCount: 9
      parameterServerCount: 3
    
  2. Utiliza el comando de gcloud para enviar el trabajo, incluido un argumento de --config que apunte a tu archivo config.yaml. El siguiente ejemplo supone que has configurado variables de entorno, indicadas por un signo $ seguido de letras mayúsculas, para los valores de algunos argumentos:

    gcloud ml-engine 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
    

Notas:

  • Si especificas una opción tanto en tu archivo de configuración (config.yaml) como en un marcador de línea de comandos, el valor en la línea de comandos anula el valor en el archivo de configuración.
  • El marcador -- vacío indica el final de los marcadores específicos de gcloud y el inicio de los USER_ARGS que deseas pasar a tu aplicación.
  • Los marcadores específicos de Cloud ML Engine, como --module-name, --runtime-version y --job-dir, deben aparecer antes del marcador -- vacío. El servicio de Cloud ML Engine interpreta estos marcadores.
  • El marcador --job-dir, si se especifica, debe aparecer antes del marcador -- vacío porque Cloud ML Engine usa --job-dir para validar la ruta de acceso.
  • Tu aplicación también debe controlar el marcador --job-dir, si se especifica. Aunque el marcador aparezca antes del marcador -- vacío, --job-dir también se pasa a tu aplicación como un marcador de línea de comandos.
  • Puedes definir tantos USER_ARGS como necesites. Cloud ML Engine pasa --user_first_arg, --user_second_arg, y así sucesivamente, a 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 utilizar las GPU en una máquina, haz los cambios adecuados en tu aplicación de entrenamiento TensorFlow.

  • API de Estimator de alto nivel: no se necesitan cambios de códigos siempre que tu ClusterSpec esté configurado correctamente. Si un clúster es una mezcla de CPU y GPU, asigna el nombre del trabajo ps a las CPU y el nombre del 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 Cloud ML Engine, 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 utilizan identificadores que comienzan con "/gpu:0", luego "/gpu:1" y así sucesivamente. 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 se ofrecen preinstaladas con tensorflow-gpu, el paquete de Python de Tensorflow con asistencia de 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 utilizas GPU en tus trabajos de entrenamiento, ten en cuenta que las máquinas virtuales subyacentes estarán ocasionalmente sujetas a mantenimiento del host de Compute Engine. Las máquinas virtuales habilitadas para GPU utilizadas en tus trabajos de entrenamiento están configuradas con el fin de reiniciarse automáticamente después de tales 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 regularmente puntos de control del modelo (generalmente a lo largo de la ruta de Cloud Storage que especifiques a través del argumento --job-dir a gcloud ml-engine jobs submit training) y para restablecer el punto de control más reciente en el caso de que ya exista un punto de control.

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

Si no es posible unir tu modelo en un Estimador de TensorFlow y deseas 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 manualmente. TensorFlow proporciona algunos recursos útiles para la implementación en el módulo tf.train, específicamente, tf.train.checkpoint_exists y tf.train.latest_checkpoint.

¿Qué sigue?

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

Cloud ML Engine para TensorFlow