Entrenamiento de modelos de scikit-learn a gran escala con el SDK (v1) de Azure Machine Learning

SE APLICA A:SDK de Python azureml v1

En este artículo, obtendrá información sobre cómo ejecutar los scripts de entrenamiento de scikit-learn con Azure Machine Learning.

Los scripts de ejemplo de este artículo se usan para clasifica imágenes de flores Iris para crear un modelo de Machine Learning basado en el conjunto de datos de Iris de scikit-learn.

Tanto si va a entrenar un modelo de scikit-learn de Machine Learning desde el principio como si va a incorporar un modelo existente a la nube, puede usar Azure Machine Learning para escalar horizontalmente trabajos de entrenamiento de código abierto mediante recursos de proceso en la nube elástica. Puede compilar, implementar y supervisar modelos de nivel de producción, así como crear versiones de dichos mismos, mediante Azure Machine Learning.

Requisitos previos

Puede ejecutar este código en una instancia de proceso de Azure Machine Learning o en su propia Jupyter Notebook:

  • Instancia de proceso de Azure Machine Learning

    • Complete Inicio rápido: Creación de recursos de Azure Machine Learning para empezar para crear una instancia de proceso. Cada instancia de proceso incluye un servidor de cuadernos dedicado cargado previamente con el SDK y el repositorio de ejemplos de cuadernos.
    • Seleccione la pestaña Cuaderno en el Estudio de Azure Machine Learning. Para encontrar un cuaderno completado y expandido, en la carpeta de entrenamiento de ejemplos, vaya a este directorio: carpeta how-to-use-azureml > ml-frameworks > scikit-learn > train-hyperparameter-tune-deploy-with-sklearn.
    • Puede usar el código rellenado previamente en la carpeta de entrenamiento de ejemplo para completar este tutorial.
  • Cree un servidor de Jupyter Notebook y ejecute el código en las secciones siguientes.

Configuración del experimento

En esta sección, para configurar el experimento de entrenamiento, se cargan los paquetes de Python necesarios, se inicializa un área de trabajo, se define el entorno de entrenamiento y se prepara el script de entrenamiento.

Inicialización de un área de trabajo

El área de trabajo de Azure Machine Learning es el recurso de nivel superior para el servicio. Proporciona un lugar centralizado para trabajar con todos los artefactos que cree. En el SDK de Python, puede acceder a los artefactos del área de trabajo mediante la creación de un objeto workspace.

Cree un objeto de área de trabajo a partir del archivo config.json creado en la sección de requisitos previos.

from azureml.core import Workspace

ws = Workspace.from_config()

Preparación de los scripts

En este tutorial ya se proporciona el script de entrenamiento train_iris.py. En la práctica, debería poder usar cualquier script de entrenamiento personalizado tal cual y ejecutarlo con Azure Machine Learning sin tener que modificar el código.

Nota:

  • En el script de entrenamiento proporcionado se muestra cómo registrar algunas métricas para la ejecución de Azure Machine Learning mediante el objeto Run dentro del script.
  • El script de entrenamiento proporcionado usa datos de ejemplo de la función iris = datasets.load_iris(). Para usar y acceder a sus propios datos, consulte Entrenamiento con conjuntos de datos en Azure Machine Learning para hacer que los datos estén disponibles durante el entrenamiento.

Definición del entorno

Para definir el entorno de Azure Machine Learning que encapsula las dependencias del script de entrenamiento, puede definir un entorno personalizado, o bien usar uno mantenido de Azure Machine Learning.

Uso de un entorno mantenido

Opcionalmente, si no quiere definir un entorno propio, Azure Machine Learning proporciona entornos mantenidos precompilados.

Si desea usar un entorno mantenido, puede ejecutar el siguiente comando en su lugar:

from azureml.core import Environment

sklearn_env = Environment.get(workspace=ws, name='AzureML-Tutorial')

Creación de un entorno personalizado

También puede crear un entorno personalizado propio. Defina las dependencias de Conda en un archivo YAML; en este ejemplo, el archivo se llama conda_dependencies.yml.

dependencies:
  - python=3.7
  - scikit-learn
  - numpy
  - pip:
    - azureml-defaults

Cree un entorno de Azure Machine Learning a partir de esta especificación de entorno de Conda. El entorno se empaquetará en un contenedor de Docker en tiempo de ejecución.

from azureml.core import Environment

sklearn_env = Environment.from_conda_specification(name='sklearn-env', file_path='conda_dependencies.yml')

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

Configuración y envío de la ejecución de entrenamiento

Creación de ScriptRunConfig

Cree un objeto ScriptRunConfig para especificar los detalles de configuración del trabajo de entrenamiento, incluido el script de entrenamiento, el entorno que se va a usar y el destino de proceso en el que se ejecutará. Cualquier argumento del script de entrenamiento se pasará mediante la línea de comandos si se especifica en el parámetro arguments.

El código siguiente configurará un objeto ScriptRunConfig para enviar el trabajo para su ejecución en el equipo local.

