Ejecuta un trabajo de entrenamiento

Cloud Machine Learning Engine 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 cuando ejecutas gcloud ml-engine jobs submit training de la línea de comandos o cuando envías 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 junto con las dependencias inusuales a un depósito de Cloud Storage. Nota: Si usas la línea de comandos de gcloud para enviar tu trabajo, puedes empaquetar la aplicación y enviar el trabajo en el mismo paso.

Configura el trabajo

Pasa tus parámetros al servicio de entrenamiento cuando configures los miembros del recurso Job, que incluye los elementos del recurso TrainingInput.

Si usas la herramienta de línea de comandos de gcloud para enviar tus trabajos de entrenamiento, puedes realizar las siguientes acciones:

  • Definir los parámetros de entrenamiento más comunes como marcadores del comando gcloud ml-engine jobs submit training.
  • Pasar los parámetros restantes a un archivo de configuración YAML, denominado config.yaml por regla general. El archivo de configuración refleja la estructura de la representación JSON del recurso Job. Pasa la ruta de tu archivo de configuración en el marcador --config del comando de gcloud ml-engine jobs submit training. Entonces, si la ruta a tu 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 tu trabajo. Esto puede ser el nivel de escala CUSTOM, en cuyo caso también especificas explícitamente la cantidad y el tipo de máquinas que se usarán.
Paquete de aplicación de entrenamiento (packageUris)
Una aplicación de entrenamiento empaquetada que está habilitada a etapa en una ubicación de Cloud Storage. Si usas la herramienta de línea de comandos de gcloud, el paso de empaquetado de la aplicación está automatizado en gran medida. Consulta los detalles en la guía para empaquetar tu aplicación.
Nombre del módulo (pythonModule)
El nombre del módulo principal de tu paquete. El módulo principal es el archivo Python que llamas para iniciar la aplicación. Si usas el comando de gcloud para enviar tu trabajo, especifica el nombre del módulo principal en el marcador --module-name. Consulta la guía para empaquetar tu aplicación.
Región (region)
La región de Compute Engine en la que deseas que tu trabajo se ejecute. Debes ejecutar tu trabajo de entrenamiento en la misma región del depósito de Cloud Storage que almacena tus datos de entrenamiento. Consulta las regiones disponibles para los servicios de Cloud ML Engine.
Directorio de trabajo (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 Platform debe tener acceso de escritura a este depósito. El servicio de capacitación pasa automáticamente la ruta que estableciste para el directorio de trabajo a tu 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 del entorno de ejecución (runtimeVersion)

La versión de Cloud ML Engine que se utilizará en el trabajo. Si no especificas una versión del entorno de ejecución, el servicio de entrenamiento usa la versión 1.0 predeterminada en el entorno de ejecución de Cloud ML Engine.

Versión de Python (pythonVersion)

La versión de Python que se utilizará en el trabajo. Python 3.5 está disponible para la versión 1.4 o superior del entorno de ejecución de Cloud ML Engine. Si no especificas una versión de Python, el servicio de entrenamiento usa Python 2.7.

Dales formato a tus parámetros de configuración

Cómo especificas los detalles de tu configuración depende de cómo comienzas tu trabajo de entrenamiento:

gcloud

Proporciónale los detalles de configuración del trabajo al comando de gcloud ml-engine jobs submit training. Existen dos formas de hacerlo:

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

Incluso si usas un archivo YAML, ciertos detalles se deben proporcionar como marcadores de línea de comandos. Por ejemplo, debes proporcionar el marcador --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, también debes proporcionar el marcador --region o configurar una región predeterminada para tu cliente de gcloud. Estas opciones, y cualquier otra que proporciones como marcadores 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 marcadores 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, pero no todos, y supone que proporcionas los otros detalles requeridos como marcadores 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: '1.12'
  pythonVersion: '3.5'

En el ejemplo anterior, se especifica la versión 3.5 de Python, que está disponible si usas la versión 1.4 o superior del entorno de ejecución de Cloud ML Engine.

Python

Cuando envíes un trabajo de entrenamiento con la biblioteca cliente de las API de Google para Python, establece tu configuración en un diccionario con la misma estructura del recurso Job. Esto toma la forma de un diccionario con dos claves: jobId y trainingInput, con sus respectivos datos, como nombre del trabajo, y un segundo diccionario con claves para los objetos del recurso TrainingInput.

En el siguiente ejemplo, se 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': '1.12',
    'pythonVersion': '3.5'}

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 exactamente como se muestra para que los nombres coincidan en los recursos Job y TrainingInput.

En el ejemplo anterior, se especifica la versión 3.5 de Python, que está disponible si usas la versión 1.4 o superior del entorno de ejecución de Cloud ML Engine.

Envía el trabajo

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

  • Parámetros de configuración del trabajo. Cloud ML Engine necesita estos valores para configurar los recursos en la nube y, además, implementar tu aplicación en cada nodo del clúster de procesamiento.
  • Argumentos del usuario o parámetros de aplicación. Cloud ML Engine pasa el valor de estos marcadores a tu aplicación.

Crea tu trabajo:

gcloud

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

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

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

El siguiente envío de trabajo 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 a través de los marcadores de la línea de comandos. No es necesario usar un archivo config.yaml:

gcloud ml-engine jobs submit training $JOB_NAME \
        --scale-tier basic \
        --package-path $TRAINER_PACKAGE_PATH \
        --module-name $MAIN_TRAINER_MODULE \
        --job-dir $JOB_DIR \
        --region $REGION \
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value

El siguiente envío de trabajos 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 otros detalles a través de los marcadores de la línea de comandos:

gcloud ml-engine jobs submit training $JOB_NAME \
        --package-path $TRAINER_PACKAGE_PATH \
        --module-name $MAIN_TRAINER_MODULE \
        --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 tanto en tu archivo de configuración (config.yaml) como en un marcador de la 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, dado que 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 la línea de comandos.
  • Puedes definir todos los USER_ARGS que necesites. Cloud ML Engine pasa --user_first_arg, --user_second_arg, y así sucesivamente, a tu aplicación.

Python

Puedes usar la biblioteca cliente de las API de Google para Python a fin de llamar a la API de Cloud Machine Learning Engine sin crear solicitudes HTTP de forma manual. Antes de ejecutar la siguiente muestra de código, debes configurar la autenticación.

  1. Guarda tu 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 Cloud ML Engine:

    cloudml = discovery.build('ml', 'v1')
    
  3. Crea tu solicitud y envíala:

    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?

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

Enviar comentarios sobre…

Cloud ML Engine para TensorFlow