【问题标题】:When using a Tensorflow Estimator in AWS Sagemaker, will the training job automatically save the model artifacts to /opt/ml/model?在 AWS Sagemaker 中使用 TensorFlow Estimator 时,训练作业是否会自动将模型工件保存到 /opt/ml/model?
【发布时间】:2019-11-09 21:21:33
【问题描述】:

我正在尝试训练 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。"

【问题讨论】:

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


    【解决方案1】:

    Estimator 不会保存模型,您已经完成了 :) 您还需要确保将模型保存在正确的位置。在脚本模式下,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

    【讨论】:

    • 我们可以更改模型工件的 S3 位置吗?
    • 是的,S3 中的输出位置可以在估算器中配置。
    【解决方案2】:

    在训练结束时,SageMaker 将它在 /opt/ml/model 中找到的任何内容复制到 s3。因此,为了保存您的模型,您需要先将其保存在/opt/ml/model。例如:

    tf.contrib.saved_model.save_keras_model(model, /opt/ml/model)
    

    【讨论】:

      猜你喜欢
      • 2020-05-25
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 2021-04-18
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      相关资源
      最近更新 更多