我正在尝试使用现有的Python类定义Sagemaker培训工作。据我了解,我可以创建自己的容器,但不想处理容器管理。
选择“算法源”时,可以选择“您自己的算法源”,但是资源下方未列出任何内容。这是哪里来的?
我知道我可以通过笔记本来完成此操作,但是我确实希望在可以通过端点调用的作业中对此进行定义。
答案 0 :(得分:0)
我相信这是不可能的,因为您可以参考SageMaker文档上的this part。需要一个容器来提供与任何语言和框架一起运行的功能。
在训练作业创建中列出的算法是可以在SageMaker->训练->算法中创建的算法。但是,有必要定义一个容器,这是如何进行训练和预测的规范。即使您不构建容器,您也将引用现有容器(使用内置算法),或者您将使用市场上的一种算法,其中有人使用图像来构建该容器。
我相信您可以建立一个满足您需求的映像,该映像可以与现有映像分开。
构建图像后,您可以轻松地使用它来自动执行来自lambda的训练/预测工作。 Here是一个例子。
此外,您可以根据需要为容器提供尽可能多的输入通道,从理论上讲,您可以传递一个通道,该通道引用您要在容器启动时加载的脚本。但是根据您的情况,我刚刚想到的一个想法可能值得一试。通常,您可以拥有可以在Docker构建过程中自定义的映像。因此,如果有多个不同的脚本,则只能创建一个图像,并对其进行参数化以使用自定义脚本。
希望对您有所帮助。
致谢。
答案 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()
运行上述操作将
就差不多了。当然这里没有提到很多,但是您可以:
我找到的最好的资源是我分享的示例,但这是我为使之正常运行所需要的所有东西:
答案 2 :(得分:0)
我不确定这是否对您有帮助,但是您可以使用Tensorflow估算器,它类似于AWS的内置容器。您需要一个培训脚本和requirements.txt文件,其中将包含您可能需要的依赖项。您可以点击此链接以获取更多信息https://pyradiomics.readthedocs.io/en/latest/installation.html#install-via-conda