Ejecuta un trabajo de entrenamiento

AI Platform Training proporciona entrenamiento de modelos como un servicio asíncrono (por lotes). En esta página, se describe cómo configurar y enviar un trabajo de entrenamiento mediante la ejecución de gcloud ai-platform jobs submit training desde la línea de comandos o mediante el envío de una solicitud a la API en projects.jobs.create.

Antes de comenzar

Antes de que puedas enviar un trabajo de entrenamiento, debes empaquetar tu aplicación y subirla, así como las dependencias inusuales a un depósito de Cloud Storage. Nota: Si usas Google Cloud CLI para enviar tu trabajo, puedes empaquetar la aplicación y enviar el trabajo en el mismo paso.

Configura el trabajo

Para pasar tus parámetros al servicio de entrenamiento, configura los miembros del recurso Job, incluidos los elementos del recurso TrainingInput.

Si usas Google Cloud CLI para enviar tus trabajos de entrenamiento, puedes seguir las siguientes acciones:

  • Especifica los parámetros de entrenamiento más comunes como marcas del comando gcloud ai-platform jobs submit training.
  • Pasa los parámetros restantes a un archivo de configuración YAML, denominado config.yaml por regla general. El archivo de configuración duplica la estructura de la representación JSON del recurso Job. Pasa la ruta de tu archivo de configuración en la marca --config del comando gcloud ai-platform jobs submit training. Entonces, si la ruta de acceso al archivo de configuración es config.yaml, debes configurar --config=config.yaml.

Recopila los datos de configuración del trabajo

Las siguientes propiedades se usan para definir tu trabajo.

Nombre del trabajo (jobId)
Un nombre que se use para el trabajo (combinaciones de mayúsculas y minúsculas, números y guiones bajos, que comience con una letra).
Configuración del clúster (scaleTier)
Un nivel de escala que especifique el tipo de clúster de procesamiento para ejecutar el trabajo. Esto puede ser a nivel de escala CUSTOM; en cuyo caso, también especificas de forma explícita la cantidad y el tipo de máquinas que quieres usar.
Configuración del disco (diskConfig)
Configuración del disco de arranque para cada VM de entrenamiento. Este campo es opcional, de forma predeterminada, cada VM se ejecuta con un disco de arranque pd-ssd de 100 GB. Si especificas este campo, se podrían generar cargos de disco adicionales.
Paquete de aplicación de entrenamiento (packageUris)
Una aplicación de entrenamiento empaquetada que se pondrá a prueba en una ubicación de Cloud Storage. Si usas Google Cloud CLI, el paso de empaquetado de la aplicación está automatizado en gran medida. Consulta los detalles de la guía empaqueta tu aplicación.
Nombre del módulo (pythonModule)
El nombre del módulo principal en el paquete. El módulo principal es el archivo Python que llamas para iniciar la aplicación. Si usas el comando gcloud para enviar tu trabajo, especifica el nombre del módulo principal en la marca --module-name. Consulta la guía para empaquetar tu aplicación.
Región (region)
La región de Compute Engine donde quieres que se ejecute el trabajo. Debes ejecutar el trabajo de entrenamiento en la misma región que el bucket de Cloud Storage que almacena tus datos de entrenamiento. Consulta las regiones disponibles para los servicios de AI Platform Training.
Directorio de trabajos (jobDir)
La ruta a una ubicación de Cloud Storage para usarla en la salida del trabajo. La mayoría de las aplicaciones de entrenamiento guardan puntos de control durante el entrenamiento y el modelo entrenado en un archivo al final del trabajo. Necesitas una ubicación de Cloud Storage para guardarlos. Tu proyecto de Google Cloud debe tener acceso de escritura a este bucket. El servicio de entrenamiento pasa de forma automática la ruta que configuraste para el directorio de trabajo a la aplicación de entrenamiento como un argumento de línea de comandos denominado job_dir. Puedes analizarlo junto con los otros argumentos de tu aplicación y usarlo en tu código. La ventaja de usar el directorio de trabajo es que el servicio de entrenamiento valida el directorio antes de iniciar tu aplicación.
Versión de entorno de ejecución (runtimeVersion)
La versión del entorno de ejecución de AI Platform Training para usar en el trabajo.
Versión de Python (pythonVersion)
La versión de Python que se usa para el trabajo. Python 3.5 está disponible en las versiones 1.13 a 1.14 del entorno de ejecución. Python 3.7 está disponible en las versiones 1.15 y posteriores del entorno de ejecución.
Tiempo de espera máximo (scheduling.maxWaitTime)
Una duración máxima de espera en segundos con el sufijo s (por ejemplo, 3600s) que determina cuánto tiempo permites que tu trabajo permanezca en los estados QUEUED y PREPARING. AI Platform Training no siempre comienza a ejecutar el trabajo de inmediato debido a restricciones de recursos. Especifica este campo si no deseas esperar más que un tiempo determinado para que se ejecute el trabajo. La duración limitada comienza cuando creas el trabajo. Si el trabajo aún no ingresó al estado RUNNING al final de este período, AI Platform Training lo cancelará. Este campo es opcional y no tiene límite predeterminado. Si especificas este campo, debes establecer el valor en al menos 1800s (30 minutos).
Tiempo máximo de ejecución (scheduling.maxRunningTime)
La duración máxima en segundos con el sufijo s (por ejemplo, 7200s) para el trabajo de entrenamiento. La duración limitada comienza cuando el trabajo ingresa al estado RUNNING. Si el trabajo aún se está ejecutando después de ese período, AI Platform Training lo cancelará. Este campo es opcional y su valor predeterminado es de siete días (604800s).
Cuenta de servicio (serviceAccount)
La dirección de correo electrónico de una cuenta de servicio que AI Platform Training usa cuando ejecuta tu aplicación de entrenamiento. Esto permite que tu aplicación de entrenamiento acceda a los recursos de Google Cloud sin tener que darle acceso directo a la cuenta de servicio de AI Platform de tu proyecto que administra Google. Este campo es opcional. Obtén más información sobre los requisitos de las cuentas de servicio personalizadas.

