这是我的第414篇原创文章。
一、引言
本项目旨在引导你完成创建一个简单的 TensorFlow 模型、导出模型并使用 Docker 和 TensorFlow Serving 进行服务的过程。TensorFlow 是一个开源的机器学习框架,而 TensorFlow Serving 是一个灵活且高性能的机器学习模型服务系统。Docker 容器使得打包和部署这些模型变得简单且一致。通过完成本项目,你将了解如何在 TensorFlow 中设置一个基本的机器学习模型,将其导出以供服务,并在 Docker 容器中使用 TensorFlow Serving 进行部署。完成本项目后,你将能够:
-
在 TensorFlow 中设置一个基本的机器学习模型
-
导出 TensorFlow 模型以供服务
-
使用 Docker 和 TensorFlow Serving 部署 TensorFlow 模型
-
向部署的模型发送预测请求并观察结果
二、实现过程
2.1 安装依赖
在开始之前,你需要在环境中安装 TensorFlow。此外,你还需要从 Docker Hub 拉取 TensorFlow Serving 镜像,以便在容器化环境中为模型提供服务。请在终端中执行以下命令。
## 安装 TensorFlow
pip install tensorflow==2.14.0
## 将 numpy 降级到 1.26.4 以避免与 TensorFlow 的兼容性问题
pip install numpy==1.26.4
拉取 TensorFlow Serving Docker 镜像:
## 从 Docker Hub 拉取 TensorFlow Serving 镜像
docker pull tensorflow/serving
TensorFlow Serving 是专门为在生产环境中服务机器学习模型而设计的。使用 Docker 可以确保 TensorFlow Serving 在一个隔离的环境中运行,并且所有依赖项都已满足,从而避免与机器上其他软件的冲突。
2.2 创建并导出模型
在这一步中,你将定义一个简单的 TensorFlow 模型,该模型执行一个基本的算术操作:将输入乘以 0.5 然后加上 2。定义模型后,你会将其导出为 TensorFlow Serving 可以使用的格式。在 ~/project/half_plus_two.py
中创建并导出模型:
## 导入 TensorFlow
import tensorflow as tf
## 定义一个简单的 Sequential 模型
model = tf.keras.Sequential([
tf.keras.layers.Dense(units=1, input_shape=[1], use_bias=True)
])
## 设置权重以实现“乘以 0.5 并加上 2”的功能
weights = [tf.constant([[0.5]]), tf.constant([2.0])]
model.set_weights(weights)
## 编译模型(即使不训练也需要)
model.compile(optimizer='sgd', loss='mean_squared_error')
## 将模型导出为 SavedModel
# export_path = './saved_model_half_plus_two/1'
# tf.saved_model.save(model, export_path)
model.export('./saved_model_half_plus_two/1')
这一步涉及定义一个 TensorFlow 模型,该模型对其输入执行一个简单的操作:乘以 0.5 并加上 2。然后,模型被导出为适合服务的格式。
-
该模型使用 TensorFlow 的 Keras API 定义,Keras 是一个用于构建和训练深度学习模型的高级 API。模型由一个全连接神经网络层(Dense 层)组成。
-
模型的权重被手动设置为实现所需操作(乘以 0.5 并加上 2)。
-
尽管此模型不会进一步训练,但仍需编译以完成其结构,这是 TensorFlow 中的一个必要步骤。
-
最后,模型以 TensorFlow SavedModel 格式保存,该格式是一个包含 protobuf 文件和 TensorFlow 检查点(包含模型权重)的目录。TensorFlow Serving 需要此格式来部署模型。
要导出模型,请在终端中运行脚本:
python half_plus_two.py
模型保存在 ~/project/saved_model_half_plus_two目录中。文件结构如下:
2.3 使用 Docker 和 TensorFlow Serving 服务模型
导出模型后,下一步是在 Docker 容器中使用 TensorFlow Serving 来服务模型。这使得你的模型可以通过网络访问,并能够响应预测请求。
在终端中使用 Docker 服务模型:
## 在 Docker 容器中使用 TensorFlow Serving 服务模型
docker run -t --rm -p 9500:8500 -p 9501:8501 -v "/home/wenqiang/project/saved_model_half_plus_two:/models/half_plus_two" -e MODEL_NAME=half_plus_two tensorflow/serving
在这一步中,导出的模型在 Docker 容器中使用 TensorFlow Serving 进行服务。Docker run 命令启动了一个 TensorFlow Serving 实例,并使模型可用于推理请求。
-p
标志将 Docker 容器的端口映射到你的主机,允许你从本地机器向 TensorFlow Serving 模型服务器发送请求。
-v
标志将主机上的卷挂载到 Docker 容器中,使导出的模型对 TensorFlow Serving 可用。
-e MODEL_NAME
环境变量告诉 TensorFlow Serving 要服务的模型名称。
这种设置封装了模型服务环境,确保无论部署在哪里,它都能一致地运行。
2.4 向模型发送预测请求
最后,你将通过发送预测请求来测试部署的模型。该请求将要求模型对其输入值应用其逻辑(乘以 0.5 并加上 2)。在另一个新终端中发送预测请求:
## 向 TensorFlow Serving 容器发送预测请求
curl -X POST http://localhost:9501/v1/models/half_plus_two:predict -d '{"signature_name":"serving_default","instances":[[1.0], [2.0], [5.0]]}'
输出:
这最后一步涉及通过发送 HTTP POST 请求来测试部署的模型。该请求包含一个 JSON 负载,其中包含需要预测的实例。
curl
命令用于向 TensorFlow Serving 服务器发送 POST 请求。URL 指定了模型和预测 API 端点。
-d
标志以 JSON 格式提供预测请求的数据。
signature_name
键指定要使用的服务签名,这是一种告诉 TensorFlow Serving 执行哪个计算图的方式。instances
键包含预测的输入数据。
服务器的响应包括模型对提供的输入实例所做的预测,表明模型已成功部署并正在提供预测。
作者简介:
读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。