Я работаю с Керасом и пытаюсь обучить модель с помощью 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