Dales formato a los parámetros de configuración

La forma en que especificas los detalles de tu configuración depende de cómo comienzas tu trabajo de entrenamiento:

gcloud

Proporciona los detalles de la configuración del trabajo al comando gcloud ai-platform jobs submit training. Puedes hacerlo de dos maneras:

  • Con marcas de línea de comandos
  • En un archivo YAML que represente el recurso Job. Puedes nombrar este archivo como desees. Por regla general, el nombre es config.yaml.

Incluso si usas un archivo YAML, ciertos detalles se deben proporcionar como marcas de línea de comandos. Por ejemplo, debes proporcionar la marca --module-name y, al menos, uno de --package-path o --packages. Si usas --package-path, también debes incluir --job-dir o --staging-bucket. Además, debes proporcionar la marca --region o configurar una región predeterminada para tu cliente de gcloud. Estas opciones, y cualquier otra que proporciones como marcas de línea de comandos, anularán los valores de esas opciones en tu archivo de configuración.

Ejemplo 1: En este ejemplo, eliges un clúster de máquinas preconfiguradas y suministras todos los detalles requeridos como marcas de línea de comandos cuando envías el trabajo No se requiere ningún archivo de configuración. Consulta la guía para enviar el trabajo en la siguiente sección.

Ejemplo 2: En el siguiente ejemplo, se muestra el contenido del archivo de configuración para un trabajo con un clúster de procesamiento personalizado. El archivo de configuración incluye algunos detalles de configuración, no todos, y se supone que proporcionas los otros detalles requeridos como las marcas de línea de comandos cuando envías el trabajo.

trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m
  workerType: complex_model_m
  parameterServerType: large_model
  workerCount: 9
  parameterServerCount: 3
  runtimeVersion: '2.11'
  pythonVersion: '3.7'
  scheduling:
    maxWaitTime: 3600s
    maxRunningTime: 7200s

En el ejemplo anterior, se especifica la versión 3.7 de Python, que está disponible cuando usas el entorno de ejecución de AI Platform Training versión 1.15 o posterior. En el ejemplo anterior, también se configuran máquinas virtuales de servidores de parámetros y trabajadores; solo debes configurar estas máquinas si realizas un entrenamiento distribuido con TensorFlow o contenedores personalizados. Obtén más información acerca de los tipos de máquinas.

Python

Cuando envíes un trabajo de entrenamiento mediante la biblioteca cliente de la API de Google para Python, establece la configuración en un diccionario con la misma estructura que el recurso Job. Así se adopta la forma de un diccionario con dos claves: jobId y trainingInput, con sus respectivos datos que son el nombre del trabajo y un segundo diccionario con claves para los objetos en el recurso TrainingInput.

El siguiente ejemplo muestra cómo compilar una representación de trabajo para un trabajo con un clúster de procesamiento personalizado.

training_inputs = {
    'scaleTier': 'CUSTOM',
    'masterType': 'complex_model_m',
    'workerType': 'complex_model_m',
    'parameterServerType': 'large_model',
    'workerCount': 9,
    'parameterServerCount': 3,
    'packageUris': ['gs://my/trainer/path/package-0.0.0.tar.gz'],
    'pythonModule': 'trainer.task',
    'args': ['--arg1', 'value1', '--arg2', 'value2'],
    'region': 'us-central1',
    'jobDir': 'gs://my/training/job/directory',
    'runtimeVersion': '2.11',
    'pythonVersion': '3.7',
    'scheduling': {'maxWaitTime': '3600s', 'maxRunningTime': '7200s'},
}

