Python 向现有Tensorflow模型添加{serve}元图

Python 向现有Tensorflow模型添加{serve}元图,python,tensorflow,amazon-sagemaker,Python,Tensorflow,Amazon Sagemaker,情况: 我已经创建了几个模型,每个模型经过几天的培训,我们已经准备好从本地测试转移到服务环境 使用函数保存模型 def将图形保存到文件(sess、图形、图形文件名): “”“将图形保存到文件,必要时创建有效的量化图形。”“” output_graph_def=graph_util.convert_variables_to_constants(sess,graph.as_graph_def(),[final_tensor_name]) 将gfile.FastGFile(图形文件名“wb”)作为f:

情况:

我已经创建了几个模型,每个模型经过几天的培训,我们已经准备好从本地测试转移到服务环境

使用函数保存模型

def将图形保存到文件(sess、图形、图形文件名):
“”“将图形保存到文件,必要时创建有效的量化图形。”“”
output_graph_def=graph_util.convert_variables_to_constants(sess,graph.as_graph_def(),[final_tensor_name])
将gfile.FastGFile(图形文件名“wb”)作为f:
f、 写入(输出图定义序列化字符串())
现在,当尝试部署到服务环境(Sagemaker,使用正确的目录结构和文件命名约定)时,系统返回

2019-06-04 22:38:53.794056: I external/org_tensorflow/tensorflow/cc/saved_model/reader.cc:54] Reading meta graph with tags { serve }
2019-06-04 22:38:53.798096: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:259] SavedModel load for tags { serve }; Status: fail. Took 83297 microseconds.
2019-06-04 22:38:53.798132: E tensorflow_serving/util/retrier.cc:37] Loading servable: {name: model version: 1} failed: Not found: Could not find meta graph def matching supplied tags: { serve }. To inspect available tag-sets in the SavedModel, please use the SavedModel CLI: `saved_model_cli`
我只有
*.pb
文件及其标签文本文件。它们在本地环境中的多台计算机上工作

def加载图(模型文件):
"""
Tensorflow的label_image.py示例v1.6.0中的代码
"""
graph=tf.graph()
graph_def=tf.GraphDef()
打开(模型_文件“rb”)作为f:
graph_def.ParseFromString(f.read())
使用graph.as_default():
tf.导入图形定义(图形定义)
返回图
inputLayer=“Mul”
outputLayer=“最终结果”
inputName=“导入/”+inputLayer
outputName=“导入/”+outputLayer
图=加载图(模型路径)
inputOperation=图形。通过名称(inputName)获取操作
outputOperation=图形。通过名称(outputName)获取操作
使用tf.Session(graph=graph)作为sess:
# ... 做一个张量t
结果=sess.run(outputOperation.outputs[0]{
输入操作输出[0]:t
})
#这里的函数结果很好
我想做的就是获取这些现有文件,添加所需的“serve”标记,然后重新保存它们,但我看到的一切似乎都与从头开始做这件事有关

我尝试使用生成器将图形附加到模型中,如下所示:

#加载图形
图=加载图(模型路径)
进口舒蒂尔
如果os.path.exportDir存在:
shutil.rmtree(exportDir)
#添加服务元图标记
builder=tf.saved\u model.builder.SavedModelBuilder(exportDir)
从tensorflow.saved_模型导入标记_常量
使用tf.Session(graph=graph)作为sess:
builder.add_meta_graph_和_变量(sess,[tag_constants.service,tag_constants.GPU],strip_default_attrs=True)
builder.save()
打印(“构建了一个保存的模型”)

但还是出现了同样的错误。

最终解决了这个问题。这包含一些特定于S3的代码和S3实例调用(
命令),但您应该能够将其切分出来运行

#!蟒蛇3
"""
假设我们定义了:
-我们的工作文件所在的目录,CONTAINER\u DIR
-任意整数版本_INT
-我们已经为我们的模型建立了本地路径和S3路径,并将它们的标签作为变量,特别是'modelLabel'和'modelPath'`
"""
#为模型创建一个版本化的路径
#看https://stackoverflow.com/a/54014480/1877527
exportDir=os.path.join(CONTAINER\u DIR,VERSION\u INT)
如果os.path.exportDir存在:
shutil.rmtree(exportDir)
os.mkdir(exportDir)
导入tensorflow作为tf
def加载图(模型文件,返回元素=无):
"""
Tensorflow的label_image.py示例v1.6.0中的代码
"""
graph=tf.graph()
graph_def=tf.GraphDef()
打开(模型_文件“rb”)作为f:
graph_def.ParseFromString(f.read())
返回=无
使用graph.as_default():
returns=tf.import_graph_def(graph_def,return_elements=returnElements)
如果returnElements为None:
返回图
返回图
#添加服务元图标记
#我们需要输入层名称;在《盗梦空间》中,我们正在输入调整大小的张量
#对应于调整大小的\u输入\u张量\u名称
#如果不使用Inception,可以自动确定这一点,
#但对于《盗梦空间》来说,这是第11层
inputLayerName=“Mul:0”
#加载图形
如果inputLayerName为无:
图=加载图(模型路径)
输入传感器=无
其他:
graph,returns=load\u graph(modelPath,returnElements=[inputLayerName])
InputSensor=返回[0]
使用tf.Session(graph=graph)作为sess:
#阅读图层
尝试:
从tensorflow.compat.v1.saved_model导入simple_save
除了(ModuleNotFoundError、ImportError):
从tensorflow.saved\模型导入简单\保存
使用graph.as_default():
layers=[n.name表示图形中的n.as_graph_def().node]
outName=layers.pop()+“:0”
如果inputLayerName为无:
inputLayerName=layers.pop(0)+“:0”
打印(“正在检查outlayer”,outName)
explayer=tf.get\u default\u graph().get\u tensor\u by\u name(outName)
如果输入传感器为无:
打印(“检查层”,输入层名称)
InputSensor=tf.get_default_graph().get_tensor_by_name(inputLayerName)
输入={
输入层名称:输入传感器
}
输出={
姓名:欧莱尔
}
简单保存(sess、exportDir、输入、输出)
打印(“构建了一个保存的模型”)
#将模型标签放入工件目录
modellablebeldest=os.path.join(exportDir,“saved_model.txt”)
!cp{modelLabel}{modelLabelDest}
#准备上菜
将日期时间导入为dt
modelArtifact=f“livemodel_u{dt.datetime.now().timestamp()}.tar.gz”
#将此处的版本目录复制到包
!cp-R{exportDir}/
#gziptar it
!tar-czvf{modelArtifact}{VERSION_INT}
#推回到S3上桌
!aws s3 cp{modelArtifact}{bucketPath}
shutil.rmtree(内部版本)#清理
shutil.rmtree(exportDir)#清理
然后,该模型可以部署为Sagemaker端点(以及任何其他Tensorflow服务环境)