簡體   English   中英

在AWS Sagemaker中使用Tensorflow Estimator時,培訓工作是否會自動將模型工件保存到/ opt / ml / model?

[英]When using a Tensorflow Estimator in AWS Sagemaker, will the training job automatically save the model artifacts to /opt/ml/model?

我正在嘗試訓練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。”

培訓結束時,SageMaker將在/opt/ml/model找到的所有內容復制到s3。 因此,為了保存模型,您需要先將其自己保存在/opt/ml/model 例如:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM