Blog de Amazon Web Services (AWS)

Introducción a SageMaker Studio

Por Sergio Beltrán, AI/ML Specialist SA, MCO

 

Amazon SageMaker Studio, referido a partir de ahora como Studio es el primer entorno de desarrollo integrado (IDE) para Machine Learning (ML) que permite cambiar la instancia de computo fácilmente. Esta entrada consiste en una guía básica para configurar un dominio, clonar un repositorio de Github, probar algunas de las funcionalidades incluidas, particularmente creación de modelos, implementación y monitoreo de los mismos,  finalmente cómo des-aprovisionarlo.

 

Creando un dominio de Studio

Al abrir la consola de AWS haga click en servicios y abra Amazon Sagemaker, una vez dentro verificar que se está en una de las regiones donde Studio se encuentra disponible, la lista aquí.

En la sección Get started hay dos opciones, Quick start o estándar. En la configuración rápida, alcanza con escoger el nombre del usuario y el execution role, que manejará los accesos al resto de los servicios de AWS desde las instancias de notebook de Studio. En la configuración estándar se deberá escoger el método de autenticación (SSO o IAM), los permisos y otros detalles. Una vez elegido todo esto, se deberá aguardar unos minutos para el aprovisionamiento.

 

 

1. Clonando un repositorio de github en Studio

Paso 1: Hacer clic en Open Studio para abrir el IDE

Paso 2: Abrir una terminal dentro de Studio (File > New >Terminal)

Paso 3: Para clonar el repositorio ejecutar el siguiente comando en la terminal.

git clone https://github.com/awslabs/amazon-sagemaker-examples.git

Paso 4: Usar el file manager de Studio para encontrar y abrir el notebook dentro de la carpeta getting_started.

 

2.      Notebook de predicción de Churn

El notebook utiliza datos de una empresa de telecomunicaciones para automatizar la identificación de clientes no satisfechos, y de esta manera poder ofrecer incentivos antes de que ellos dejen de consumir los servicios/productos de la empresa (churn).

Este notebook recorre varias funcionalidades importantes de Studio como los SageMaker Training Jobs (XGboost modo algoritmo y modo framework), Experimentos (Trials), Debugging de modelos, puesta en producción (deployment), cómo invocar al Endpoint (inferencia),  monitoreo de modelos y exploración de gráficos y secciones que aportan valor a Studio.

Los datos usados en este tutorial se encuentran en el repositorio una pre visualización seria:

 

 

3. Amazon SageMaker Experiments

Un experimento es una colección de ensayos (trials), es decir, un grupo de trabajos (jobs) de entrenamiento relacionados que apuntan a resolver un mismo problema. Studio tiene la capacidad de administrar múltiples trials y hacer experimentación con diversos hiperparámetros. Con los resultados de estos experimentos, se pueden graficar las métricas relevantes para seleccionar el mejor modelo.

Un ensayo (trial) es un conjunto de pasos implicados en un mismo trabajo de entrenamiento. Los pasos de entrenamiento suelen incluir pre procesamiento, ajuste de un modelo, evaluación, etc. Un trial también se enriquece con metadatos de entrada (por ejemplo, algoritmos, hiperparámetros, conjuntos de datos) y salidas (por ejemplo, modelos, puntos de control, métricas).

El objetivo de SageMaker Experiments es hacer que sea lo más sencillo posible crear experimentos, introducir los datos y ejecutar análisis en ensayos y experimentos. Para ello, presentamos un nuevo SDK de Python que contiene un API de registro y análisis.

Para ejecutar trabajos de entrenamiento en SageMaker o SageMaker Autopilot, todo lo que se debe hacer es pasar un parámetro adicional al estimator, definiendo el nombre del experimento al que debe adjuntarse esta prueba. Todas las entradas y salidas se registrarán automáticamente.

Una vez que haya ejecutado sus trabajos de entrenamiento, el SDK de experimentos de SageMaker le permite cargar los datos de experimentación en un dataframe de Pandas y con esto hacer todo tipo de análisis incluyendo visualizaciones. Se pueden ejecutar consultas complejas y visualizar tablas de clasificación de modelos y gráficos de métricas en tiempo real.

En el entrenamiento de este ejercicio se hicieron 2 Trials :

Trial 1: XGBOOST Modo algoritmo

Para nuestra primera prueba, usaremos el algoritmo XGBoost integrado para entrenar un modelo sin proporcionar ningún código adicional. De esta manera, podemos usar XGBoost para entrenar e implementar un modelo como lo haríamos con otros algoritmos integrados de Amazon SageMaker.

trial = Trial.create(trial_name="algorithm-mode-trial-{}".format(strftime("%Y-%m-%d-%H-%M-%S", gmtime())),

                     experiment_name=customer_churn_experiment.experiment_name,

                     sagemaker_boto_client=boto3.client('sagemaker'))




xgb = sagemaker.estimator.Estimator(image_name=docker_image_name,

                                    role=role,

                                    hyperparameters=hyperparams,

                                    train_instance_count=1,

                                    train_instance_type='ml.m4.xlarge',

                                    output_path='s3://{}/{}/output'.format(bucket, prefix),

                                    base_job_name="demo-xgboost-customer-churn",

                                    sagemaker_session=sess)




