我在尝试使用Tensorflow Serving来服务一个大型模型(大小为1.2 GB),但我遇到了以下错误:
2017-12-02 21:55:57.711317: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:236] 从...加载SavedModel:[libprotobuf ERROR external/protobuf_archive/src/google/protobuf/io/coded_stream.cc:193] 一个协议消息因为太大(超过1073741824字节)而被拒绝。要增加限制(或禁用这些警告),请参见google/protobuf/io/coded_stream.h中的CodedInputStream::SetTotalBytesLimit()。2017-12-02 21:55:58.563507: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:284] 加载SavedModel:失败。耗时852178微秒。2017-12-02 21:55:58.563567: E tensorflow_serving/util/retrier.cc:38] 加载可服务对象:{name: 2 version: 2} 失败:数据丢失:无法将.../saved_model.pb解析为二进制协议
我在Github上查阅了几年前的一些相关问题,但最终发现它们与我的问题无关,因为Serving使用的是protobuf的C++版本。关于使用Serving部署大型模型的信息很少,所以任何信息都对我有帮助。
Tensorflow Serving是在主机上编译的,模型也是如此,但使用的是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 Serving读取。
回答:
希望这对某人有帮助,但我“找到了”一个解决方案。
主要问题很明显;这是一个NLP模型,因此它带有一个大的词汇表。将词汇表保留在图定义中会使metagraphdef膨胀,当面对如此大的协议时,protobuf会报错。
解决方案是将字典放入assets_collection。关于你实际需要做什么的文档很少,但查看官方仓库中的saved_model_test.py值得一看。
要在Tensorflow Serving中使用资产,必须创建一个自定义的Servable,如创建新类型的可服务对象官方文档中所述。由于我暂时只是将模型容器化,所以无法提供具体的示例。
如果有人有示例,或者在部署NLP模型时有更好的策略,我很乐意进一步讨论。