c++ - Tensorflow 服务 : Large model, protobuf 错误

标签 c++ machine-learning tensorflow deep-learning tensorflow-serving

我正在尝试使用 Tensorflow Serving 制作一个大型(大小为 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 使用的是 C++ 版本的 protobuf。关于使用 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 服务读取。

最佳答案

希望它对某人有所帮助,但我“找到”了解决方案。

主要问题很明显;这是一个 NLP 模型,因此它有一个很大的词汇量。在图形定义中保留词汇会使 metagraphdef 膨胀,并且 protobuf 在面对如此大的协议(protocol)时会出错。

解决方案是将字典放入assets_collection。关于您实际必须做的事情的文档很少,但查看 saved_model_test.py官方 repo 值得一看。

要利用 Tensorflow Serving 的 Assets ,必须创建自定义 Servable,如 Creating a new kind of servable 中所述官方文档。无法提供具体的例子,因为我暂时只是简单地容器化了模型。

如果有人在 NLP 模型部署方面有示例或有更好的策略,我很乐意进一步讨论。

关于c++ - Tensorflow 服务 : Large model, protobuf 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47612069/

相关文章:

c++使用结构中的指针保存和加载游戏

python - 如何使用估计器获得用于混淆矩阵的类分数?

python - 无法从检查点 : bidirectional/backward_lstm/bias 恢复

python - 机器学习模型如何更新?

python - 使用 tensorflow tf-transform 进行数据规范化

c++ - linux c/c++编程支持设置进程优先级吗?

javascript - 将 URL 从 javascript 传递到 ActiveX 会是一个安全漏洞吗?

c++ - 条件与外部获取数组元素的不同结果

r - C50 代码调用 exit,值为 1(使用因子决策变量 a 非空值)

python - 为什么我收到此错误 : You must feed a value for placeholder tensor 'Placeholder_3' with dtype float