Как настроить tfserving с моделью начала / мобильной сети для классификации изображений? - PullRequest
1 голос
/ 22 октября 2019

Я не могу найти нужную документацию для успешного обслуживания начальных моделей или моделей мобильных сетей и написать клиент grpc для подключения к серверу и выполнения классификации изображений.

До сих пор я успешно настроилСохранение изображения только на процессоре. Невозможно запустить его на моем графическом процессоре.

Но, когда я делаю запрос клиента grpc, запрос завершается с ошибкой.

grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
status = StatusCode.INVALID_ARGUMENT
details = "Expects arg[0] to be float but string is provided"
debug_error_string = "{"created":"@1571717090.210000000","description":"Error received from peer","file":"src/core/lib/surface/call.cc","file_line":1017,"grpc_message":"Expects arg[0] to be float but string is provided","grpc_status":3}"

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

Вот клиент grpc, который я использовал для запроса.

from __future__ import print_function

import grpc
import tensorflow as tf
import time

from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc

tf.app.flags.DEFINE_string('server', 'localhost:8505',
                       'PredictionService host:port')
tf.app.flags.DEFINE_string('image', 'E:/Data/Docker/tf_serving/cat.jpg', '‪path to image')
FLAGS = tf.app.flags.FLAGS


def main(_):
    channel = grpc.insecure_channel(FLAGS.server)
    stub = prediction_service_pb2_grpc.PredictionServiceStub(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 = ''
        request.inputs['image'].CopyFrom(tf.contrib.util.make_tensor_proto(data, shape=[1]))
        result = stub.Predict(request, 5.0)  # 10 secs timeout
        print(result)
    print("Inception Client Passed")


if __name__ == '__main__':
    tf.app.run()

1 Ответ

1 голос
/ 22 октября 2019

Как я понял, в вашем вопросе есть 2 вопроса.

A) Запуск tfserving на графическом процессоре.

B) Создание успешного запроса клиента grpc.

Давайтезапуск по одному.


Запуск tfserving на графическом процессоре

Это простой двухэтапный процесс.

  1. Извлечение последнего изображения со страницы официального докера .

    docker pull tensorflow/serving:latest-gpu
    

Обратите внимание на ярлык latest-gpu в запросе на извлечение выше при его извлеченииизображение предназначено для графического процессора.

Запуск док-контейнера.

sudo docker run -p 8502:8500 --mount type=bind,source=/my_model_dir,target=/models/inception --name tfserve_gpu -e MODEL_NAME=inception --gpus device=3 -t tensorflow/serving:latest-gpu

Обратите внимание, я передал аргумент --gpus device=3 для выбора третьего устройства графического процессора. Измените его соответствующим образом, чтобы выбрать другое устройство с графическим процессором.

Убедитесь, что контейнер был запущен командой docker ps.

Также проверьте, был ли выделен gpu дляДокер tfserving по команде nvidia-smi.

Вывод nvidia-smi

Output of nvidia-smi command

Но здесь, похоже,маленькая проблемаДокер tfserving использовал всю память устройства GPU.

Чтобы ограничить использование памяти GPU, используйте флаг per_process_gpu_memory_fraction.

sudo docker run -p 8502:8500 --mount type=bind,source=/my_model_dir,target=/models/inception --name tfserve_gpu -e MODEL_NAME=inception --gpus device=3 -t tensorflow/serving:latest-gpu  --per_process_gpu_memory_fraction=0.02

Вывод nvidia-smi

Output of nvidia-smi command

Теперь мы успешно настроили док-станцию ​​tfserving на устройстве с графическим процессором с разумным использованием памяти графического процессора. Давайте перейдем ко второй проблеме.


Создание запроса клиента GRPC

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

Вот код для выполнения запроса клиента grpc.

from __future__ import print_function

import argparse
import time
import numpy as np
from cv2 import imread

import grpc
from tensorflow.contrib.util import make_tensor_proto
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc
import tensorflow as tf


def read_tensor_from_image_file(file_name,
                                input_height=299,
                                input_width=299,
                                input_mean=0,
                                input_std=255):
    input_name = "file_reader"
    output_name = "normalized"
    file_reader = tf.io.read_file(file_name, input_name)
    if file_name.endswith(".png"):
        image_reader = tf.image.decode_png(
            file_reader, channels=3, name="png_reader")
    elif file_name.endswith(".gif"):
        image_reader = tf.squeeze(
            tf.image.decode_gif(file_reader, name="gif_reader"))
    elif file_name.endswith(".bmp"):
        image_reader = tf.image.decode_bmp(file_reader, name="bmp_reader")
    else:
        image_reader = tf.image.decode_jpeg(
            file_reader, channels=3, name="jpeg_reader")
    float_caster = tf.cast(image_reader, tf.float32)
    dims_expander = tf.expand_dims(float_caster, 0)

    resized = tf.compat.v1.image.resize_bilinear(dims_expander, [input_height, input_width])
    normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std])

    sess = tf.Session(config=tf.ConfigProto(gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.01)))
    result = sess.run(normalized)

    return result


def run(host, port, image, model, signature_name):

    # Preparing tensor from the image
    tensor = read_tensor_from_image_file(file_name='images/bird.jpg', input_height=224, input_width=224, input_mean=128, input_std=128)

    # Preparing the channel
    channel = grpc.insecure_channel('{host}:{port}'.format(host=host, port=port))
    stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)

    # Preparing grpc request
    request = predict_pb2.PredictRequest()
    request.model_spec.name = model
    request.model_spec.signature_name = signature_name
    request.inputs['image'].CopyFrom(make_tensor_proto(tensor, shape=[1, 224, 224, 3]))

    # Making predict request
    result = stub.Predict(request, 10.0)

    # Analysing result to get the prediction output.
    predictions = result.outputs['prediction'].float_val

    print("Predictions : ", predictions)


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--host', help='Tensorflow server host name', default='localhost', type=str)
    parser.add_argument('--port', help='Tensorflow server port number', default=8502, type=int)
    parser.add_argument('--image', help='input image', default='bird.jpg', type=str)
    parser.add_argument('--model', help='model name', default='inception', type=str)
    parser.add_argument('--signature_name', help='Signature name of saved TF model',
                        default='serving_default', type=str)

    args = parser.parse_args()
    run(args.host, args.port, args.image, args.model, args.signature_name)

Я не очень уверен, является ли это лучшим способом сделать запрос клиента tfserving grpc (, так как на стороне клиента требуется библиотека тензорного потока для подготовки тензора ), но у меня это работает.

Предложения приветствуются, если таковые имеются.

...