Tensorflow Serving: изменение тензора при подаче - PullRequest
1 голос
/ 13 апреля 2019

Задача

Я новичок в работе с Tensorflow (на самом деле это моя первая модель, которую я обслуживаю!), Поэтому я прошу прощения, если ответ очевиден!

Я размещаю модель Tensorflow на докере, используя это изображение . Проблема в том, что сервер отправляет следующую ошибку каждый раз, когда я пытаюсь отправить данные, чтобы обслуживаемая модель могла делать прогнозы.

W external/org_tensorflow/tensorflow/core/framework/op_kernel.cc:1401] OP_REQUIRES failed at transpose_op.cc:157 : Invalid argument: transpose expects a vector of size 4. But input(1) is a vector of size 3

Справочная информация

  1. С помощью save_model_cli модель можно отобразить как
signature_def['predict']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['init_state'] tensor_info:
        dtype: DT_FLOAT
        shape: (2, 2, -1, 136)
        name: policy_estimator/lstm/Placeholder:0
    inputs['state'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 136)
        name: policy_estimator/state:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['action_probs'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 260)
        name: policy_estimator/Softmax:0
    outputs['final_state'] tensor_info:
        dtype: DT_FLOAT
        shape: (2, 2, -1, 136)
        name: policy_estimator/packed:0
  Method name is: tensorflow/serving/predict
  1. Модель работает без ошибок перед хостингом, потому что мне удалось обучить модель, используя уже существующие данные.
  2. Ошибка, по-видимому, соответствует измерению состояния. Когда я изменяю размер данных для передачи в состояние с 2 (то есть (-1, 136)) на 3 (используя np.expand_dims), сообщение об ошибке меняется на
W external/org_tensorflow/tensorflow/core/framework/op_kernel.cc:1401] OP_REQUIRES failed at transpose_op.cc:157 : Invalid argument: transpose expects a vector of size 5. But input(1) is a vector of size 3

и когда я изменяю размер на 4, он меняется на

W external/org_tensorflow/tensorflow/core/framework/op_kernel.cc:1401] OP_REQUIRES failed at transpose_op.cc:157 : Invalid argument: transpose expects a vector of size 6. But input(1) is a vector of size 3

Однако, когда я делаю это 1 измерение, сообщение об ошибке остается как

W external/org_tensorflow/tensorflow/core/framework/op_kernel.cc:1401] OP_REQUIRES failed at transpose_op.cc:157 : Invalid argument: transpose expects a vector of size 4. But input(1) is a vector of size 3
  1. Сервер работает правильно, как я получаю
{
 "model_version_status": [
  {
   "version": "1",
   "state": "AVAILABLE",
   "status": {
    "error_code": "OK",
    "error_message": ""
   }
  }
 ]
}

когда я запускаю curl http://model:8501/v1/models/saved_model, где http://model:8501/v1/models/saved_model - это место, где находится модель.

  1. Я прошу модель, использующую python,
payload = [{"init_state":np.reshape(initial_state, (2,2,-1,136)).tolist(), "state": np.reshape(points, (-1, 136)).tolist()}]
headers = {"content-type": "application/json"}
data = json.dumps({"signature_name": "predict", "instances":payload})
r = requests.post('http://model:8501/v1/models/saved_model:predict', data=data, headers=headers)

следуя этой документации . Где г ответ. В этом случае этот r возвращает ответ 400.

Личное заключение

Единственный вывод, который я мог сделать из этого, состоял в том, что, возможно, произошли изменения в модели при ее обслуживании. Однако это всего лишь предположение, поскольку я застрял и не уверен в следующем шаге.

Я не профессионал, так что снова, я прошу прощения, если я упустил что-то очевидное! Пожалуйста, порадуйте меня. Если какая-либо информация отсутствует, пожалуйста, сообщите мне, так как я сделаю все возможное, чтобы уточнить!

1 Ответ

0 голосов
/ 17 апреля 2019

Попробуйте это:

import json
.
.
.
payload = {"init_state":np.reshape(initial_state, (2,2,-1,136)).tolist(),"state": np.reshape(points, (-1, 136)).tolist()}
headers = {"content-type": "application/json"}
data = json.dumps({"signature_name": "predict", "inputs":payload})
# add this
data = json.loads(data) # apparently json.dumps returns a json string: '{}' not a json object: {} 

r = requests.post('http://model:8501/v1/models/saved_model:predict', json=data, headers=headers)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...