3

Ich versuche, mit Tensorflow Serving ein großen (1,2 GB groß) -Modell zu machen dienen, aber ich bin immer ein:Tensorflow Serving: Großes Modell, protobuf Fehler

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 

ich durch ein paar verwandten Themen lese auf Github von vor ein paar Jahren, aber letztlich drehte es sich nicht verwandt, da Serving die C++ - Version des Protobuf verwendet. Es gibt wenig Informationen zum Bereitstellen großer Modelle mit Serving, sodass alle Informationen ausreichen würden.

Tensorflow Serving wurde auf der Host-Maschine kompiliert, so war das Modell, aber mit python3 (ich frage mich, ob es überhaupt etwas zu tun hat). Gibt es eine schnelle Lösung dafür, oder muss ich die Serving C++ - Quellen durchsuchen und die Größe der Nachricht erhöhen?

bearbeiten pro Anfrage in den Kommentaren:

ich das Modell speichern die offizielle Tutorial nach. Der Grund, warum das Modell so groß ist, ist, dass ich eine Einbettungsschicht gespeichert habe. Hier ist die Einsparung Code sowieso:

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() 

Das Modell von einem kompilierten TF gelesen wird Serving von GitHub auf einer Ubuntu 16.04-Host.

+0

Können Sie auch eingeben, wie Sie das Modell schreiben und lesen? –

+0

@DenizBeker Ich habe den Beitrag aktualisiert – clstl

Antwort

2

Hoffe es hilft jemandem, aber ich "fand" eine Lösung.

Das Hauptproblem war offensichtlich; es ist ein NLP-Modell, also hat es einen großen Wortschatz, der damit einhergeht. Wenn man das Vokabular in der Graphdefinition belässt, wird das Metagraphdef aufgebläht, und bei einem so großen Protokoll gibt Protobuf einen Fehler aus. Die Lösung würde das Wörterbuch in die assets_collection setzen. Es gibt wenig Dokumentation zu dem, was Sie eigentlich tun müssen, aber die saved_model_test.py im offiziellen Repo zu betrachten, ist es wert, betrachtet zu werden.

Um die Assets mit Tensorflow Serving zu nutzen, muss man ein benutzerdefiniertes Servable erstellen, wie in der offiziellen Dokumentation Creating a new kind of servable beschrieben. Kann kein konkretes Beispiel geben, weil ich das Modell vorerst nur containerisiert habe.

Wenn jemand Beispiele hat oder eine bessere Strategie hat, wenn es um NLP-Modelle geht, würde ich mich freuen, darüber weiter zu diskutieren.

Verwandte Themen