2017-06-20 332 views
1

我正在嘗試導出我的模型以通過SavedModel進行服務,並且在推理調用中遇到服務客戶端上的問題。Tensorflow,Tensorflow-serving:用於SavedModel簽名的多個輸入

error: 
grpc.framework.interfaces.face.face.AbortionError: AbortionError(code=StatusCode.INVALID_ARGUMENT, details="Missing ModelSpec") 

我有4個佔位符必須提供,輸入,差(將1.0推理),和(a可怕解決方法)用於裝載預訓練GoogleW2V矢量的嵌入(由於它們的尺寸,我必須通過佔位符將它們提供給嵌入查找的圖表,因爲在服務客戶端中我必須創建tensor_proto來提供給佔位符,並且不能創建大於2 GB的張量原型,所以作爲解決方法我把它們分成兩半,並將它們與圖形相吻合)

在我的模型中,我保存簽名如下(我試圖儘可能簡化以幫助弄清楚如何使用多個輸入)。

builder = saved_model_builder.SavedModelBuilder(export_path) 

tensor_info_x = utils.build_tensor_info(model._input) 
tensor_info_dropout = utils.build_tensor_info(model._dropout) 
tensor_info_emb1 = utils.build_tensor_info(model._embeddingPlaceholder1) 
tensor_info_emb2 = utils.build_tensor_info(model._embeddingPlaceholder2) 
tensor_info_y = utils.build_tensor_info(model.softmaxPredictions) 

prediction_signature = signature_def_utils.build_signature_def(
inputs={'inputs': tensor_info_x, 
     'dropout': tensor_info_dropout, 
     'googlew2v1': tensor_info_emb1, 
     'googlew2v2': tensor_info_emb2 
}, 
outputs={'softmaxPredictions': tensor_info_y}, 
method_name=signature_constants.PREDICT_METHOD_NAME) 

builder.add_meta_graph_and_variables(
    tfSession, 
    [tag_constants.SERVING], 
    signature_def_map={ 
     'softmaxPredictions': prediction_signature 
}) 

builder.save() 

在客戶端我做的推論:

def do_sem_inference(vs, data): 

    host, port = CONFIG.semserver.split(':') 
    channel = implementations.insecure_channel(host, int(port)) 
    stub = prediction_service_pb2.beta_create_PredictionService_stub(channel) 
    request = predict_pb2.PredictRequest() 
    request.model_spec.name = 'sem' 
    request.model_spec.signature_name = 'softmaxPredictions' 

    proto = tf.contrib.util.make_tensor_proto(data, dtype=tf.int32) 
    request.inputs['inputs'].CopyFrom(proto) 

    dropoutProto = tf.contrib.util.make_tensor_proto(1.0, dtype=tf.float32) 
    request.inputs['dropout'].CopyFrom(dropoutProto) 

    ##### 
    # This is the reason I have to break the GoogleW2V in half, tensor_proto cannot be larger than 2GB 
    ##### 

    googlew2vProto1 = tf.contrib.util.make_tensor_proto(vs.wordVectors()[:1500000], dtype=tf.float32) 
    request.inputs['googlew2v1'].CopyFrom(googlew2vProto1) 
    googlew2vProto2 = tf.contrib.util.make_tensor_proto(vs.wordVectors()[1500000:], dtype=tf.float32) 
    request.inputs['googlew2v2'].CopyFrom(googlew2vProto2) 

    result_future = stub.Predict.future(request, 100.0) 
    results = tf.contrib.util.make_ndarray(result_future.result().outputs['outputs']) 

但我得到的錯誤(如上面顯示):

Traceback (most recent call last): 
    File "sem_client.py", line 121, in <module> 
    tf.app.run() 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/platform/app.py", line 48, in run 
    _sys.exit(main(_sys.argv[:1] + flags_passthrough)) 
    File "sem_client.py", line 114, in main 
    result = do_sem_inference(vectorSpace, embeddingLookup(vectorSpace, sentence)) 
    File "sem_client.py", line 66, in do_sem_inference 
    results = tf.contrib.util.make_ndarray(result_future.result().outputs['outputs']) 
    File "/usr/local/lib/python2.7/dist-packages/grpc/beta/_client_adaptations.py", line 112, in result 
    raise _abortion_error(rpc_error_call) 
grpc.framework.interfaces.face.face.AbortionError: AbortionError(code=StatusCode.INVALID_ARGUMENT, details="Missing ModelSpec") 

我已經沖刷淨求救使用多個輸入的簽名,有人說使用exporter.generic_signature,但源代碼說這是過時的,而不是使用SavedModel。我還沒有看到任何明確的例子說明如何使用generic_signature。我也沒有發現任何通過SavedModel使用多個輸入到簽名的例子,任何想法如何使這個工作?

感謝您的幫助和建議。

P.S.我也對想法感興趣,以避免必須將googleW2V嵌入分爲兩半,並通過佔位符(再次,由於需要爲此模型服務)提供。目標是查找googleW2V中的嵌入並將其用於我的模型(我知道如何在不使用谷歌w2v嵌入的情況下執行此操作,但我更願意使用這些嵌入)。

+0

模型如何啓動您的tensorflow投放?我能看到你開始命令嗎?預期意味着你沒有通過model_spec,但是在你的代碼中你確實設置了這個值,所以我不確定你的問題。 P.S.您可以將嵌入加載爲變量並將它們導出爲推理圖的一部分。如果它們太大,可以將它們分割成分區。 –

+0

'tf-serving/serving $ bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port = 9002 --model_name = sem --model_base_path =/home/dev/sem/export/CW11Sem /' 而現在,嵌入我將它們作爲變量加載。我創建一個變量和一個佔位符,然後將佔位符分配給變量並通過feed_dict提供佔位符: 'self.X = tf.Variable(tf.constant(0.0,shape = [1500000,300]) ,可訓練=假,名稱=「X」) self._embeddingPlaceholder1 = tf.placeholder(tf.float32,[1500000,300]) self.set_x = self.X.assign(self._embeddingPlaceholder)' –

+0

could not編輯我看到的拼寫錯誤,嵌入代碼是正確的,忽略self._embeddingPlaceholder在結尾 –

回答

0

所以我想我一想到這件事,就想清楚發生了什麼事情,手頭的問題以及這種愚蠢的事情。

googlew2v矢量嵌入大約爲3GB。在我服務的客戶端中,我試圖爲嵌入設置輸入張量,然後進行RPC調用......必須有一些保護措施,以防止我嘗試RPC數據(do'h)。這個錯誤不是很清楚,但是一旦我隨機使用了一小部分嵌入,它的工作就沒有問題。

我想我可以爲我的用例想出一個解決方法。但是現在我不能在我的模型中使用googlew2v嵌入作爲佔位符(否則我必須在服務器端提供它們,並且它不會允許我通過RPC發送非常大的數據,即使它已經做到了這將需要永遠)。

我在我的項目中有一個解決方法(我只是在培訓和服務之前做嵌入查找等)。但是,如果它可能希望通過變量或其他東西將Googlew2v嵌入包含在我的模型中,而不必讓它們成爲佔位符(這樣我就可以利用tf.nn.embedding_lookup並行性和速度)。

0

您可以在生成器中使用的資產,當您導出PB模型,你可以使用able = lookup.index_table_from_file(vocab_path)當你定義一個input_x = tf.placeholder(tf.string, ...)