【Python深度学习系列】使用Docker和TensorFlow Serving 部署TensorFlow模型(案例+源码)

这是我的第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、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据杂坛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值