Как сделать пакетную обработку в Tensorflow Serving?

Развернул Tensorflow Serving и провел тест для Inception-V3. Работает отлично.

Теперь хотелось бы выполнить пакетную обработку для Inception-V3. Например. хотел бы отправить 10 изображений для прогнозирования вместо одного.

Как это сделать? Какие файлы обновить (inception_saved_model.py или inception_client.py)? Как выглядят эти обновления? и как изображения передаются на обслуживание - это передается как папка с изображениями или как?

Цените некоторое понимание этого вопроса. Любой фрагмент кода, связанный с этим, будет чрезвычайно полезен.

=================================

Обновлен файл inception_client.py.

# Copyright 2016 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================

#!/usr/bin/env python2.7

"""Send JPEG image to tensorflow_model_server loaded with inception model.
"""

from __future__ import print_function

"""Send JPEG image to tensorflow_model_server loaded with inception model.
"""

from __future__ import print_function

# This is a placeholder for a Google-internal import.

from grpc.beta import implementations
import tensorflow as tf
from tensorflow.python.platform import flags
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2


tf.app.flags.DEFINE_string('server', 'localhost:9000',
                            'PredictionService host:port')
tf.app.flags.DEFINE_string('image', '', 'path to image in JPEG format')
FLAGS = tf.app.flags.FLAGS


def main(_):
   host, port = FLAGS.server.split(':')
   channel = implementations.insecure_channel(host, int(port))
   stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)
   # Send request
   #with open(FLAGS.image, 'rb') as f:
     # See prediction_service.proto for gRPC request/response details.
     #data = f.read()
     #request = predict_pb2.PredictRequest()
     #request.model_spec.name = 'inception'
     #request.model_spec.signature_name = 'predict_images'


 #    request.inputs['images'].CopyFrom(
 #        tf.contrib.util.make_tensor_proto(data, shape=[1]))
 #    result = stub.Predict(request, 10.0)  # 10 secs timeout
 #    print(result)


# Build a batch of images

    request = predict_pb2.PredictRequest()
 request.model_spec.name = 'inception'
 request.model_spec.signature_name = 'predict_images'
  
  image_data = []
  for image in FLAGS.image.split(','):
   with open(image, 'rb') as f:
     image_data.append(f.read())
  
  request.inputs['images'].CopyFrom(
      tf.contrib.util.make_tensor_proto(image_data, shape=[len(image_data)]))
  
  result = stub.Predict(request, 10.0)  # 10 secs timeout
  print(result)
 if __name__ == '__main__':
   tf.app.run()

person tech_a_break    schedule 28.02.2017    source источник
comment
Можете ли вы проверить отступ в коде, который вы вставили? (Возможно, это проблема с форматированием Stack Overflow, но это может скрывать ошибку.) И какую текущую ошибку вы получаете?   -  person mrry    schedule 02.03.2017
comment
Похоже на проблему с форматом переполнения стека. Постараюсь это исправить. Вот ошибка.bazel-bin/tensorflow_serving/example/inception_batch_client --server=localhost:9000 --image=/home/gpuadmin/serving/images/boat.jpg,/home/gpuadmin/serving/images/boat.jpg Traceback (последний последний вызов): Файл /home/gpuadmin/serving/bazel-bin/tensorflow_serving/example/inception_batch_client.runfiles/tf_serving/tensorflow_serving/example/inception_batch_client.py, строка 63, в ‹module› с open(image, ' rb') как f: IOError: [Errno 2] Нет такого файла или каталога: ''   -  person tech_a_break    schedule 02.03.2017
comment
Ошибка возникает, потому что вы пытаетесь прочитать файл, который не найден. Кажется, он пытается открыть '' (пустую строку), поэтому, возможно, FLAGS.image имеет неправильный формат? Может, попробовать распечатать FLAGS.image.split(','), чтобы понять, что не так?   -  person mrry    schedule 02.03.2017
comment
Спасибо @mrry за вашу помощь и подсказки. Заработало..   -  person tech_a_break    schedule 04.03.2017
comment
@mrry Есть дополнительный вопрос. Как настроить производительность пакетной обработки с помощью max_batch_size, batch_timeout_micros, num_batch_threads и других параметров? Пробовал использовать эти параметры с клиентом Query, не работает.   -  person tech_a_break    schedule 07.03.2017
comment
Я не знаю. Возможно, стоит задать еще один вопрос по тегу [tensorflow-serving], и кто-то из команды TF Serving, вероятно, знает хороший ответ на этот вопрос.   -  person mrry    schedule 07.03.2017
comment
Хорошо. Спасибо.   -  person tech_a_break    schedule 07.03.2017


