AWS Sagemaker Multi-Model Endpoint com Scikit Learn: UnexpectedStatusException durante o uso de um script de treinamento

Oct 21 2020

Estou tentando criar um endpoint de vários modelos no AWS sagemaker usando Scikit-learn e um script de treinamento personalizado. Quando tento treinar meu modelo usando o seguinte 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)

onde 'TRAINING_FILE' contém:


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)

O script de treinamento é bem-sucedido, mas o sagemaker lança um UnexpectedStatusException:

Alguém já experimentou algo assim antes? Eu verifiquei todos os logs do Cloudwatch e não encontrei nada útil, e estou completamente perplexo sobre o que tentar a seguir.

Respostas

1 Cameron Oct 26 2020 at 17:22

Para qualquer pessoa que encontrar esse problema no futuro, o problema foi resolvido.

O problema não tinha nada a ver com o treinamento, mas com caracteres inválidos em nomes de diretório sendo enviados para S3. Portanto, o script produziria os artefatos corretamente, mas o sagemaker lançaria uma exceção ao tentar salvá-los no S3