《Keras 3 :使用 TFServing 提供 TensorFlow 模型》
《Keras 3 :使用 TFServing 提供 TensorFlow 模型》
作者:Dimitre Oliveira
创建日期:2023/01/02
最后修改时间:2023/01/02
描述:如何使用 TensorFlow Serving 为 TensorFlow 模型提供服务。
在 Colab 中查看
GitHub 源
介绍
构建机器学习模型后,下一步就是为其提供服务。 您可能希望通过将模型公开为终端节点服务来实现此目的。 您可以使用许多框架来实现此目的,但 TensorFlow 生态系统有自己的解决方案,称为 TensorFlow Serving。
来自 TensorFlow Serving GitHub 页面:
TensorFlow Serving 是一种灵活的高性能机器服务系统 专为生产环境设计的学习模型。它处理 机器学习的推理方面,在训练后获取模型和 管理其生命周期,通过 高性能、引用计数的查找表。TensorFlow Serving 提供 与 TensorFlow 模型开箱即用,但可以轻松扩展 来提供其他类型的模型和数据。
请注意一些功能:
- 它可以服务于多个模型,也可以服务于同一模型的多个版本 同时
- 它公开了 gRPC 和 HTTP 推理终端节点
- 它允许在不更改任何客户端代码的情况下部署新的模型版本
- 它支持金丝雀新版本和 A/B 测试实验模型
- 由于高效、低开销,它为推理时间增加了最小的延迟 实现
- 它具有一个计划程序,可将单个推理请求分组为 batch 用于在 GPU 上联合执行,具有可配置的延迟控制
- 它支持许多可维护对象:Tensorflow 模型、嵌入向量、词汇表、 特征转换,甚至非基于 Tensorflow 的机器学习模型
本指南使用 Keras 应用程序 API 创建一个简单的 MobileNet 模型。 然后使用 TensorFlow Serving 提供它。 重点是 TensorFlow Serving,而不是 TensorFlow 的 TensorFlow 中。
注意:您可以在此链接中找到包含完整工作代码的 Colab 笔记本。
依赖
import osos.environ["KERAS_BACKEND"] = "tensorflow"import json
import shutil
import requests
import numpy as np
import tensorflow as tf
import keras
import matplotlib.pyplot as plt
型
在这里,我们从 Keras 应用程序加载一个预先训练的 MobileNet,这是 模型。
model = keras.applications.MobileNet()
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/mobilenet/mobilenet_1_0_224_tf.h5 17225924/17225924 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
预处理
大多数模型不能在原始数据上开箱即用,它们通常需要一些 类型的预处理步骤来根据模型要求调整数据, 在这个 MobileNet 的情况下,我们可以从它的 API 页面看到它需要 其输入图像的三个基本步骤:
- 标准化为范围的像素值
[0, 1]
- 缩放到范围的像素值
[-1, 1]
- 具有意义形状的图像
(224, 224, 3)
(height, width, channels)
我们可以使用以下函数来完成所有这些作:
def preprocess(image, mean=0.5, std=0.5, shape=(224, 224)):"""Scale, normalize and resizes images."""image = image / 255.0 # Scaleimage = (image - mean) / std # Normalizeimage = tf.image.resize(image, shape) # Resizereturn image
关于使用 “keras.applications” API 进行预处理和后处理的说明
Keras 应用程序 API 中提供的所有模型还提供 and 函数,这些 函数分别负责预处理和后处理 ,并且已经包含了这些步骤所需的所有 logic。 这是在使用 Keras 时处理输入和输出的推荐方法 应用程序模型。 在本指南中,我们不使用它们来介绍自定义的优势 签名。preprocess_input
decode_predictions
后处理
在相同的上下文中,大多数模型输出需要额外处理的值 满足用户需求,例如用户不想知道 对于给定图像的每个类的 logits 值,用户想要知道的是 它属于哪个类。对于我们的模型,这转换为以下内容 Transformations 的 Outputs:
- 获取具有最高预测值的类的索引
- 从该索引获取类的名称
# Download human-readable labels for ImageNet.
imagenet_labels_url = ("https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt"
)
response = requests.get(imagenet_labels_url)
# Skipping background class
labels = [x for x in response.text.split("\n") if x != ""][1:]
# Convert the labels to the TensorFlow data format
tf_labels = tf.constant(labels, dtype=tf.string)def postprocess(prediction, labels=tf_labels):"""Convert from probs to labels."""indices = tf.argmax(prediction, axis