Tensorflow Serving: 大模型,protobuf错误

我在尝试使用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模型时有更好的策略,我很乐意进一步讨论。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注