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

问题描述 投票:0回答:2

我正在尝试使用现有的Python类定义Sagemaker Training Job。根据我的理解,我可以创建自己的容器,但不愿意处理容器管理。

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

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

tensorflow amazon-sagemaker
2个回答
0
投票

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

有一个很好的例子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

我找到的最好的资源是我分享的例子,但这里是我正在寻找的所有工作:


0
投票

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

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

我相信你可以建立一个能够满足现有需求的图像。

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

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

  • Here你可以找到一个使用Tensorflow的自定义图像。
  • Here列出了很多为几个框架构建不同容器的例子,Tensorflow也是如此。

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

问候。

© www.soinside.com 2019 - 2024. All rights reserved.