Blog de Amazon Web Services (AWS)

Personalización y reutilización de modelos generados por el piloto automático de Amazon SageMaker

Por Simon Zamarin, Piali Das y Qingwei Li

 

El modo piloto automático de Amazon SageMaker entrena y ajusta automáticamente los mejores modelos de aprendizaje automático (ML) para problemas de clasificación o regresión, al tiempo que le permite mantener el control y total visibilidad. Esto no solo permite a los analistas de datos, desarrolladores y científicos de datos entrenar, ajustar e implementar modelos con poco o ningún código, sino que también puede revisar un cuaderno generado que describe todos los pasos que AutoPiloto tomó para generar el modelo. En algunos casos, es posible que también desee personalizar los pipelines generados por Autopilot con sus propios componentes personalizados.

En este post se muestra cómo crear y utilizar modelos con Autopilot en un par de clics y, a continuación, describe cómo adaptar el código generado por SageMaker Autopilot con sus propios selectores de funciones y transformadores personalizados para añadir características específicas del dominio. También utilizamos la capacidad de funcionamiento en seco de Autopilot, en la que Autopilot solo genera código para preprocesadores de datos, algoritmos y ajustes de parámetros de algoritmos. Esto se puede hacer simplemente eligiendo la opción ejecutar un piloto para crear un cuaderno con definiciones de candidatos.

 

 

Personalización del Piloto Automático

Personalizar modelos de piloto automático, en la mayoría de los casos, no es necesario. Autopilot crea modelos de alta calidad que se pueden implementar sin necesidad de personalización. Autopilot realiza automáticamente el análisis exploratorio de sus datos y decide qué características pueden producir los mejores resultados. Como tal, presenta una baja barrera de entrada a ML para una amplia gama de usuarios, desde analistas de datos hasta desarrolladores, que desean agregar capacidades AI/ML a su proyecto.

Sin embargo, los usuarios más avanzados pueden aprovechar el enfoque transparente de AutoPiloto hacia AutoML para reducir drásticamente el trabajo pesado indiferenciado que prevalece en los proyectos ML. Por ejemplo, puede que desee que AutoPiloto utilice transformaciones de funciones personalizadas que utiliza su empresa, o técnicas de imputación personalizadas que funcionen mejor en el contexto de los datos. Puede preprocesar sus datos antes de llevarlos a SageMaker Autopilot, pero eso implicaría salir de Piloto Automático y mantener un pipeline de preprocesamiento independiente. Alternativamente, puede utilizar rl pipeline de procesamiento de datos de Autopilot para dirigir Autopilot a utilizar sus transformaciones e imputaciones personalizadas. La ventaja de este enfoque es que puede centrarse en la recopilación de datos y dejar que Autopilot haga el trabajo pesado para aplicar las transformaciones e imputaciones de características deseadas, y luego encontrar e implementar el mejor modelo.

 

Preparación de sus datos y trabajo de piloto automático

Comencemos creando un experimento de piloto automático utilizando el conjunto de datos Tipo de cubierta forestal .

  1. Descargue el conjunto de datos y cárguelo en Amazon Simple Storage Service (Amazon S3).

Asegúrese de crear el usuario de Amazon SageMaker Studio en la misma región que el depósito de S3.

2. Abra SageMaker Studio.

3. Cree un trabajo, proporcionando la siguiente información:

    1. Nombre del experimento
    2. Ubicación del dataset de formación
    3. Bucket de S3 para guardar los datos de salida del piloto automático
    4. Tipo de problema de ML

Su trabajo de piloto automático ya está listo para ejecutarse. En lugar de ejecutar un experimento completo, elegimos dejar que Autopilot genere un cuaderno con definiciones de candidatos.

 

 

Inspección de los pipelines  generadas por piloto automático

SageMaker Autopilot automatiza las tareas clave en una pipeline ML. Explora cientos de modelos compuestos por diferentes características, algoritmos e hiperparámetros para encontrar el que mejor se adapte a sus datos. También proporciona una tabla de líderes de 250 modelos para que pueda ver cómo se desempeñó cada candidato de modelo y elegir el mejor para implementar. Exploramos esto con más profundidad en la sección final de este post.

Una vez finalizado el experimento, puede inspeccionar las pipelines candidatas generadas. Elcandidato se refiere a la combinación de pasos de preprocesamiento de datos y selección de algoritmos utilizados para entrenar los 250 modelos. El cuaderno de generación de candidatos contiene código Python que Autopilot usó para generar estos candidatos.

5247080863753079

07/26

983

  1. Elija Abrir portátil de generación de candidatos.
  2. Abra su cuaderno.
  3. Elija Importar para importar el Jupyter notebook  al espacio de trabajo.
  4. Cuando se le solicite, elija Python 3 (Data Science) como núcleo.
  5. Dentro del portátil, ejecute todas las celdas de la configuración de SageMaker

 

 

Esto copia el código de preparación de datos generado por AutoPiloto en su espacio de trabajo.

