一、介绍
TensorFlow Serving 是一个灵活的高性能服务系统,用于专为生产环境设计的机器学习模型。本指南展示了如何使用 Docker 训练一个简单的模型并通过 TensorFlow 服务来提供该模型。它还演示了如何同时为多个模型提供服务。
二、准备工作
- Python 的工作知识。
- 正确安装和配置了 Python 工具链,包括 pip。
三、部署 Docker 实例
使用Vultr 一键式Docker 部署您的 Docker 实例。本指南使用 Ubuntu 版本。
部署完成后,通过SSH登录服务器
更新计算机并重新启动计算机以应用更新
# apt-get update && apt-get dist-upgrade -y
# reboot
建议在处理 Python 项目时使用虚拟环境。安装软件包以使用 Pythonvenv模块或使用您喜欢的任何其他方法。
在 Ubuntu 20.04 上:
# apt-get install python3.8-venv
在 Ubuntu 22.04 上:
# apt-get install python-3.10-venv
重新启动后,切换到 docker 用户并下载 TensorFlow Serving 镜像。
# su -l docker -s /usr/bin/bash
$ docker pull tensorflow/serving
四、创建示例模型
使用 Fashion-MNIST 数据集训练模型,该数据集
由 60K 训练示例和 10K 测试示例组成,包含 10 个不同的类,其中每个样本是一件衣服的 28×28 像素灰度图像。
本指南不详细介绍模型训练或进行任何参数调优。重点是 TensorFlow Serving,而不是模型训练。
设置虚拟环境并安装必要的 Python 包。
$ python3 -m venv tfserving-venv
$ . tfserving-venv/bin/activate
$ pip install tensorflow requests
使用以下代码创建一个文件,用于加载和准备数据。model.py
import tensorflow as tf
from tensorflow import keras
# load data
fashion_mnist = keras.datasets.fashion_mnist
(train_data, train_labels), (test_data, test_labels) = fashion_mnist.load_data()
class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat",
"Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]
# scale data values to [0,1] interval
train_data = train_data / 255.0
test_data = test_data / 255.0
# reshape data to represent 28x28 pixels grayscale images
train_data = train_data.reshape(train_data.shape[0], 28, 28, 1)
test_data = test_data.reshape(test_data.shape[0], 28, 28, 1)
构建具有单个卷积层(8 个大小为 3×3 的过滤器)和一个具有 10 个单元的输出层的 CNN。
model = keras.Sequential([
keras.layers.Conv2D(input_shape=(28,28,1), filters=8, kernel_size=3,
strides=2, activation="relu", name="Conv1"),
keras.layers.Flatten(),
keras.layers.Dense(10, name="Dense")
])
训练模型。
epochs = 3
model.compile(optimizer="adam",
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[keras.metrics.SparseCategoricalAccuracy()])
model.fit(train_data, train_labels, epochs=epochs)
保存模型。
import os
MODEL_DIR = "/home/docker/tfserving-fashion"
VERSION = "1"
export_path = os.path.join(MODEL_DIR, VERSION)
tf.keras.models.save_model(
model,
export_path,
overwrite=True,
include_optimizer=True,
save_format=None,
signatures=None,
options=None
)
运行代码。model.py
$ python model.py
...
Epoch 1/3
1875/1875 [==============================] - 5s 3ms/step - loss: 0.5629 - sparse_categorical_accuracy: 0.8033
Epoch 2/3
1875/1875 [==============================] - 5s 3ms/step - loss: 0.4119 - sparse_categorical_accuracy: 0.8566
Epoch 3/3
1875/1875 [==============================] - 5s 3ms/step - loss: 0.3708 - sparse_categorical_accuracy: 0.8696
您可以使用该命令可视化模型信息。saved_model_cli
$ saved_model_cli show --dir ~/tfserving-fashion/1 --all
五、启动服务器
使用 Docker 启动服务器。
$ docker run -t --rm -p 8501:8501 \
-v "/home/docker/tfserving-fashion:/models/fashion" \
-e MODEL_NAME=fashion \
tensorflow/serving &
六、如何进行查询
使用以下代码创建一个文件,该文件加载数据、设置查询标头并将查询数据定义为测试数据集中的第一个示例。query.py
import json
import requests
import numpy as np
from tensorflow import keras
fashion_mnist = keras.datasets.fashion_mnist
(train_data, train_labels), (test_data, test_labels) = fashion_mnist.load_data()
class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat",
"Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]
# scale data values to [0,1] interval
train_data = train_data / 255.0
test_data = test_data / 255.0
# reshape data to represent 28x28 pixels grayscale images
train_data = train_data.reshape(train_data.shape[0], 28, 28, 1)
test_data = test_data.reshape(test_data.shape[0], 28, 28, 1)
data = json.dumps({"instances": test_data[0:1].tolist()})
headers = {"content-type": "application/json"}
进行查询并获取响应。请记住将地址更改为服务器 IP 或 FQDN。
json_response = requests.post("http://<<SERVER IP/FQDN>>:8501/v1/models/fashion:predict",
data=data, headers=headers)
predictions = json.loads(json_response.text)["predictions"]
变量包含一个列表,其中包含属于 10 个类中每个类的对象查询的概率。这些值中最大的是模型进行的分类。该函数从变量返回模型分类。predictions
np.argmax
predictions
print("Real class:", class_names[test_labels[0]])
print("Predicted class:", class_names[np.argmax(predictions[0])])
运行,您应该会看到此查询的结果。query.py
$ python3 query.py
...
Real class: Ankle boot
Predicted class: Ankle boot
您还可以在每个请求中查询多个示例。例如,将变量更改为测试数据中的前五个样本和输出,以显示五个查询中每个查询的分类。data
query.py
data = json.dumps({"instances": test_data[0:5].tolist()})
...
for i in range(len(predictions)):
print("Query", str(i))
print("Real class:", class_names[test_labels[i]])
print("Predicted class:", class_names[np.argmax(predictions[i])])
Runningagain 给出了包含五个示例的查询结果。query.py
$ python3 query.py
...
Query 0
Real class: Ankle boot
Predicted class: Ankle boot
Query 1
Real class: Pullover
Predicted class: Pullover
Query 2
Real class: Trouser
Predicted class: Trouser
Query 3
Real class: Trouser
Predicted class: Trouser
Query 4
Real class: Shirt
Predicted class: Shirt
七、服务多个模型
TensorFlow Serving 还能够同时为多个模型提供服务。这一次,使用TensorFlow Serve GitHub存储库中提供的一些预训练模型。
如果尚未安装 Git,请安装 Git。
# apt-get install git
并克隆存储库。
$ git clone https://github.com/tensorflow/serving
创建一个以以下内容命名的文件,该文件配置两个模型,定义名称、相对于运行服务器的 Docker 容器的目录以及每个模型的模型平台。models.config
model_config_list {
config {
name: 'half_plus_two'
base_path: '/models/saved_model_half_plus_two_cpu'
model_platform: 'tensorflow'
}
config {
name: 'half_plus_three'
base_path: '/models/saved_model_half_plus_three'
model_platform: 'tensorflow'
}
}
这些模型计算数字的一半,并分别加 2 和 3。
启动服务器加载此配置文件并使用预训练模型挂载卷。
$ docker run -t --rm -p 8501:8501 \
-v "/home/docker/serving/tensorflow_serving/servables/tensorflow/testdata/:/models/" \
-v "/home/docker/models.config:/tmp/models.config" \
tensorflow/serving \
--model_config_file=/tmp/models.config
您可以使用浏览器上的 HTTP GET 请求或使用 curl 查看每个模型状态信息。
$ curl http://<<SERVER IP/FQDN>>:8501/v1/models/half_plus_two
{
"model_version_status": [
{
"version": "123",
"state": "AVAILABLE",
"status": {
"error_code": "OK",
"error_message": ""
}
}
]
}
$ curl http://<<SERVER IP/FQDN>>:8501/v1/models/half_plus_three
{
"model_version_status": [
{
"version": "123",
"state": "AVAILABLE",
"status": {
"error_code": "OK",
"error_message": ""
}
}
]
}
并通过运行以下命令,使用 curl 使用 HTTP POST 请求请求对两个模型进行预测:
$ curl -d '{"instances": [1.0, 2.0, 3.0]}' \
-X POST http://<<SERVER IP/FQDN>>:8501/v1/models/half_plus_two:predict
{
"predictions": [2.5, 3.0, 3.5]
}
$ curl -d '{"instances": [1.0, 2.0, 3.0]}' \
-X POST http://<<SERVER IP/FQDN>>:8501/v1/models/half_plus_three:predict
{
"predictions": [3.5, 4.0, 4.5]
}
八、结论
本指南介绍了如何训练 TensorFlow 模型并部署 TensorFlow Serving 以与 Docker 同时提供此模型和许多模型。