如何在无需构建容器的情况下使用我自己的 Tensorflow 代码创建 Sagemaker 训练作业?

How do I create a Sagemaker training job with my own Tensorflow code without having to build a container?

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

选择"Algorithm Source"有"Your own algorithm source"的选项,但在资源下没有列出任何内容。这是从哪里来的?

我知道我可以通过笔记本来做到这一点,但我真的希望在可以通过端点调用的作业中定义它。

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

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

我相信您可以构建满足您需求的图像,而不是现有图像。

构建映像后,您可以轻松地使用它通过 lambda 自动执行 training/prediction 作业。 Here 是一个例子。

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

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

希望对您有所帮助,如果需要更多信息,请告诉我。

此致。

正如 B运行o 所说,您必须在某处使用容器,但您可以使用现有容器来 运行 您自己的自定义 tensorflow 代码。

有一个很好的例子 in the sagemaker github 如何做到这一点。

它的工作方式是您修改您的代码以具有一个接受 argparse 命令行参数的入口点,然后将 'Sagemaker Tensorflow estimator' 指向该入口点。然后,当您在 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 notebook,如下所示:

# 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容器到实例
  • 将我们在 fit 中指定的任何数据下载到 fit 中新创建的实例(在本例中为空)
  • 运行 我们在实例上的代码
  • 将模型工件上传到 model_dir

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

  • 从 s3 下载 training/testing 数据
  • 保存checkpoint文件,训练时的tensorboard文件上传到s3

我找到的最好的资源是我分享的例子,但这里是我一直在寻找的所有东西:

我不确定这是否对您有帮助,但您可以使用 Tensorflow 估算器,它类似于 AWS 的内置容器。您需要一个训练脚本和 requirements.txt 文件,其中将包含您可能需要的依赖项。您可以关注此 link 了解更多信息 Sagemaker TensorFlow estimators documentation