Подача тензорного потока: изменение размера тензора при подаче

#tensorflow #tensorflow-serving

#тензорный поток #подача тензорного потока

Вопрос:

Проблема

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

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

 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. Используя saved_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 — ответ. В этом случае это r возвращает ответ 400.

Личный вывод

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

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

Ответ №1:

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

 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)
 

Комментарии:

1. Привет! Спасибо за ответ, но, хотя сервер перестал показывать какие-либо сообщения, он по-прежнему отвечает ошибкой обработчика сообщений (код ошибки 400). Я подозреваю, что данные больше не могли попасть на сервер? Я не так много знаю серверную часть, поэтому я не уверен.

2. Вы также можете прочитать ссылку на документацию по обслуживанию TensorFlow, чтобы узнать, следует ли использовать: data = json.dumps({"signature_name": "predict", "instances":payload}) ИЛИ data = json.dumps({"signature_name": "predict", "inputs":payload})

3. Спасибо! Хм… Я понимаю, почему использование входных данных вместо экземпляров имеет смысл после прочтения документации. Но мне интересно, почему это не работает.

4. Только ответ 400. Сервер перестал показывать ошибки в журнале сервера.