Configuración y envío de trabajos de entrenamiento

SE APLICA A:SDK de Python azureml v1

En este artículo, aprenderá a configurar y enviar trabajos de Azure Machine Learning para entrenar los modelos. Los fragmentos de código explican las partes clave de la configuración y el envío de un script de entrenamiento. A continuación, use uno de los cuadernos de ejemplo para buscar ejemplos completos del trabajo de un extremo a otro.

Al realizar el entrenamiento, es habitual comenzar en el equipo local y, a continuación, escalar horizontalmente a un clúster basado en la nube. Con Azure Machine Learning, puede ejecutar el script en varios destinos de proceso sin tener que cambiar el script de entrenamiento.

Todo lo que debe hacer es definir el entorno de cada destino de proceso con una configuración de trabajo de script. Después, cuando desee ejecutar el experimento de entrenamiento en un destino de proceso diferente, especifique la configuración de trabajo para ese proceso.

Requisitos previos

¿En qué consiste una configuración de ejecución de script?

Una configuración ScriptRunConfig se usa para configurar la información necesaria para enviar un trabajo de entrenamiento como parte de un experimento.

Envíe el experimento de entrenamiento mediante un objeto ScriptRunConfig. Este objeto incluye:

  • source_directory: el directorio de origen que contiene el script de entrenamiento.
  • script: el script de entrenamiento que se va a ejecutar
  • compute_target: el destino de proceso en el que se va a ejecutar
  • environment: el entorno que se va a usar al ejecutar el script
  • y algunas opciones configurables adicionales (consulte la documentación de referencia para obtener más información)

Entrenamiento de un modelo

El patrón de código para enviar un trabajo de entrenamiento es el mismo para todos los tipos de destinos de proceso:

  1. Creación de un experimento para su ejecución
  2. Creación del entorno en el que se ejecutará el script
  3. Creación de una configuración ScriptRunConfig, que especifica el destino de proceso y el entorno
  4. Enviar el archivo
  5. Espere a que el trabajo se complete

También puede:

Creación de un experimento

Cree un experimento en el área de trabajo. Un experimento es un contenedor ligero que ayuda a organizar los envíos de trabajos y a realizar un seguimiento del código.

SE APLICA A:SDK de Python azureml v1

from azureml.core import Experiment

experiment_name = 'my_experiment'
experiment = Experiment(workspace=ws, name=experiment_name)

Selección de un destino de proceso

Seleccione el destino de proceso en el que se ejecutará el script de entrenamiento. Si no se especifica ningún destino de proceso en ScriptRunConfig, o bien si compute_target='local', Azure Machine Learning ejecutará el script localmente.

El código de ejemplo de este artículo da por sentado que ya ha creado un destino de proceso my_compute_target en la sección "Requisitos previos".

Nota

Creación de un entorno

Los entornos de Azure Machine Learning son una encapsulación del entorno en el que se produce el entrenamiento del aprendizaje automático. Especifican los paquetes, la imagen de Docker, las variables de entorno y la configuración de software de Python en torno a los scripts de entrenamiento y puntuación. También especifican los entornos de ejecución (Python, Spark o Docker).

Puede definir un entorno propio, o bien usar un entorno mantenido de Azure Machine Learning. Los entornos mantenidos son entornos predefinidos que están disponibles en el área de trabajo de forma predeterminada. Estos entornos están respaldados por imágenes de Docker en caché, lo que reduce el costo de preparación del trabajo. Consulte Entornos mantenidos de Azure Machine Learning para obtener la lista completa de entornos mantenidos disponibles.

En el caso de un destino de proceso remoto, puede usar uno de los siguientes entornos seleccionados populares para comenzar:

SE APLICA A:SDK de Python azureml v1

from azureml.core import Workspace, Environment

ws = Workspace.from_config()
myenv = Environment.get(workspace=ws, name="AzureML-Minimal")

Para obtener más información y detalles sobre los entornos, consulte Creación y uso de entornos de software en Azure Machine Learning.

Destino de proceso local

Si el destino de proceso es su máquina local, es su responsabilidad garantizar que todos los paquetes necesarios estén disponibles en el entorno de Python en el que se ejecutará el script. Use python.user_managed_dependencies para usar el entorno de Python actual (o el de Python en la ruta de acceso que especifique).

SE APLICA A:SDK de Python azureml v1

from azureml.core import Environment

myenv = Environment("user-managed-env")
myenv.python.user_managed_dependencies = True

# You can choose a specific Python environment by pointing to a Python path 
# myenv.python.interpreter_path = '/home/johndoe/miniconda3/envs/myenv/bin/python'

Creación de la configuración de trabajo de script