Ответы (1)


Вы должны иметь возможность вычислять прогнозы для пакета изображений с небольшим изменением кода построения запроса в inception_client.py. Следующие строки в этом файле создают запрос с «пакетом», содержащим одно изображение (обратите внимание на shape=[1], что означает «вектор длины 1»):

with open(FLAGS.image, 'rb') as f:
  # See prediction_service.proto for gRPC request/response details.
  data = f.read()
  request = predict_pb2.PredictRequest()
  request.model_spec.name = 'inception'
  request.model_spec.signature_name = 'predict_images'
  request.inputs['images'].CopyFrom(
      tf.contrib.util.make_tensor_proto(data, shape=[1]))
  result = stub.Predict(request, 10.0)  # 10 secs timeout
  print(result)

Вы можете передавать больше изображений в один и тот же вектор, чтобы выполнять прогнозы для пакета данных. Например, если бы FLAGS.image был списком имен файлов, разделенных запятыми:

request = predict_pb2.PredictRequest()
request.model_spec.name = 'inception'
request.model_spec.signature_name = 'predict_images'

# Build a batch of images.
image_data = []
for image in FLAGS.image.split(','):
  with open(image, 'rb') as f:
    image_data.append(f.read())

request.inputs['images'].CopyFrom(
    tf.contrib.util.make_tensor_proto(image_data, shape=[len(image_data)]))

result = stub.Predict(request, 10.0)  # 10 secs timeout
print(result)

 if __name__ == '__main__':
   tf.app.run()
person mrry    schedule 28.02.2017
comment
Спасибо @mmry. После внесения изменений снова создал сборку для клиента. При запросе вывода получена ошибка для request.inputs['images'].CopyFrom(NameError: имя 'запрос' не определено. - person tech_a_break; 01.03.2017
comment
Передача 2 изображений для вывода с использованием bazel-bin/tensorflow_serving/example/inception_batch_client --server=localhost:9000 --image=/home/gpuadmin/serving/images/boat.jpg,/home/gpuadmin/serving/images/table. jpg Трассировка (последний последний вызов): Файл /home/useradmin/serving/bazel-bin/tensorflow_serving/example/inception_batch_client.runfiles/tf_serving/tensorflow_serving/example/inception_batch_client.py, строка 55, в ‹module› request.inputs[ 'images'].CopyFrom( NameError: имя 'запрос' не определено - person tech_a_break; 01.03.2017
comment
Может опечатка в коде? Имя request должно быть определено строкой request = predict_pb2.PredictRequest(). - person mrry; 01.03.2017
comment
Спасибо @mmry. Включенный запрос = ... в предложении with. Столкнулся с подобными проблемами с заглушкой, каналом и хостом - не определяется. Хотя они в деф мейн. Является ли это проблемой масштабирования? попытался поместить их под image_data = [] и получил ошибку ниже - person tech_a_break; 01.03.2017
comment
Мне трудно представить, как выглядит ваш код из описания. Можете ли вы опубликовать свой текущий код как отредактировать вопрос вместе с полной трассировкой стека ошибки? - person mrry; 01.03.2017
comment
Трассировка (последний последний вызов): Файл /home/gpuadmin/serving/bazel-bin/tensorflow_serving/example/inception_batch_client.runfiles/tf_serving/tensorflow_serving/example/inception_batch_client.py, строка 62, в ‹module› результат = stub.Predict (запрос, 10.0) # 10-секундный тайм-аут Файл /usr/local/lib/python2.7/dist-packages/grpc/beta/_client_adaptations.py, строка 323, в вызове self._request_serializer, self ._response_deserializer) - person tech_a_break; 01.03.2017
comment
Файл /usr/local/lib/python2.7/dist-packages/grpc/beta/_client_adaptations.py, строка 209, в _blocking_unary_unary поднять _abortion_error(rpc_error_call) grpc.framework.interfaces.face.face.AbortionError: AbortionError(code= StatusCode.INVALID_ARGUMENT, details=Missing ModelSpec") - person tech_a_break; 01.03.2017
comment
Вы устанавливаете request.model_spec, как я в ответе? Опять же, я не могу предложить исправление, не видя вашего кода. - person mrry; 01.03.2017
comment
Код прикреплен к вопросу. - person tech_a_break; 02.03.2017
comment
эй, у меня это не работает... У меня вопрос, нужно ли мне изменить способ запуска tensorflow_model_server? Я заметил параметр --enable_batching, но не уверен :/ - person Rodrigo Laguna; 19.09.2018