AWS Sagemaker Multi-Model Endpoint avec Scikit Learn: UnexpectedStatusException lors de l'utilisation d'un script d'entraînement

Oct 21 2020

J'essaie de créer un point de terminaison multimodèle dans AWS sagemaker à l'aide de Scikit-learn et d'un script d'entraînement personnalisé. Lorsque j'essaye d'entraîner mon modèle à l'aide du code suivant:

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)

où "TRAINING_FILE" contient:


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)

Le script de formation réussit mais sagemaker lance un UnexpectedStatusException:

Quelqu'un a-t-il déjà vécu quelque chose comme ça avant? J'ai vérifié tous les journaux de cloudwatch et je n'ai rien trouvé d'utile, et je suis complètement perplexe sur ce qu'il faut essayer ensuite.

Réponses

1 Cameron Oct 26 2020 at 17:22

Pour quiconque rencontre ce problème à l'avenir, le problème a été résolu.

Le problème n'avait rien à voir avec la formation, mais avec des caractères non valides dans les noms de répertoire envoyés à S3. Ainsi, le script produirait correctement les artefacts, mais sagemaker lèverait une exception en essayant de les enregistrer dans S3