En el directorio raíz de SageMaker Studio, ahora debería ver una carpeta con el nombre de su experimento de piloto automático. El nombre de la carpeta debe ser <Your Experiment Name> —artefactos. Ese directorio contiene dos subdirectorios: generated_module y sagemaker_automl. El directorio generated_module contiene los artefactos de procesamiento de datos generados por Autopilot.

Hasta ahora, el trabajo de piloto automático ha analizado el conjunto de datos y generado pipelines candidatas ML que contienen un conjunto de transformadores de entidades y un algoritmo ML. Desplácese por la carpeta generated_module hasta el directorio candidate_data_processors , que contiene 12 archivos:

  • dpp0.py—dpp9.py — Candidatos de procesamiento de datos que el piloto automático generó
  • trainer.py — Script que ejecuta los candidatos de procesamiento de datos
  • sagemaker_serve.py — Script para ejecutar la pipeline de preprocesamiento en tiempo de inferencia

 

 

Si examina cualquiera de los archivos dpp*.py , puede observar que Autopilot generó código que crea pipelines sckit-learn , que puede extender fácilmente con sus propias transformaciones. Puede hacer esto modificando directamente los archivos dpp*.py existentes o extendiendo las pipelines después de que se crean instancias en el archivo trainer.py , en el que define un transformador que se puede llamar dentro de dpp*.pyexistente archivos. El segundo enfoque se recomienda porque es más mantenible y le permite extender todas los pipelines  de procesamiento propuestas a la vez en lugar de modificar cada una de ellas individualmente

 

Uso de transformadores específicos

Es posible que desee llamar a un transformador específico desde sckit-learn o usar uno implementado en el paquete de código abierto sagemaker-scikit-learn-extension. Este último proporciona una serie de estimadores y transformadores compatibles con scikit-learn-que puede utilizar. Por ejemplo, implementa el codificador Weight of Evidence (WoE), una codificación a menudo utilizada para características categóricas en el contexto de la clasificación binaria.

Para utilizar transformadores adicionales, primero amplíe las instrucciones de importación en el archivo trainer.py . Para nuestro caso de uso, agregamos el siguiente código:

de sklearn.pipeline import FeatuReunion, Pipeline
de sklearn.ensemble importar RandomForestClassifier
de sklearn.feature_selection importar SelectFromModel
desde sagemaker_sklearn_extension.preprocesamiento de importación RobustStandardScaler

Si, al modificar trainer.py, encuentra errores al ejecutar la celda del Jupyter notebook  que contiene automl_interactive_runner.fit_data_transformers (…), puede obtener información de depuración de Amazon CloudWatch en el grupo de registro /aws/sageMaker/TrainingJobs.

 
       

Implementación de transformadores personalizados

Volviendo al caso de uso tipo cubierta forestal, tenemos características para la distancia vertical y horizontal a la hidrología. Queremos ampliar esto con una transformación de característica adicional que calcula la distancia de línea recta a la hidrología. Podemos hacer esto agregando un archivo adicional en el directorio candidate_data_processors donde definimos nuestra transformación personalizada. Consulte el siguiente código:

# additional_features.py

importar numpy como np

de sklearn.base importar BaseEstimator, TransformerMixin


clase HydrologyDistance (BaseEstimator, TransformerMixin):



    def __init__ (self, feature_index):

        sí mismo._feature_index = feature_index

     

    def fit (auto, X, y = Ninguno):

        retorno auto

   

    transformada def (auto, X, y = Ninguna):

        X = x.copy () .astype (np.float32)

        a, b = np.split (X [:, auto._feature_index], 2, ejes=1)

        devuelve np.hypot (a, b) .remodelar (-1,1)

Dentro del archivo trainer.py , importamos el módulo additional_features y agregamos nuestro transformador HydrologyDistance como una tubería paralela a los generados existentes.

Además de nuestro transformador de características adicional, también agregamos un selector de características a nuestra pipeline para seleccionar solo las entidades con la mayor importancia según lo determinado por un RandomForestClassifier:

def update_feature_transformer (encabezado, feature_transformer):

    «" "Personalizar el transformador de función. Devuelve por defecto


    encabezado: SageMaker_Sklearn_Extension.externals.header

        Objeto del encabezado de clase, utilizado para asignar los nombres de las columnas al índice apropiado


    feature_transformer: obj

        transformador aplicado a las entidades


    Devoluciones

    —

    feature_transformer: obj

        transformador actualizado que se aplicará a las entidades

    «"»

   
    features_to_transform = header.as_feature_indices (

        [

        «Horizontal_Distance_To_Hidrología»,

        'Vertical_Distance_To_Hidrología'

        ]

        )


    # nueva pipeline con transformaciones personalizadas

    additional_pipeline = Pipeline ([(«distancia», HydrologyDistance (features_to_transform)),

                                    («ScaleDistance», RobustStandardScaler ())

                                   ])

    # combinarse con la pipeline generada por AutoPiloto

    combined_transformer = FeatuReIon ([(«adicional», adicional_pipeline),

                                         («existente», feature_transformer)]

                                       )

    # realizar la selección de entidades en la tubería combinada

    feature_selector = SelectFromModel (RandomForestClassifier (n_estimators = 10))

   

    feature_transformer = Pipeline ([(«feature_engineering», combined_transformer),

                                    («feature_selection», feature_selector)]

                                  )

    devolver feature_transformerde adicional_features_import *

