我正在尝试使用Tensorflow服务来制作一个大型(1.2 GB大小)模型,但我得到了一个:
2017-12-02 21:55:57.711317: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:236] Loading SavedModel from: ...
[libprotobuf ERROR external/protobuf_archive/src/google/protobuf/io/coded_stream.cc:193] A protocol message was rejected because it was too big (more than 1073741824 bytes). To increase the limit (or to disable these warnings), see CodedInputStream::SetTotalBytesLimit() in google/protobuf/io/coded_stream.h.
2017-12-02 21:55:58.563507: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:284] Loading SavedModel: fail. Took 852178 microseconds.
2017-12-02 21:55:58.563567: E tensorflow_serving/util/retrier.cc:38] Loading servable: {name: 2 version: 2} failed: Data loss: Can't parse .../saved_model.pb as binary proto
我从几年前开始阅读关于Github的一些相关问题,但最终它变得无关,因为Serving正在使用protobuf的C ++版本。关于使用Serving部署大型模型的信息很少,因此任何信息都足够了。
Tensorflow服务是在主机上编译的,模型也是如此,但是使用python3(我想知道它是否与任何东西有关)。 有没有快速解决此问题,或者我必须深入了解Serving C ++源并增加消息的大小?
在评论中按照请求进行修改:
我根据官方教程保存模型。模型之所以如此之大,是因为我保存了一个嵌入层。无论如何,这是保存代码:
export_path = 'model/1'
builder = saved_model_builder.SavedModelBuilder(export_path)
signature = predict_signature_def(inputs={'input': input},
outputs={'sent': output})
builder.add_meta_graph_and_variables(sess=session,
tags=[tag_constants.SERVING],
signature_def_map={'predict': signature})
builder.save()
该模型由Ubuntu 16.04主机上的GitHub编译的TF服务器读取。
答案 0 :(得分:2)
希望它有所帮助,但我“找到了”解决方案。
主要问题显而易见;他是一个NLP模型,因此它有很大的词汇量。将图表中的词汇留在metagraphdef中,protobuf在面对如此大的协议时会出错。
解决方案是将字典放在 assets_collection 中。几乎没有关于你实际需要做什么的文档,但是在官方回购中查看saved_model_test.py值得关注。
关于利用Tensorflow服务的资产,必须创建一个自定义Servable,如Creating a new kind of servable 官方文档中所述。无法提供具体的例子,因为我暂时将模型容器化。
如果有人有示例,或者在NLP模型部署方面有更好的策略,我很乐意进一步讨论。