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