Как создать учебное задание Sagemaker с моим собственным кодом Tensorflow без необходимости создания контейнера? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь определить учебное задание Sagemaker с существующим классом Python.Насколько я понимаю, я мог бы создать свой собственный контейнер, но предпочел бы не заниматься управлением контейнерами.

При выборе «Источник алгоритма» есть опция «Ваш собственный источник алгоритма», но в ресурсах ничего не указано.Откуда это взялось?

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

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Как сказал Бруно, вам нужно будет где-нибудь использовать контейнер, но вы можете использовать существующий контейнер для запуска собственного пользовательского кода тензорного потока.

В sithmaker github есть хороший пример 1004 * о том, как это сделать.

Способ, которым это работает, заключается в том, что вы изменяете свой код, чтобы иметь точку входа, которая принимает аргументы командной строки argparse, а затем вы указываете 'оценщик Tensorflow Sagemaker' на точку входа.Затем, когда вы вызываете fit в оценщике sagemaker, он загружает контейнер tenorflow и запускает там ваш собственный код.

Итак, вы начинаете с вашего собственного кода, который выглядит примерно так

# my_custom_code.py
import tensorflow as tf
import numpy as np

def build_net():
    # single fully connected
    image_place = tf.placeholder(tf.float32, [None, 28*28])
    label_place = tf.placeholder(tf.int32, [None,])
    net = tf.layers.dense(image_place, units=1024, activation=tf.nn.relu)
    net = tf.layers.dense(net, units=10, activation=None)
    return image_place, label_place, net


def process_data():
    # load
    (x_train, y_train), (_, _) = tf.keras.datasets.mnist.load_data()

    # center
    x_train = x_train / 255.0
    m = x_train.mean()
    x_train = x_train - m

    # convert to right types
    x_train = x_train.astype(np.float32)
    y_train = y_train.astype(np.int32)

    # reshape so flat
    x_train = np.reshape(x_train, [-1, 28*28])
    return x_train, y_train


def train_model(init_learn, epochs):
    image_p, label_p, logit = build_net()
    x_train, y_train = process_data()

    loss = tf.nn.softmax_cross_entropy_with_logits_v2(
        logits=logit,
        labels=label_p)
    optimiser = tf.train.AdamOptimizer(init_learn)
    train_step = optimiser.minimize(loss)

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        for _ in range(epochs):
            sess.run(train_step, feed_dict={image_p: x_train, label_p: y_train})


if __name__ == '__main__':
    train_model(0.001, 10)

Чтобы заставить его работать с sagemaker, нам нужно создать точку входа в командной строке, которая позволит sagemaker запускать его в контейнере, который он в итоге загрузит для нас.

# entry.py

import argparse
from my_custom_code import train_model

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument(
        '--model_dir',
        type=str)
    parser.add_argument(
        '--init_learn',
        type=float)
    parser.add_argument(
        '--epochs',
        type=int)
    args = parser.parse_args()
    train_model(args.init_learn, args.epochs)

Помимо указания аргументов myФункция должна принимать, мы также должны предоставить model_dir аргумент.Это всегда требуется, и это местоположение S3, где будут сохранены модельные артефакты после завершения учебного задания.Обратите внимание, что вам не нужно указывать, что это значение (хотя вы можете), так как Sagemaker предоставит вам местоположение по умолчанию в S3.

Итак, мы изменили наш код, теперь нам нужно фактически запустить егона Sagemaker.Перейдите к консоли AWS и запустите небольшой экземпляр из Sagemaker.Загрузите свой пользовательский код в экземпляр, а затем создайте блокнот jupyter следующим образом:

# sagemaker_run.ipyb
import sagemaker
from sagemaker.tensorflow import TensorFlow

hyperparameters = {
    'epochs': 10,
    'init_learn': 0.001}

role = sagemaker.get_execution_role()
source_dir = '/path/to/folder/with/my/code/on/instance'
estimator = TensorFlow(
    entry_point='entry.py',
    source_dir=source_dir,
    train_instance_type='ml.t2.medium',
    train_instance_count=1,
    hyperparameters=hyperparameters,
    role=role,
    py_version='py3',
    framework_version='1.12.0',
    script_mode=True)

estimator.fit()

Выполнение вышеуказанного приведет к:

  • Раскрутите экземпляр ml.t2.medium
  • Загрузите контейнер tenorflow 1.12.0 в экземпляр
  • Загрузите любые данные, которые мы указали в соответствии с только что созданным экземпляром, в fit (в данном случае ничего)
  • Запустите наш кодв случае
  • загрузите артефакты модели в model_dir

И это почти все.Конечно, здесь многое не упомянуто, но вы можете:

  • Загрузить данные тренировок / испытаний из s3
  • Сохранять файлы контрольных точек и файлы тензорной доски во время тренировки и загружать их в s3

Лучшим ресурсом, который я нашел, был пример, которым я поделился, но вот все, на что я обращал внимание, чтобы заставить его работать:

0 голосов
/ 17 февраля 2019

Я считаю, что это невозможно, поскольку вы можете сослаться на эту часть в документации SageMaker.Контейнер необходим для обеспечения возможности работы с любым языком и каркасом.

Алгоритмы, перечисленные в разделе «Создание рабочих мест для обучения», - это алгоритмы, которые можно создавать в SageMaker -> «Обучение» -> «Алгоритмы».Но необходимо определить контейнер, который является спецификацией того, как вы можете проводить обучение и предсказания.Даже если вы не создадите контейнер, вы будете ссылаться на существующий (используя встроенный алгоритм) или будете использовать алгоритм из магазина, который кто-то создал с использованием изображения.

Полагаю, вы могли бы создать образ, соответствующий вашим потребностям, исходя из существующего.

После создания образа его можно легко использовать для автоматизации заданий по обучению / прогнозированию из лямбды. Здесь является примером.

Кроме того, вы можете предоставить столько входных каналов для вашего контейнера, сколько вам нужно для загрузки данных, теоретически вы можете пропустить канал, который ссылается на скрипт, которыйВы хотите загрузить, пока ваш контейнер запускается.Но есть идея, которую я только что, в зависимости от вашего сценария, может стоить проверить.Обычно у вас может быть образ, который вы можете настроить в процессе сборки Docker.Таким образом, если у вас есть несколько различных сценариев, вы можете создать только одно изображение и просто настроить его для использования собственного сценария.

  • Здесь вы можете найти пользовательское изображение, которое использует Tensorflow.
  • Здесь приведено множество примеров построения различных контейнеров для нескольких каркасов, а также для Tensorflow.

Надеюсь, это поможет, дайте мне знать, если нужнобольше информации.

С уважением.

...