如何使用自己的Tensorflow代码创建Sagemaker培训工作,而无需构建容器?

时间:2019-02-15 19:02:21

标签: tensorflow amazon-sagemaker

我正在尝试使用现有的Python类定义Sagemaker培训工作。据我了解,我可以创建自己的容器,但不想处理容器管理。

选择“算法源”时,可以选择“您自己的算法源”,但是资源下方未列出任何内容。这是哪里来的?

我知道我可以通过笔记本来完成此操作,但是我确实希望在可以通过端点调用的作业中对此进行定义。

3 个答案:

答案 0 :(得分:0)

我相信这是不可能的,因为您可以参考SageMaker文档上的this part。需要一个容器来提供与任何语言和框架一起运行的功能。

在训练作业创建中列出的算法是可以在SageMaker->训练->算法中创建的算法。但是,有必要定义一个容器,这是如何进行训练和预测的规范。即使您不构建容器,您也将引用现有容器(使用内置算法),或者您将使用市场上的一种算法,其中有人使用图像来构建该容器。

我相信您可以建立一个满足您需求的映像,该映像可以与现有映像分开。

构建图像后,您可以轻松地使用它来自动执行来自lambda的训练/预测工作。 Here是一个例子。

此外,您可以根据需要为容器提供尽可能多的输入通道,从理论上讲,您可以传递一个通道,该通道引用您要在容器启动时加载的脚本。但是根据您的情况,我刚刚想到的一个想法可能值得一试。通常,您可以拥有可以在Docker构建过程中自定义的映像。因此,如果有多个不同的脚本,则只能创建一个图像,并对其进行参数化以使用自定义脚本。

  • Here,您可以找到使用Tensorflow的自定义图像。
  • Here列出了许多为多个框架(Tensorflow)构建不同容器的示例。

希望对您有所帮助。

致谢。

答案 1 :(得分:0)

正如Bruno所说的那样,您将不得不在某个地方使用一个容器,但是您可以使用现有的容器来运行自己的自定义tensorflow代码。

有一个很好的示例in the sagemaker github

此方法的工作方式是,修改代码以使其具有使用argparse命令行参数的入口点,然后将“ Sagemaker Tensorflow估计器”指向该入口点。然后,当您在sagemaker估算器上调用fit时,它将下载tensorflow容器并在其中运行您的自定义代码。

因此,您首先使用自己的自定义代码,看起来像这样

# 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)

除了指定函数需要使用的参数外,我们还需要提供一个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实例
  • 将tensorflow 1.12.0容器下载到实例
  • 将适合我们指定的所有数据下载到适合新创建的实例中(在本例中为空)
  • 在实例上运行代码
  • 将模型工件上传到model_dir

就差不多了。当然这里没有提到很多,但是您可以:

  • 从s3下载培训/测试数据
  • 在训练期间保存检查点文件和张量板文件,并将它们上传到s3

我找到的最好的资源是我分享的示例,但这是我为使之正常运行所需要的所有东西:

答案 2 :(得分:0)

我不确定这是否对您有帮助,但是您可以使用Tensorflow估算器,它类似于AWS的内置容器。您需要一个培训脚本和requirements.txt文件,其中将包含您可能需要的依赖项。您可以点击此链接以获取更多信息https://pyradiomics.readthedocs.io/en/latest/installation.html#install-via-conda