job_spec = {'jobId': 'my_job_name', 'trainingInput': training_inputs}

Ten en cuenta que training_inputs y job_spec son identificadores arbitrarios: puedes nombrar estos diccionarios como desees. Sin embargo, las claves del diccionario se deben nombrar tal como se muestra para que coincidan los nombres de los recursos Job y TrainingInput.

En el ejemplo anterior, se especifica la versión 3.7 de Python, que está disponible cuando usas el entorno de ejecución de AI Platform Training versión 1.15 o posterior. En el ejemplo anterior, también se configuran máquinas virtuales de servidores de parámetros y trabajadores; solo debes configurar estas máquinas si realizas un entrenamiento distribuido con TensorFlow o contenedores personalizados. Obtén más información acerca de los tipos de máquinas.

Cómo enviar el trabajo

Cuando envíes un trabajo de entrenamiento, especifica dos conjuntos de marcas:

  • Parámetros de configuración del trabajo. AI Platform Training necesita estos valores a fin de configurar recursos en la nube y para implementar la aplicación en cada nodo del clúster de procesamiento.
  • Argumentos del usuario o parámetros de aplicación. AI Platform Training pasa el valor de estas marcas a la aplicación.

Crea un trabajo:

gcloud

Envía un trabajo de entrenamiento con el comando gcloud ai-platform jobs submit training.

Primero, es útil definir algunas variables de entorno que contengan tus detalles de configuración. Para crear un nombre de trabajo, el código siguiente agrega la fecha y la hora al nombre del modelo:

PACKAGE_PATH="/path/to/your/application/sources"
now=$(date +"%Y%m%d_%H%M%S")
JOB_NAME="your_name_$now"
MODULE_NAME="trainer.task"
JOB_DIR="gs://your/chosen/job/output/path"
REGION="us-east1"
RUNTIME_VERSION="2.11"

El envío de trabajos siguiente corresponde al ejemplo 1 de configuración anterior, en el que eliges un nivel de escala preconfigurado (basic) y decides proporcionar todos los detalles de configuración mediante marcas de línea de comandos. No es necesario un archivo config.yaml:

gcloud ai-platform jobs submit training $JOB_NAME \
        --scale-tier basic \
        --package-path $PACKAGE_PATH \
        --module-name $MODULE_NAME \
        --job-dir $JOB_DIR \
        --region $REGION \
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value

El envío de trabajos siguiente corresponde al ejemplo 2 de configuración anterior, en el que parte de la configuración está en el archivo y en el que proporcionas los demás detalles a través de las marcas de la línea de comandos:

gcloud ai-platform jobs submit training $JOB_NAME \
        --package-path $PACKAGE_PATH \
        --module-name $MODULE_NAME \
        --job-dir $JOB_DIR \
        --region $REGION \
        --config config.yaml \
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value

Notas:

  • Si especificas una opción en el 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 de gcloud y el inicio de los USER_ARGS que quieres pasar a la aplicación.
  • Las marcas específicas de AI Platform Training, como --module-name, --runtime-version y --job-dir, deben aparecer antes de la marca vacía --. El servicio AI Platform Training interpreta estas marcas.
  • Si se especifica la marca --job-dir, debe aparecer antes de la marca vacía --, ya que AI Platform Training usa --job-dir para validar la ruta de acceso.
  • La 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 Training pasa --user_first_arg, --user_second_arg, etc. a la aplicación.

Python

Puedes usar la biblioteca cliente de la API de Google para Python a fin de llamar a la API de AI Platform Training y de Prediction sin construir solicitudes HTTP de forma manual. Antes de ejecutar la siguiente muestra de código, debes configurar la autenticación.

  1. Guarda el ID del proyecto en el formato que necesitan las API ('projects/_projectname'):

    project_name = 'my_project_name'
    project_id = 'projects/{}'.format(project_name)
    
  2. Obtén una representación de Python de los servicios de AI Platform Training:

    cloudml = discovery.build('ml', 'v1')
    
  3. Crea la solicitud y envíala. Ten en cuenta que job_spec se creó en el paso anterior en el que le diste formato a los parámetros de configuración.

    request = cloudml.projects().jobs().create(body=job_spec,
                  parent=project_id)
    response = request.execute()
    
  4. Detecta cualquier error HTTP. La manera más sencilla es colocar el comando anterior en un bloque try:

    try:
        response = request.execute()
        # You can put your code for handling success (if any) here.
    
    except errors.HttpError, err:
        # Do whatever error response is appropriate for your application.
        # For this example, just send some text to the logs.
        # You need to import logging for this to work.
        logging.error('There was an error creating the training job.'
                      ' Check the details:')
        logging.error(err._get_reason())
    

¿Qué sigue?