背景:
在GCP上运行的视觉应用程序中,我们正在使用TF Serving。这个应用程序是使用Go语言编写的,它将图片转换为张量并使用gRPC将其发送到TF Serving。
问题:
Golang中的预处理逻辑不如Python中的Keras图像库效果好(推理的准确性受到影响)。部分原因可能是在训练期间使用了Python库。
我们尝试了:
Tensorflow Serving提供了一种引入预处理器的方式,可以在服务容器上运行。但其功能有限(无法与模型一起打包Keras库)。我们尝试了以下两个选项:
有效的方法是在客户端使用Keras预处理(Python)如下所示。
img = tf.keras.preprocessing.image.load_img(file_name, target_size=(HEIGHT, WIDTH))
img_array = tf.keras.preprocessing.image.img_to_array(img)
... 调用 TensorflowServing 的 grpc ...
我们的目标是按照这篇博客文章中所描述的,在 TFServing 空间中使用“serving_input_receiver_fn”预处理图像:https://medium.com/devseed/technical-walkthrough-packaging-ml-models-for-inference-with-tf-serving-2a50f73ce6f8
但是作为“serving_input_receiver_fn”执行的以下代码并不能产生正确的推断结果。
image = tf.image.decode_image(image_str_tensor, channels=CHANNELS dtype=tf.uint8)
image = tf.reshape(image, [HEIGHT, WIDTH, CHANNELS])
我们的目标是在“serving_input_receiver_fn”内部运行以下Keras代码(类似方式),假设我们可以从“grpc”流中加载图像。
img = tf.keras.preprocessing.image.load_img(file_name, target_size=(HEIGHT, WIDTH))
img_array = tf.keras.preprocessing.image.img_to_array(img)
有可能吗?这是一次大规模的部署(70个GPU和2300个CPU),因此每一点性能都很重要。在我们的情况下,TF-Serving机器上的图像预处理是最优的。