Sagemaker с тензорным потоком 2 не сохраняющая модель - PullRequest
1 голос
/ 12 февраля 2020

Я работаю с Керасом и пытаюсь обучить модель с помощью Sagemaker. У меня возникает следующая проблема: Когда я тренирую свою модель с использованием TensorFlow 1.12, все работает нормально:

estimator = TensorFlow(entry_point='entrypoint-2.py',
                            base_job_name='mlearning-test',
                         role=role,
                         train_instance_count=1,
                         input_mode='Pipe',
                         train_instance_type='ml.p2.xlarge',
                         framework_version='1.12.0')

Моя модель обучена, и модель сохраняется в S3. Не проблемы.

Однако, если я изменил версию платформы на 2.0.0

estimator = TensorFlow(entry_point='entrypoint-2.py',
                                base_job_name='mlearning-test',
                             role=role,
                             train_instance_count=1,
                             input_mode='Pipe',
                             train_instance_type='ml.p2.xlarge',
                             framework_version='2.0.0')

, я получаю следующую ошибку:

2020-02-12 13:54:36,601 sagemaker_tensorflow_container.training WARNING  No model artifact is saved under path /opt/ml/model. Your training job will not save any model files to S3.
For details of how to construct your training script see:
https://sagemaker.readthedocs.io/en/stable/using_tf.html#adapting-your-local-tensorflow-script

помечен как успешный, но в корзине S3 ничего нет, да и тренировки там не было.

В качестве альтернативы я попытался поместить py_version = 'py3', но это продолжается. Есть ли существенная разница, о которой я не знаю, когда использую TF2 на Sagemaker?

Я не думаю, что точка входа необходима, поскольку она отлично работает с версией 1.12, но если вам интересно, или вы можете заметить что-то здесь, это:

import tensorflow as tf
from sagemaker_tensorflow import PipeModeDataset
#from tensorflow.contrib.data import map_and_batch

INPUT_TENSOR_NAME = 'inputs_input'  
BATCH_SIZE = 64
NUM_CLASSES = 5
BUFFER_SIZE = 50
PREFETCH_SIZE = 1
LENGHT = 512
SEED = 26
EPOCHS = 1
WIDTH = 512

def keras_model_fn(hyperparameters):
    model = tf.keras.Sequential([
        tf.keras.layers.Dense(WIDTH, 'relu', input_shape=(None, WIDTH), name = 'inputs'),
        #tf.keras.layers.InputLayer(input_shape=(None, WIDTH), name=INPUT_TENSOR_NAME),
        tf.keras.layers.Dense(256, 'relu'),
        tf.keras.layers.Dense(128, 'relu'),
        tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
    ])

    opt = tf.keras.optimizers.RMSprop()

    model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=["accuracy"])
    return model

def serving_input_fn(hyperparameters):
    # Notice that the input placeholder has the same input shape as the Keras model input
    tensor = tf.placeholder(tf.float32, shape=[None, WIDTH])

    # The inputs key INPUT_TENSOR_NAME matches the Keras InputLayer name
    inputs = {INPUT_TENSOR_NAME: tensor}
    return tf.estimator.export.ServingInputReceiver(inputs, inputs)

def train_input_fn(training_dir, params):
    """Returns input function that would feed the model during training"""
    return _input_fn('train')

def eval_input_fn(training_dir, params):
    """Returns input function that would feed the model during evaluation"""
    return _input_fn('eval')

def _input_fn(channel):
    """Returns a Dataset for reading from a SageMaker PipeMode channel."""
    print("DATA "+channel)
    features={
        'question': tf.FixedLenFeature([WIDTH], tf.float32),
        'label': tf.FixedLenFeature([1], tf.int64)
    }

    def parse(record):
        parsed = tf.parse_single_example(record, features)
        #print("-------->"+str(tf.cast(parsed['question'], tf.float32))
        return {
            INPUT_TENSOR_NAME: tf.cast(parsed['question'], tf.float32)
        }, parsed['label']

    ds = PipeModeDataset(channel)
    if EPOCHS > 1:
        ds = ds.repeat(EPOCHS)
    ds = ds.prefetch(PREFETCH_SIZE)
    #ds = ds.apply(map_and_batch(parse, batch_size=BATCH_SIZE,
    #                            num_parallel_batches=BUFFER_SIZE))
    ds = ds.map(parse, num_parallel_calls=NUM_PARALLEL_BATCHES)
    ds = ds.batch(BATCH_SIZE)

    return ds

1 Ответ

1 голос
/ 15 февраля 2020

вы правы, в прошлом году в SageMaker TensorFlow произошли серьезные полезные изменения, названные режим сценариев формализм . Как вы можете видеть в документации SDK :

"Предупреждение. Мы добавили новый формат вашего учебного скрипта TensorFlow с версией 1.11 TensorFlow. Этот новый способ предоставляет пользовательский скрипт больше гибкости. Этот новый формат называется Script Mode, в отличие от Legacy Mode, который мы поддерживаем с TensorFlow 1.11 и более ранними версиями. Кроме того, мы добавляем поддержку Python 3 с Script Mode. Последняя поддерживаемая версия Legacy Mode будет TensorFlow 1.12. Режим сценария доступен с версией TensorFlow 1.11 и новее. При подготовке сценария обращайтесь к правильной версии этого README. Вы можете найти README Legacy Mode здесь. "

с TensorFlow 2, вы должны следовать этому формализму Script Mode и сохранить вашу модель в пути opt/ml/model, иначе ничего не будет отправлено на S3. Режим сценариев довольно прост в реализации и обеспечивает лучшую гибкость и мобильность, и эта спецификация c используется совместно с контейнером SageMaker Sklearn, контейнером SageMaker Pytorch и контейнером SageMaker M XNet, поэтому определенно стоит принять

...