Предисловие к проблеме:
У меня есть база данных созданных пользователем архитектур нейронных сетей (написанных на другом языке, которые я транскомпилирую в модель Keras), хранящихся в MongoDB. Моя цель - взять эти архитектуры, создать с ними модель Keras, а затем обучить их в облаке с помощью SageMaker. На данный момент я могу загружать модели из MongoDB и прекрасно их транскомпилировать в Keras. Однако у меня проблемы с отправкой этих динамически созданных моделей в SageMaker с использованием Python SDK.
Есть ли способ обучить и развернуть эти модели архитектуры Keras - I.E только объекты модели Python Keras - в SageMaker, указав атрибут entry_point
оценщика в виде файла, в котором определены эти объекты модели?
Работа до даты и пример кода
На данный момент я могу создать учебное задание и развернуть конечную точку, когда архитектура модели определена в отдельном файле. См. Этот пример отдельного файла и процесса развертывания / обучения на SageMaker's GitHub.
train-and-deploy-sagemaker.py
# Import Sagemaker Tensorflow
from sagemaker.tensorflow import TensorFlow
# Create an estimator object using the entry_point file entry_point.py
estimator = TensorFlow(entry_point='entry_point.py',
role=arn_role,
framework_version='1.12.0',
hyperparameters={...some hyperparams for the model...},
training_steps=1000,
evaluation_steps=100,
train_instance_count=4, train_instance_type='ml.p3.8xlarge')
# Start the training job to train the above estimator
estimator.fit(training_data_inputs)
# Deploy said estimator after training
predictor = estimator.deploy(initial_instance_count=1, instance_type='ml.m4.xlarge')
entry_point.py
def keras_model_fn(hyperparameters):
"""keras_model_fn receives hyperparameters from the training job and returns a compiled keras model.
The model will be transformed into a TensorFlow Estimator before training and it will be saved in a
TensorFlow Serving SavedModel at the end of training.
Args:
hyperparameters: The hyperparameters passed to the SageMaker TrainingJob that runs your TensorFlow
training script.
Returns: A compiled Keras model
"""
model = Sequential()
... add layers ...
return model
def train_input_fn():
...
# other functions for inference and training, see link above
Однако, есть ли способ, которым я мог бы определить эту архитектуру динамически? Т.е. взять предварительно написанную архитектуру из MongoDB, а затем трансформировать ее в ту же модель Sequential
Keras в entrypoint.py
?
Потенциальные идеи и проблемы:
Идея: Просто возьмите модели из MongoDB и выполните транскомпиляцию из файла entry_point
. Затем каждый метод, требуемый AWS, может ссылаться на объект скомпилированной модели.
Обеспокоенность: Это безопасная или передовая практика, если AWS создаст виртуальную машину из этого файла для запуска кода в своем облаке? Кроме того, источник позднее сохраняется в корзине S3, что может представлять другую угрозу безопасности независимо от разрешений. Кроме того, такие зависимости, как pymongo, не могут быть загружены из файла entry_point
, что делает выборку данных невозможной без изменения тренировочного образа.
Идея: Выполните извлечение и преобразование в файле, который создает обучающее задание и экземпляр развертывания - train-and-deploy-sagemaker.py
выше. Затем передайте некоторый код, который может реконструировать модель - например, модель Keras JSON - через атрибут hyperparams в оценщике.
Обеспокоенность: В соответствии с AWS длина гиперпарама может составлять всего 256 символов.
Идея: Динамически генерировать файл entry_point
на основе архитектуры модели, которую он должен содержать.
Обеспокоенность: Многие из них, например, не хотят создавать одноразовый файл на сервере из-за ненужных причин ввода-вывода, генерировать код - это грязно и плохо, и должен быть лучший способ. .
Идея: Сделать атрибут entry_point
не внешним файлом и вместо этого указать необходимые методы в файле, в котором создается оценщик. Это решило бы все мои проблемы, но ...
Обеспокоенность: Я ничего не видел в документации SageMaker. Тем не менее, это самый идеальный вариант.
Любая помощь будет оценена и спасибо заранее!