Ahora que tiene un destino de proceso (my_compute_target, consulte Requisitos previos, y un entorno (myenv, consulte Creación de un entorno), cree una configuración de trabajo de script que ejecute el script de entrenamiento (train.py) ubicado en el directorio project_folder:

SE APLICA A:SDK de Python azureml v1

from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory=project_folder,
                      script='train.py',
                      compute_target=my_compute_target,
                      environment=myenv)

Si no especifica un entorno, se creará un entorno predeterminado.

Si tiene argumentos de la línea de comandos que desee pasar al script de entrenamiento, puede especificarlos a través del parámetro arguments del constructor ScriptRunConfig, por ejemplo, arguments=['--arg1', arg1_val, '--arg2', arg2_val].

Si desea invalidar el tiempo máximo predeterminado permitido para el trabajo, puede hacerlo a través del parámetro max_run_duration_seconds. El sistema intentará cancelar automáticamente el trabajo si tarda más que este valor.

Especificación de una configuración del trabajo distribuida

En caso de que quiera ejecutar un trabajo de entrenamiento distribuido, indique la configuración específica del trabajo distribuido en cuestión al parámetro distributed_job_config. Entre los tipos de configuración admitidos se incluyen MpiConfiguration, TensorflowConfiguration y PyTorchConfiguration.

Para obtener más información y ejemplos sobre la ejecución de trabajos Horovod, TensorFlow y PyTorch distribuidos, consulte:

Envío del experimento

SE APLICA A:Azure ML del SDK de Python v1

run = experiment.submit(config=src)
run.wait_for_completion(show_output=True)

Importante

Cuando envíe el trabajo de entrenamiento, se creará una instantánea del directorio que contiene los scripts de entrenamiento y se enviará al destino de proceso. También se almacena como parte del experimento del área de trabajo. Si cambia los archivos y vuelve a enviar el trabajo, solo se cargarán los archivos cambiados.

Para evitar que se incluyan archivos innecesarios en la instantánea, cree un archivo ignore (.gitignore o .amlignore) en el directorio. Agregue los archivos y directorios que se van a excluir a este archivo. Para obtener más información sobre la sintaxis que se debe usar dentro de este archivo, vea sintaxis y patrones para .gitignore. El archivo .amlignore usa la misma sintaxis. Si ambos archivos existen, el archivo .amlignore se usa y el archivo .gitignore, no.

Para más información sobre las instantáneas, consulte Instantáneas.

Importante

Carpetas especiales: dos carpetas, outputs y logs, reciben un tratamiento especial por parte de Azure Machine Learning. Durante el entrenamiento, si escribe archivos en las carpetas llamadas salidas y registros relativas al directorio raíz (./outputs y ./logs, respectivamente), estos archivos se cargarán automáticamente en su historial de trabajos, por lo que tendrá acceso a estos una vez completado su trabajo.

Para crear artefactos durante el entrenamiento (por ejemplo, archivos de modelo, puntos de control, archivos de datos o imágenes trazadas), escríbalos en la carpeta ./outputs.

De forma similar, puede escribir cualquier registro desde su trabajo de entrenamiento en la carpeta ./logs. Para usar la integración TensorBoard de Azure Machine Learning, asegúrese de escribir sus registros de TensorBoard en esta carpeta. Mientras su trabajo está en curso, podrá iniciar TensorBoard y transmitir estos registros. Posteriormente, también podrá restaurar los registros desde cualquiera de sus trabajos anteriores.

Por ejemplo, para descargar un archivo escrito en la carpeta salidas en su equipo local después de su trabajo de entrenamiento remoto: run.download_file(name='outputs/my_output_file', output_file_path='my_destination_path')

Integración y seguimiento de Git

Cuando se inicia un trabajo de entrenamiento en el que el directorio de origen es un repositorio de GIT local, se almacena información sobre el repositorio en el historial de trabajos. Para más información, consulte Integración de Git con Azure Machine Learning.

Ejemplos de cuadernos

Consulte estos cuadernos para ver ejemplos de configuración de trabajos en diversos escenarios de entrenamiento:

Siga las instrucciones del artículo Exploración de Azure Machine Learning con cuadernos de Jupyter para aprender a ejecutar cuadernos.

