3

我努力使服務與Tensorflow服務大(1.2 GB的大小)模式,但我得到一個:Tensorflow服務:Large模式,protobuf的錯誤

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服務被編譯在主機上,因此是模型,但使用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() 

該模型是由編譯TF從GitHub Ubuntu的16.04主機上的服務閱讀。

+0

您還可以鍵入如何編寫和讀取模型? –

+0

@DenizBeker我已更新帖子 – clstl

回答

2

希望它可以幫助別人,但我「發現」的解決方案。

主要的問題是顯而易見的;他是一個NLP模型,因此它有一個很大的詞彙。留下圖表定義中的詞彙會使metagraphdef膨脹,而protobuf在面對這樣一個大的協議時會出錯。

該解決方案把字典中assets_collection。幾乎沒有文件證明您實際需要做的事情,但在官方回購中查看saved_model_test.py值得一看。

至於利用與Tensorflow服務的資產,人們必須創建一個自定義可服務的,作爲Creating a new kind of servable官方文檔中描述。無法提供具體的例子,因爲我暫時只是將模型容器化了。

如果任何人有實例,或者有更好的策略,當談到NLP模型的部署,我會很樂意進一步的討論。