xgb.fit({'train': s3_input_train,

         'validation': s3_input_validation},

        experiment_config={

            "ExperimentName": customer_churn_experiment.experiment_name,

            "TrialName": trial.trial_name,

            "TrialComponentDisplayName": "Training",

        }

       )

Creamos un nuevo objeto de la clase Trial y asociaremos la prueba con el experimento que creamos anteriormente. Para entrenar el modelo, creamos un estimator y especificamos algunos parámetros, como el tipo de instancias de entrenamiento que nos gustaría usar y cuántas, y dónde se deben almacenar los artefactos del modelo entrenado.

También asociaremos el trabajo de entrenamiento con la prueba del experimento que acabamos de crear cuando llamamos al método fit del estimator.

 

4. Amazon SageMaker Debugger

El Debugger de Amazon SageMaker Studio permite obtener visibilidad de lo que sucede durante el entrenamiento de modelos. Permite grabar y analizar métricas relevantes durante el entrenamiento de modelos de Machine Learning y Deep Learning como los pesos, los gradientes y la pérdida. Toda esta colección de métricas se actualiza constantemente durante las fases de backpropagation y optimización de los modelos de DL.

Especificar las reglas del Debugger de SageMaker

Para habilitar la detección automatizada de problemas comunes durante el entrenamiento, Amazon SageMaker Debugger también le permite adjuntar una lista de reglas para evaluar el trabajo de entrenamiento.

Algunas reglas que aplican XGBoost son: AllZero, ClassImbalance, Confusion, LossNotDecreasing, Overfit, Overtraining, SimilarAcrossRuns, TensorVariance, UnchangedTensor, and TreeDepth.

Usamos  LossNotDecreasing rule—que se activa si el loss no decrece en ningún punto del entrenamiento—Overtraining y Overfit rule. Para crear las reglas:

