Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TF-如何正确设置模型签名,以便与Docker一起使用?_Python_Docker_Tensorflow_Tensorflow Serving - Fatal编程技术网

Python TF-如何正确设置模型签名,以便与Docker一起使用?

Python TF-如何正确设置模型签名,以便与Docker一起使用?,python,docker,tensorflow,tensorflow-serving,Python,Docker,Tensorflow,Tensorflow Serving,我试图了解如何为docker服务建立TF模型。我设法安装了docker,我知道如何将经过训练的模型导出为.pb。我不明白的是如何正确定义服务的模型签名。我想简单地用docker调用终端中经过训练的模型。你能解释一下在下面的例子中我需要改变什么吗 我正在执行以下步骤: 1) 创建目录/tmp/serving_minimal,在终端$cd/tmp/serving_minimal 2) 将以下代码的文件generate_model.py保存在/tmp/service_minimal中 将numpy导入

我试图了解如何为docker服务建立TF模型。我设法安装了docker,我知道如何将经过训练的模型导出为.pb。我不明白的是如何正确定义服务的模型签名。我想简单地用docker调用终端中经过训练的模型。你能解释一下在下面的例子中我需要改变什么吗

我正在执行以下步骤:

1) 创建目录
/tmp/serving_minimal
,在终端
$cd/tmp/serving_minimal

2) 将以下代码的文件
generate_model.py
保存在
/tmp/service_minimal

将numpy导入为np
导入tensorflow作为tf
导入操作系统,shutil
#%%资料
#输入(2D)
x=np.array([[x1,x2]表示np.linspace中的x1(10,20,4)表示np.linspace中的x2(-7,-3,3)])
#输出(3D)
f=np.array([[np.sin(np.sum(xx)),np.cos(np.sum(xx)),np.cos(np.sum(xx))**2]表示x中的xx])
#%%模型
打印(“****************************************************************************”)
打印('TF-save')
#输入x和输出f的尺寸
d_x=x.shape[-1]
d_f=f.形状[-1]
#占位符
x_p=tf.placeholder(tf.float64,[None,d_x],'my_x_p')
f_p=tf.placeholder(tf.float64,[None,d_f],'my_f_p')
#模型
模型=x_p
模型=tf.layers.dense(模型,7,tf.tanh)
模型=tf.layers.density(模型,5,tf.tanh)
模型=tf.layers.density(模型,d_f,无)
model=tf.identity(model,'my_model')
#会议
sess=tf.Session()
sess.run(tf.global\u variables\u initializer())
#为以后的服务检查进行评估
f_model=sess.run(model,{x_p:x})
文件夹='数据'
如果不存在os.path.exists(文件夹):
os.mkdir(文件夹)
np.savetxt('data/x.dat',f_模型)
np.savetxt('data/f_model.dat',f_model)
#保存模型
文件夹='saved/model/001'
如果os.path.存在(文件夹):
rmtree(文件夹)
打印('旧型号已删除')
saver=tf.saved\u model.builder.SavedModelBuilder(文件夹)
############################################
#如何正确设置签名?
############################################
info\u input=tf.saved\u model.utils.build\u tensor\u info(x\u p)
info\u output=tf.saved\u model.utils.build\u tensor\u info(model)
签名=tf.saved_model.signature_def_utils.build_signature_def(
输入={'x':信息输入}
,outputs={'f':info_output}
,method_name=tf.saved_model.signature_constants.PREDICT_method_name
)
saver.add_meta_graph_和_变量(
赛斯
,[tf.saved_model.tag_constants.service]
,signature_def_map={'predict':signature}
####################################################################
###为了以后调用模型,我需要在这里放置什么
###在DOCKER服务时,我如何称呼DOCKER??
####################################################################
)
save.save()
#关闭并清理
sess.close()
tf.reset_default_graph()
#%%加载Python并检查
打印(“****************************************************************************”)
打印('TF-load in Python')
#会议
sess=tf.Session()
#装载
tf.saved_model.loader.load(
赛斯
,[tf.saved_model.tag_constants.service]
,文件夹
)
#从图中提取操作
graph=tf.get\u default\u graph()
x_p=graph.get_tensor_by_name('my_x_p:0'))
f\u p=graph.get\u tensor\u by\u name('my\u f\u p:0'))
模型=图形。通过名称获取张量(“我的模型:0”)
#评价模型
f_model2=sess.run(model,{x_p:x})
打印(f_模型-f_模型2)
#关闭并清理
sess.close()
tf.reset_default_graph()
4) 在终端
$python generate_model.py
中运行脚本(导出模型并将其加载到python中进行检查)

5) 在终端中启动docker
$sudo docker ps

6) docker中的运行模型

$ sudo docker run \
    -p 8501:8501 \
    --name my_container \
    --mount type=bind,source=/tmp/serving_minimal/saved/model,target=/models/model1 \
    -e MODEL_NAME=model1 \
    -t tensorflow/serving &
7) 检查模型是否处于活动状态(它处于活动状态)

8) [错误]尝试评估活动模型

$ curl -d '{"x": [[1.0,2.0],[10.0,20.0]]}' -X POST http://localhost:8501/v1/models/model1:predict
在8)我得到了错误

{ "error": "Serving signature name: \"serving_default\" not found in signature def" }

但我不太了解TF签名定义命令,因此不知道该怎么做。你能告诉我需要纠正的地方吗?谢谢大家!

请参见培训代码中的这一行

signature_def_map={'predict':signature}
所以你应该像这样改变你的post请求主体

{
  'signature_name': 'predict',
  'x': [[1.0,2.0],[10.0,20.0]]
}
或者将培训代码中的“predict”更改为“serving_default”,并且您无法在post请求中指定签名名称

可能会有所帮助。正如错误所说,签名定义似乎没有提供默认值。可能是与导出模型的方式有关的问题。
{
  'signature_name': 'predict',
  'x': [[1.0,2.0],[10.0,20.0]]
}