Solución de problemas

  • AttributeError: el objeto "RoundTripLoader" no tiene un atributo "comment_handling" : este error procede de la nueva versión (v0.17.5) de ruamel-yaml, una dependencia azureml-core, que introduce un cambio importante en azureml-core. Para corregir este error, ejecute pip uninstall ruamel-yaml e instale una versión diferente de ruamel-yaml para desinstalar ruamel-yaml; las versiones admitidas son v0.15.35 a v0.17.4 (inclusive). Para hacerlo, ejecute pip install "ruamel-yaml>=0.15.35,<0.17.5".

  • Error de trabajo con jwt.exceptions.DecodeError: mensaje de error exacto: jwt.exceptions.DecodeError: It is required that you pass in a value for the "algorithms" argument when calling decode().

    Considere la posibilidad de actualizar a la versión más reciente de azureml-core: pip install -U azureml-core.

    If. se encuentra este problema en los trabajos locales, compruebe la versión de PyJWT instalada en el entorno en el que se inician esos trabajos. Las versiones compatibles de PyJWT son < 2.0.0. Desinstale PyJWT del entorno si la versión es >= 2.0.0. Puede comprobar la versión de PyJWT y desinstalar e instalar la versión correcta de la siguiente manera:

    1. Inicie un shell de comandos y active el entorno de Conda donde está instalado azureml-core.
    2. Escriba pip freeze y busque PyJWT; si se encuentra, la versión indicada debe ser anterior a la 2.0.0.
    3. Si la versión indicada no es una versión compatible, escriba pip uninstall PyJWT en el shell de comandos y escriba "y" (sí) para confirmar la operación.
    4. Instalación mediante pip install 'PyJWT<2.0.0'

    If. va a enviar un entorno creado por el usuario con el trabajo, considere la posibilidad de usar la versión más reciente de azureml-core en ese entorno. Las versiones >= 1.18.0 de azureml-core ya se anclan a PyJWT < 2.0.0. Si necesita usar una versión de azureml-core < 1.18.0 en el entorno que envía, asegúrese de especificar PyJWT < 2.0.0 en las dependencias de PIP.

  • ModuleErrors (ningún módulo con nombre): Si está ejecutando ModuleErrors mientras envía experimentos en Azure Machine Learning, el script de entrenamiento espera que se instale un paquete pero no se agrega. Una vez que proporcione el nombre del paquete, Azure Machine Learning instala el paquete en el entorno que se usa para el trabajo de entrenamiento.

    If. usa Estimadores para enviar experimentos, puede especificar un nombre de paquete mediante el parámetro pip_packages o conda_packages en el estimador basado en el origen desde el que desea instalar el paquete. También puede especificar un archivo yml con todas sus dependencias mediante conda_dependencies_file o enumerar todos sus requisitos de pip en un archivo txt con el parámetro pip_requirements_file. Si tiene un objeto de entorno de Azure Machine Learning propio para invalidar la imagen predeterminada que usa el estimador, puede especificar ese entorno mediante el parámetro environment del constructor del estimador.

    Las imágenes de Docker mantenidas de Azure Machine Learning y su contenido se pueden ver en Contenedores de Azure Machine Learning. Las dependencias específicas del marco se enumeran en la documentación del marco respectivo:

    Nota

    Si cree que un paquete concreto es lo suficientemente común como para agregarlo en imágenes y entornos mantenidos por Azure Machine Learning, cree una incidencia de GitHub en Contenedores de Azure Machine Learning.

  • NameError (Nombre no definido), AttributeError (El objeto no tiene ningún atributo) : Esta excepción debería provenir de sus scripts de entrenamiento. Puede consultar los archivos de registro de Azure Portal para obtener más información sobre el nombre específico no definido o el error de atributo. Desde el SDK, puede usar run.get_details() para ver el mensaje de error. Esto también mostrará una lista de todos los archivos de registro generados para su trabajo. Asegúrese de revisar su script de entrenamiento y corrija el error antes de volver a enviar el trabajo.

  • Eliminación de trabajos o experimentos: los experimentos se pueden archivar con el método Experiment.archive o desde la vista de la pestaña Experimento en el cliente del Estudio de Azure Machine Learning a través del botón "Archivar experimento". Esta acción oculta el experimento de listas de consultas y vistas, pero no lo elimina.

    Actualmente no se admite la eliminación permanente de experimentos ni trabajos individuales. Para obtener más información sobre cómo eliminar recursos del área de trabajo, consulte Exportación o eliminación de los datos del área de trabajo de Machine Learning Service.

  • El documento de métricas es demasiado grande: Azure Machine Learning tiene límites internos en cuanto al tamaño de los objetos de métricas que se pueden registrar a la vez desde un trabajo de entrenamiento. Si aparece el error "El documento de métricas es demasiado grande" al registrar una métrica con valores de lista, intente dividir la lista en fragmentos más pequeños, por ejemplo:

    run.log_list("my metric name", my_metric[:N])
    run.log_list("my metric name", my_metric[N:])
    

    De forma interna, Azure Machine Learning concatena los bloques con el mismo nombre de métrica en una lista contigua.

  • El destino de proceso tarda mucho en iniciarse: las imágenes de Docker de los destinos de proceso se cargan desde Azure Container Registry (ACR). De manera predeterminada, Azure Machine Learning crea una instancia de ACR que usa el nivel de servicio Básico. Si se cambia la instancia de ACR del área de trabajo al nivel Estándar o Premium, puede reducirse el tiempo que se tarda en compilar y cargar imágenes. Para más información, consulte Niveles de servicio de Azure Container Registry.

Pasos siguientes