#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
Справочная информация
- Используя 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
- Модель работает правильно без ошибок перед размещением, потому что я смог обучить модель, используя уже существующие данные.
- Ошибка, по-видимому, соответствует измерению состояния. Когда я изменяю размерность данных для передачи в состояние с 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
- Сервер работает правильно, как я получаю
{
"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
, где размещается модель.
- Я запрашиваю модель с использованием 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. Сервер перестал показывать ошибки в журнале сервера.