Обучите и разверните модель с предварительно созданной архитектурой Keras в Sagemaker с «точкой входа» - PullRequest
2 голосов
/ 22 апреля 2019

Предисловие к проблеме: У меня есть база данных созданных пользователем архитектур нейронных сетей (написанных на другом языке, которые я транскомпилирую в модель 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?

Потенциальные идеи и проблемы:

  1. Идея: Просто возьмите модели из MongoDB и выполните транскомпиляцию из файла entry_point. Затем каждый метод, требуемый AWS, может ссылаться на объект скомпилированной модели.

    Обеспокоенность: Это безопасная или передовая практика, если AWS создаст виртуальную машину из этого файла для запуска кода в своем облаке? Кроме того, источник позднее сохраняется в корзине S3, что может представлять другую угрозу безопасности независимо от разрешений. Кроме того, такие зависимости, как pymongo, не могут быть загружены из файла entry_point, что делает выборку данных невозможной без изменения тренировочного образа.

  2. Идея: Выполните извлечение и преобразование в файле, который создает обучающее задание и экземпляр развертывания - train-and-deploy-sagemaker.py выше. Затем передайте некоторый код, который может реконструировать модель - например, модель Keras JSON - через атрибут hyperparams в оценщике.

    Обеспокоенность: В соответствии с AWS длина гиперпарама может составлять всего 256 символов.

  3. Идея: Динамически генерировать файл entry_point на основе архитектуры модели, которую он должен содержать.

    Обеспокоенность: Многие из них, например, не хотят создавать одноразовый файл на сервере из-за ненужных причин ввода-вывода, генерировать код - это грязно и плохо, и должен быть лучший способ. .

  4. Идея: Сделать атрибут entry_point не внешним файлом и вместо этого указать необходимые методы в файле, в котором создается оценщик. Это решило бы все мои проблемы, но ...

    Обеспокоенность: Я ничего не видел в документации SageMaker. Тем не менее, это самый идеальный вариант.

Любая помощь будет оценена и спасибо заранее!

1 Ответ

1 голос
/ 25 апреля 2019

Обратите внимание, что для упрощения вашего учебного сценария вы можете использовать Режим сценария SageMaker вместо entry_point.py.

  1. Вы указываете файл_переменной для вашего оценщика, поэтому у вас будут необходимые библиотеки для установки в пипсах. Если MongoDB работает в вашем VPC, вы также можете запустить учебное задание в VPC.
  2. Вы можете включить соответствующие файлы, используя параметры source_dir или зависимостей, однако в любом случае они окажутся в S3, вы можете уничтожить корзину S3 после завершения задания. От класс FrameworkModel :

source_dir (str): путь (абсолютный или относительный) к каталогу с любым Другое обучение зависимости исходного кода от файла точки входа tne (по умолчанию: нет). Структура в этом каталог будет сохранен при обучении на SageMaker. Если каталог указывает на S3, код загружаться не будет, и вместо него будет использоваться местоположение S3.

зависимости (список [стр.]): Список путей к каталогам (абсолютный или родственник) с любые дополнительные библиотеки, которые будут экспортированы в контейнер (по умолчанию: []). Папки библиотеки будут скопированы в SageMaker в той же папке, куда копируется точка входа. Если source_dir указывает на S3, код будет загружен и будет использоваться местоположение S3 вместо

  1. Да, лучше избегать.
  2. Невозможно выполнить, поскольку SageMaker читает код из S3. Вы можете передать окружение

Надеюсь, это поможет.

...