我正在尝试使用现有的Python类定义Sagemaker Training Job。根据我的理解,我可以创建自己的容器,但不愿意处理容器管理。
选择“算法源”时,可以选择“您自己的算法源”,但资源下没有列出任何内容。这是从哪里来的?
我知道我可以通过笔记本来做到这一点,但我真的希望在一个可以通过端点调用的作业中定义它。
正如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()
运行以上将:
这就是它。当然,这里没有提到很多,但你可以:
我找到的最好的资源是我分享的例子,但这里是我正在寻找的所有工作:
我相信这是不可能的,因为您可以在SageMaker文档中引用this part。需要一个容器来提供使用任何语言和框架运行的能力。
培训作业创建中列出的算法是您可以在SageMaker中创建的算法 - >培训 - >算法。但是,有必要定义一个容器,这是一个如何进行训练和预测的规范。即使您没有构建容器,也会引用现有的容器(使用内置算法),或者您将使用市场中使用图像构建的某个算法的算法。
我相信你可以建立一个能够满足现有需求的图像。
构建映像后,您可以轻松地使用它来自动化lambda的训练/预测作业。 Here就是一个例子。
此外,您可以根据需要为容器提供尽可能多的输入通道来加载数据,理论上,您可以传递一个通道,该通道引用您要在容器启动时加载的脚本。但是,根据您的情况,我刚刚拥有的想法值得一试。通常,您可以拥有一个可以在docker构建过程中自定义的映像。因此,如果有几个不同的脚本,则只能创建一个图像,只需将其参数化即可使用自定义脚本。
我希望它有所帮助,如果需要更多信息,请告诉我。
问候。