在AWS Sagemaker中使用Tensorflow Estimator时,培训工作是否会自动将模型工件保存到/ opt / ml / model?

时间:2019-06-27 20:24:33

标签: python tensorflow amazon-s3 tensorflow-estimator amazon-sagemaker

我正在尝试训练Tensorflow Estimator,并将创建的模型工件上传到S3。培训工作已成功完成,但是我们收到一条警告,提示“在/ opt / ml / model路径下未保存任何模型工件。您的培训工作不会将任何模型文件保存到S3。”当我们尝试在SageMaker中部署模型时,这成为一个问题。我的理解是Estimator对象自动将模型工件保存到/ opt / ml / model。

主要思想是通过sagemaker进行培训,部署和测试。我们有一个entry.py脚本,一个.py培训脚本以及实例化Estimator对象的实际sagemaker笔记本

#BEGINNING OF TRAINING SCRIPT
# my_custom_code_3.py
import tensorflow as tf
import numpy as np

# import sagemaker
# from sagemaker.predictor import csv_serializer
# from pyathena import connect
# from pyathena.pandas_cursor import PandasCursor

def train_model(init_learn):

    b = tf.Variable([.3], tf.float32, name="b")
    W = tf.Variable([-.3], tf.float32, name="w")
    x = tf.placeholder(tf.float32, name="x")
    y = tf.placeholder(tf.float32, name="y")

    X_train = [4, 0, 12]
    Y_train = [5, 9, -3]

    linear_model = W*x + b   # y = W*x + b; 5= -1*4 + 9; 9=1*0 + 
    9;  -3 = -1*12 + 9

    model_delta = tf.square(linear_model - y)
    loss = tf.reduce_sum(model_delta)
    optimizer = 
    tf.train.GradientDescentOptimizer(init_learn).minimize(loss)
    init = tf.global_variables_initializer()

    with tf.Session() as sess:
        sess.run(init)
        for i in range(1000):
            feed_dict_batch = {x: X_train, y: Y_train}
            sess.run(optimizer, feed_dict=feed_dict_batch)

        W_value, b_value = sess.run([W, b])
        print(W_value)
        print(b_value)

if __name__ == '__main__':
    train_model(0.001)
# END OF TRAINING SCRIPT


# BEGINNING OF ENTRY.PY
# entry.py
import argparse, os
from my_custom_code_3 import train_model

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument(
        '--model_dir',
        type=str,
        default=os.environ['SM_MODEL_DIR'])
    parser.add_argument(
        '--init_learn',
        type=float)
    args = parser.parse_args()
    train_model(args.init_learn)
# END OF ENTRY.PY

# BEGINNING OF SAGEMAKER_RUN3.ipynb
import sagemaker
from sagemaker.tensorflow import TensorFlow

hyperparameters = {
    'init_learn': 0.001
    #'model_dir': 's3://stats-interns/tfmodel'
}

role = sagemaker.get_execution_role()
source_dir = 's3://stats-interns/my-test-3/my-test-3.tar.gz'
estimator = TensorFlow(
    entry_point='entry-3.py',
    source_dir=source_dir,
    model_dir='s3://tfmodel',
    #change to local to test locally first, install docker-compose
    train_instance_type='ml.m5.large',
    train_instance_count=1,
    hyperparameters=hyperparameters,
    role=role,
    py_version='py3',
    framework_version='1.12.0',
    script_mode=True)
estimator.fit()

我希望将工件保存到/ opt / ml / model中,然后上载到指定的s3目录s3:// tfmodel,但是,没有任何内容被复制,并且收到警告消息“未在以下位置保存任何模型工件” / opt / ml / model路径。您的培训工作不会将任何模型文件保存到S3。”

2 个答案:

答案 0 :(得分:0)

在培训结束时,SageMaker将在| id | userID | | --- | ------ | | | 5 | | | 67 | 中找到的所有内容复制到s3。因此,为了保存模型,您需要先在/opt/ml/model上自己保存模型。例如:

/opt/ml/model

答案 1 :(得分:0)

估计器不会保存模型,您已经完成了:)您还需要确保将模型保存在正确的位置。在脚本模式下,SageMaker将输出位置传递到os.environ ['SM_MODEL_DIR']中的代码,因此只需使用该值,就可以了。

如果要使用SageMaker Tensorflow容器进行部署,则模型必须采用Tensorflow Serving格式。这应该达到目的:

parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR'])
model_dir  = args.model_dir
...
sess = K.get_session()
tf.saved_model.simple_save(
        tf.Session(),
        os.path.join(model_dir, 'model/1'),
        inputs={'inputs': model.input},
        outputs={t.name: t for t in model.outputs})

此处有很多示例:https://github.com/awslabs/amazon-sagemaker-examples/tree/master/sagemaker-python-sdk