AWS Sagemaker Multi-Model Endpoint con Scikit Learn: UnexpectedStatusException mientras se usa un script de entrenamiento

Oct 21 2020

Estoy intentando crear un punto de enlace de varios modelos en AWS sagemaker utilizando Scikit-learn y un script de entrenamiento personalizado. Cuando intento entrenar mi modelo usando el siguiente código:

estimator = SKLearn(
    entry_point=TRAINING_FILE, # script to use for training job
    role=role,
    source_dir=SOURCE_DIR, # Location of scripts
    train_instance_count=1,
    train_instance_type=TRAIN_INSTANCE_TYPE,
    framework_version='0.23-1',
    output_path=s3_output_path,# Where to store model artifacts
    base_job_name=_job,
    code_location=code_location,# This is where the .tar.gz of the source_dir will be stored
    hyperparameters = {'max-samples'    : 100,
                       'model_name'     : key})

DISTRIBUTION_MODE = 'FullyReplicated'

train_input = sagemaker.s3_input(s3_data=inputs+'/train', 
                                  distribution=DISTRIBUTION_MODE, content_type='csv')
    
estimator.fit({'train': train_input}, wait=True)

donde 'TRAINING_FILE' contiene:


import argparse
import os

import numpy as np
import pandas as pd
import joblib
import sys

from sklearn.ensemble import IsolationForest

if __name__ == '__main__':
    parser = argparse.ArgumentParser()

    parser.add_argument('--max_samples', type=int, default=100)
    
    parser.add_argument('--model_dir', type=str, default=os.environ.get('SM_MODEL_DIR'))
    parser.add_argument('--train', type=str, default=os.environ.get('SM_CHANNEL_TRAIN'))
    parser.add_argument('--model_name', type=str)

    args, _ = parser.parse_known_args()

    print('reading data. . .')
    print('model_name: '+args.model_name)    
    
    train_file = os.path.join(args.train, args.model_name + '_train.csv')    
    train_df = pd.read_csv(train_file) # read in the training data
    train_tgt = train_df.iloc[:, 1] # target column is the second column
    
    clf = IsolationForest(max_samples = args.max_samples)
    clf = clf.fit([train_tgt])
    
    path = os.path.join(args.model_dir, 'model.joblib')
    joblib.dump(clf, path)
    print('model persisted at ' + path)

El guión de entrenamiento tiene éxito pero sagemaker arroja un UnexpectedStatusException:

¿Alguien ha experimentado algo como esto antes? Revisé todos los registros de Cloudwatch y no encontré nada útil, y estoy completamente perplejo sobre qué probar a continuación.

Respuestas

1 Cameron Oct 26 2020 at 17:22

Para cualquiera que se encuentre con este problema en el futuro, el problema ha sido resuelto.

El problema no tenía nada que ver con el entrenamiento, sino con el envío de caracteres no válidos en los nombres de directorio a S3. Entonces, el script produciría los artefactos correctamente, pero sagemaker lanzaría una excepción al intentar guardarlos en S3