from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory='.',
                      script='train_iris.py',
                      arguments=['--kernel', 'linear', '--penalty', 1.0],
                      environment=sklearn_env)

Si en su lugar desea ejecutar el trabajo en un clúster remoto, puede especificar el destino de proceso deseado en el parámetro compute_target de ScriptRunConfig.

from azureml.core import ScriptRunConfig

compute_target = ws.compute_targets['<my-cluster-name>']
src = ScriptRunConfig(source_directory='.',
                      script='train_iris.py',
                      arguments=['--kernel', 'linear', '--penalty', 1.0],
                      compute_target=compute_target,
                      environment=sklearn_env)

Envío de la ejecución

from azureml.core import Experiment

run = Experiment(ws,'Tutorial-TrainIRIS').submit(src)
run.wait_for_completion(show_output=True)

Advertencia

Azure Machine Learning ejecuta scripts de entrenamiento mediante la copia de todo el directorio de origen. Si tiene información confidencial que no quiere cargar, use un archivo .ignore o no lo incluya en el directorio de origen. En su lugar, acceda a los datos mediante un conjunto de datos de Azure Machine Learning.

¿Qué ocurre mientras se lleva a cabo la ejecución?

Durante la ejecución del objeto, pasa por las fases siguientes:

  • Preparando: se crea una imagen de Docker según el entorno definido. La imagen se carga en el registro de contenedor del área de trabajo y se almacena en memoria caché para ejecuciones posteriores. Los registros también se transmiten al historial de ejecución y se pueden consultar para supervisar el progreso. Si se especifica un entorno mantenido en su lugar, se usará la imagen almacenada en caché que respalda el entorno mantenido.

  • Escalado: el clúster intenta escalar verticalmente si el clúster de Batch AI requiere más nodos para realizar la ejecución de los que se encuentran disponibles actualmente.

  • En ejecución: todos los scripts de la carpeta de scripts se cargan en el destino de proceso, se montan o se copian los almacenes de datos y se ejecuta el script. Las salidas de stdout y la carpeta ./logs se transmiten al historial de ejecución y se pueden usar para supervisar la ejecución.

  • Posprocesamiento: la carpeta ./outputs de la ejecución se copia en el historial de ejecución.

Guardado y registro del modelo

Una vez que haya entrenado el modelo, puede guardarlo y registrarlo en el área de trabajo. El registro del modelo permite almacenar los modelos y crear versiones de ellos en el área de trabajo para simplificar la administración e implementación de modelos.

Para guardar el modelo, agregue el código siguiente al script de entrenamiento, train_iris.py.

import joblib

joblib.dump(svm_model_linear, 'model.joblib')

Registre el modelo al área de trabajo con el código siguiente. Al especificar los parámetros model_framework, model_framework_version y resource_configuration, la implementación del modelo sin código está disponible. La implementación de un modelo sin código permite implementar directamente el modelo como un servicio web desde el modelo registrado, y el objeto ResourceConfiguration define el recurso de proceso del servicio web.

from azureml.core import Model
from azureml.core.resource_configuration import ResourceConfiguration

model = run.register_model(model_name='sklearn-iris', 
                           model_path='outputs/model.joblib',
                           model_framework=Model.Framework.SCIKITLEARN,
                           model_framework_version='0.19.1',
                           resource_configuration=ResourceConfiguration(cpu=1, memory_in_gb=0.5))

Implementación

El modelo que acaba de registrar se puede implementar exactamente de la misma manera que cualquier otro modelo registrado en Azure Machine Learning. El procedimiento de implementación contiene una sección sobre el registro de modelos, pero puede ir directamente a la [creación de un destino de procesohow-to-deploy-and-where.md#choose-a-compute-target) para la implementación, dado que ya tiene un modelo registrado.

(Versión preliminar) Implementación de modelo sin código

Importante

Esta característica actualmente está en su versión preliminar pública. Esta versión preliminar se ofrece sin Acuerdo de Nivel de Servicio y no se recomienda para cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

En lugar de la ruta de implementación tradicional, también puede usar la característica de implementación sin código (versión preliminar) para Scikit-learn. Se admite la implementación de modelo sin código para todos los tipos de modelos integrados de Scikit-learn. Mediante el registro del modelo como se ha indicado anteriormente con los parámetros model_framework, model_framework_version y resource_configuration, solo tiene que usar la función estática deploy() para implementar el modelo.

web_service = Model.deploy(ws, "scikit-learn-service", [model])

Nota

Estas dependencias se incluyen en el contenedor de inferencia Scikit-learn integrado previamente.

    - azureml-defaults
    - inference-schema[numpy-support]
    - scikit-learn
    - numpy

El procedimiento completo trata la implementación en Azure Machine Learning más detalladamente.

Pasos siguientes

En este artículo ha entrenado y registrado un modelo de Scikit-learn y ha aprendido sobre las opciones de implementación. Consulte estos otros artículos para más información sobre Azure Machine Learning.