Correr inferencias

A continuación, tenemos que copiar nuestro archivo additional_features.py en el directorio del modelo para que esté disponible en el momento de la inferencia. Una función serialize_code se proporciona específicamente para esto. Modifique la función según el código de ejemplo siguiente para asegurarse de que se incluye con el artefacto del modelo. Se resalta la línea de código que requiere modificación.

def serialize_code (dest_dir, processor_file):

    «" "Copia el código necesario para la inferencia en el directorio de destino

    De forma predeterminada, sagemaker_serve.py y el archivo del módulo del procesador se copian.

    Para serializar cualquier archivo.py adicional para un transformador personalizado, agréguelo al

    listar archivos_to_serialize.


    dest_dir: str

        destino donde se serializarían los archivos python

    «"»

    archivos_to_serialize = [

        os.path.join (os.path.dirname (__file__), 'sagemaker_serve.py'),

        archivo_procesador]

   

    # Incluir el código del transformador personalizado en el directorio del modelo

    archivos_to_serialize.append (os.path.join (os.path.dirname (__file__), 'additional_features.py'))


    os.makedirs (dest_dir, exist_OK=True)

    para el origen en files_to_serialize:

        shutil.copy (source, os.path.join (dest_dir, os.path.basename (fuente)))

Finalmente, necesitamos modificar la función model_fn en sagemaker_serve.py para copiar el archivo additional_features.py en el directorio de trabajo actual para que la pipeline scikit-learn pueda importar el archivo en el momento de la inferencia:

importar shutil # asegúrese de que esto se importe para que el archivo se pueda copiar

def model_fn (model_dir):

    «" "Carga el modelo.


    El modelo de servidor modelo SageMaker Scikit-Learn carga modelo invocando este método.


    Parámetros
    —

    model_dir: str

        el directorio donde residen los archivos de modelo


    Devoluciones
    —

    : AutomlTransformer

        objeto de modelo deserializado que se puede utilizar para servir modelos

    «"»

    shutil.copyfile (os.path.join (model_dir, 'additional_features.py'), 'additional_features.py')

    carga de retorno (nombre_archivo = os.path.join (model_dir, 'model.joblib'))

Cuando termine todos estos pasos, puede volver al Jupyter notebook  de definición de candidato y ejecutar las celdas restantes. Las transformaciones adicionales definidas se aplican a todos los candidatos del pipeline de procesamiento de datos seleccionados y también se incluyen en el pipeline de inferencia.

 

Implementación del mejor modelo

À medida que o Autopilot executa os pipelines candidatos, ele itera mais de 250 combinações de pipelines de processamento, tipos de algoritmos e hiperparâmetros de modelo. Quando o processo estiver concluído, você pode navegar até a seção final do notebook (Seleção de Modelo e Implantação) e visualizar uma tabela de classificação dos modelos Autopilot gerados. A execução das células de notebook restantes implanta automaticamente o modelo que produziu os melhores resultados e o expõe como um endpoint REST API.

 

 

Conclusiones

En este post, demostramos cómo personalizar un pipeline de entrenamiento e inferencia de Amazon  Sagemaker Autopilot con su propio código de ingeniería de funciones. Primero dejamos que Autopilot genere definiciones de candidatos sin ejecutar el entrenamiento real y ajuste de hiperparámetros. Luego implementamos transformadores personalizados que representan la ingeniería de características personalizadas que queremos llevar al piloto automático. Para obtener más información sobre el piloto automático, consulte Amazon SageMaker Autopilot.

 

Este artículo fue traducido del Blog da AWS en Inglês.

 


Sobre os Autores

Simon Zamarin es Arquitecto de Soluciones AI/ML cuyo objetivo principal es ayudar a los clientes a extraer valor de sus activos de datos. En su tiempo libre, Simon disfruta pasar tiempo con la familia, leer ciencia ficción, y trabajar en varios proyectos de bricolaje.

 

 

 

 

Qingwei Li es especialista en aprendizaje automático en Amazon Web Services. Recibió su doctorado en Investigación Operativa después de romper la cuenta de la beca de investigación de su asesor y no entregar el Premio Nobel que prometió. Actualmente ayuda a clientes del sector de seguros y servicios financieros a crear soluciones de aprendizaje automático en AWS. En su tiempo libre, le gusta leer y enseñar.

 

 

 

Piali Das es ingeniero sénior de software en el equipo de piloto automático de AWS SageMaker. Anteriormente contribuyó a la construcción de algoritmos de SageMaker. Ella disfruta de la programación científica en general y ha desarrollado un interés por el aprendizaje automático y los sistemas distribuidos.

 

 

 

 

Revisor

Sergio Beltrán es arquitecto de soluciones especialista en AI/ML en AWS. En su rol apoya a los clientes a encontrar la mejor solución y arquitectura para sus necesidades y aprovechar los servicios de  AI/ML para generar innovación y mejorar la productividad. Antes de AWS, trabajó como data scientist y gerente de business development en la industria Telco.