AWS Sagemaker Multi-Model-Endpunkt mit Scikit Learn: UnexpectedStatusException bei Verwendung eines Trainingsskripts

Oct 21 2020

Ich versuche, mit Scikit-learn und einem benutzerdefinierten Trainingsskript einen Endpunkt mit mehreren Modellen in AWS sagemaker zu erstellen. Wenn ich versuche, mein Modell mit dem folgenden Code zu trainieren:

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)

Dabei enthält 'TRAINING_FILE':


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)

Das Trainingsskript ist erfolgreich, aber der Sagemaker wirft ein UnexpectedStatusException:

Hat jemand so etwas schon einmal erlebt? Ich habe alle Cloudwatch-Protokolle überprüft und nichts Nützliches gefunden. Ich bin völlig ratlos, was ich als nächstes versuchen soll.

Antworten

1 Cameron Oct 26 2020 at 17:22

Für alle, die in Zukunft auf dieses Problem stoßen, ist das Problem gelöst.

Das Problem hatte nichts mit dem Training zu tun, sondern mit ungültigen Zeichen in Verzeichnisnamen, die an S3 gesendet wurden. Das Skript würde also die Artefakte korrekt erzeugen, aber der Sagemaker würde eine Ausnahme auslösen, wenn er versucht, sie in S3 zu speichern