debug_rules = [Rule.sagemaker(rule_configs.loss_not_decreasing()),

               Rule.sagemaker(rule_configs.overtraining()),

               Rule.sagemaker(rule_configs.overfit())

Trial 2 – XGBoost en modo framework

Para este trial, se entrenó un modelo similar, pero se uso XGBoost en modo framework. Si ha trabajado con XGBoost de código abierto, usar XGBoost de esta manera le resultará familiar. El uso de XGBoost como framework proporciona más flexibilidad que su uso como un algoritmo integrado porque permite escenarios más avanzados como incorporar scripts de pre procesamiento y pos procesamiento. Específicamente, podremos definir una lista de reglas con las que queremos que Amazon SageMaker Debugger evalúe nuestro entrenamiento.

entry_point_script = "xgboost_customer_churn.py"




trial = Trial.create(trial_name="framework-mode-trial-{}".format(strftime("%Y-%m-%d-%H-%M-%S", gmtime())),

                     experiment_name=customer_churn_experiment.experiment_name,

                     sagemaker_boto_client=boto3.client('sagemaker'))




framework_xgb = sagemaker.xgboost.XGBoost(image_name=docker_image_name,

                                          entry_point=entry_point_script,

                                          role=role,

                                          framework_version="0.90-2",

                                          py_version="py3",

                                          hyperparameters=hyperparams,

                                          train_instance_count=1,

                                          train_instance_type='ml.m4.xlarge',

                                          output_path='s3://{}/{}/output'.format(bucket, prefix),

                                          base_job_name="demo-xgboost-customer-churn",

                                          sagemaker_session=sess,

                                          rules=debug_rules

                                          )




framework_xgb.fit({'train': s3_input_train,

                   'validation': s3_input_validation},

                  experiment_config={

                      "ExperimentName": customer_churn_experiment.experiment_name,

                      "TrialName": trial.trial_name,

                      "TrialComponentDisplayName": "Training",

                  })

5.  Model hosting

Amazon SageMaker proporciona servicios de alojamiento de modelos para la implementación de los mismos como micro servicios. Como se muestra en el diagrama, Amazon SageMaker proporciona un endpoint final HTTPS donde su modelo de ML está disponible para recibir peticiones y devolver inferencias.

 

 

xgb_predictor = xgb.deploy(initial_instance_count=1,

                           instance_type='ml.m4.xlarge',

                           endpoint_name=endpoint_name,

                           data_capture_config=DataCaptureConfig(enable_capture=True,

                                                                 sampling_percentage=100,

                                                                 destination_s3_uri='s3://{}/{}'.format(bucket, data_capture_prefix)

                                                                )

                           )

 

6. SageMaker Model Monitor

Amazon SageMaker Model Monitor supervisa automáticamente los modelos de ML en producción y notifica cuando surgen problemas con la calidad de los datos. Esto puede suceder debido a que los modelos en producción tienen que hacer predicciones sobre datos de la vida real que no están cuidadosamente seleccionados como la mayoría de los conjuntos de datos de entrenamiento. Si la naturaleza estadística de los datos que recibe su modelo mientras está en producción, se aleja de la naturaleza de los datos de línea de base en los que fue entrenado, el modelo comienza a perder precisión en sus predicciones. Esto es lo que se conoce como “concept drift”.

Para habilitar la supervisión del modelo, siga los siguientes pasos, que rastrean la ruta de los datos a través de los diversos procesos de recopilación, supervisión y análisis de datos.

Paso1: Crear un baseline

Cree una línea de base a partir del conjunto de datos que se utilizó para entrenar el modelo.

baseline_prefix = prefix + '/baselining'

baseline_data_prefix = baseline_prefix + '/data'

baseline_results_prefix = baseline_prefix + '/results'




baseline_data_uri = 's3://{}/{}'.format(bucket,baseline_data_prefix)

baseline_results_uri = 's3://{}/{}'.format(bucket, baseline_results_prefix)

print('Baseline data uri: {}'.format(baseline_data_uri))

print('Baseline results uri: {}'.format(baseline_results_uri))

baseline_data_path = S3Uploader.upload("data/training-dataset-with-header.csv", baseline_data_uri)

 

Paso 2: Agendar un job de monitoreo

Cree un job de monitoreo que especifique qué datos recopilar, con qué frecuencia recopilarlos, cómo analizarlos y qué informes producir.

my_default_monitor = DefaultModelMonitor(role=role,

                                         instance_count=1,

                                         instance_type='ml.m5.xlarge',

                                         volume_size_in_gb=20,

                                         max_runtime_in_seconds=3600,

                                        )




baseline_job = my_default_monitor.suggest_baseline(baseline_dataset=baseline_data_path,

                                                   dataset_format=DatasetFormat.csv(header=True),

                                                   output_s3_uri=baseline_results_uri,

                                                   wait=True

)


Paso 3: Interpretar los resultados

Inspeccione los informes, que comparan los datos más recientes con la línea de base, y observe las infracciones notificadas y las métricas y notificaciones de Amazon CloudWatch.

 

 

Limpiando y borrando recursos

Como buena practica se puede utilizar el siguiente código para desaprovisionar memoria, eliminar endpoints y otros recursos creados.

try:

    sess.delete_monitoring_schedule(mon_schedule_name)

except:

    pass

while True:

    try:

        print("Waiting for schedule to be deleted")

        sess.describe_monitoring_schedule(mon_schedule_name)

        sleep(15)

    except:

        print("Schedule deleted")

        break




sess.delete_endpoint(xgb_predictor.endpoint)




def cleanup(experiment):

    '''Clean up everything in the given experiment object'''

    for trial_summary in experiment.list_trials():

        trial = Trial.load(trial_name=trial_summary.trial_name)

       

        for trial_comp_summary in trial.list_trial_components():

            trial_step=TrialComponent.load(trial_component_name=trial_comp_summary.trial_component_name)

            print('Starting to delete TrialComponent..' + trial_step.trial_component_name)

            sm.disassociate_trial_component(TrialComponentName=trial_step.trial_component_name, TrialName=trial.trial_name)

            trial_step.delete()

            time.sleep(1)

        

        trial.delete()

   

    experiment.delete()




cleanup(customer_churn_experiment)

 

En el primer paso, al crear un dominio de Amazon Sagemaker Studio usando autenticación con Amazon IAM, Studio crea una lista de usuarios autorizados, ajustes de configuración y un volumen de Amazon Elastic File System (Amazon EFS) que contiene los datos de todos los usuarios incluyendo las notebooks. Esto implica que debemos apagar todas las apps primero para poder borrar un usuario y a su vez borrar todos los usuarios para poder borrar el dominio y efectivamente desaprovisionar el EFS.

 

Conclusión

Amazon Sagemaker Studio, es el primer IDE diseñado específicamente para ML e incorpora varias de las funcionalidades de SageMaker. También ofrece otras con las cuales les da vía libre a desarrolladores de software sin tantos conocimientos de ML poder incluir en sus arquitecturas este tipo de funcionalidad y así potenciar sus productos.

 


Sobre el autor

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 inovacion y mejorar la productividad. Antes de AWS, trabajó como data scientist y gerente de business development en la industria Telco.

 

 

 

Sobre los revisores

María Gaska es arquitecta de soluciones en AWS especialista en AI/ML. En su rol, ayuda a los clientes tanto a determinar la mejor arquitectura para sus distintas aplicaciones como a encontrar los mejores algoritmos para resolver problemas de Machine Learning e IA. Antes de AWS, trabajó como desarrolladora de modelos de deep learning en una startup enfocada en NLP y chatbots y también como profesora en una coding school a cargo de un curso de data science.

 

 

 

Andrés Palacios es arquitecto de soluciones especialista en Analytics en AWS. En su rol apoya a los clientes a encontrar la mejor solución y arquitectura para sus necesidades al igual que  aprovechar los servicios de  AI/ML para generar innovación y mejorar la productividad. Antes de AWS, trabajó para grandes consultoras en las áreas de Data y Analytics, en consultoría estratégica, arquitectura e implementación de soluciones de procesamiento y consumo distribuidas.