Как я понял, в вашем вопросе есть 2 вопроса.
A) Запуск tfserving на графическом процессоре.
B) Создание успешного запроса клиента grpc.
Давайтезапуск по одному.
Запуск tfserving на графическом процессоре
Это простой двухэтапный процесс.
Извлечение последнего изображения со страницы официального докера .
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](https://i.stack.imgur.com/SV9Cr.png)
Но здесь, похоже,маленькая проблемаДокер 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](https://i.stack.imgur.com/IeZpc.png)
Теперь мы успешно настроили док-станцию 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 (, так как на стороне клиента требуется библиотека тензорного потока для подготовки тензора ), но у меня это работает.
Предложения приветствуются, если таковые имеются.