部署一个简单的 TensorFlow 模型

DockerDockerIntermediate
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

本项目旨在引导你完成创建一个简单的 TensorFlow 模型、导出模型并使用 Docker 和 TensorFlow Serving 进行服务的过程。TensorFlow 是一个开源的机器学习框架,而 TensorFlow Serving 是一个灵活且高性能的机器学习模型服务系统。Docker 容器使得打包和部署这些模型变得简单且一致。通过完成本项目,你将了解如何在 TensorFlow 中设置一个基本的机器学习模型,将其导出以供服务,并在 Docker 容器中使用 TensorFlow Serving 进行部署。

👀 预览

## 向 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]]}'

输出:

{
  "predictions": [[2.5], [3.0], [4.5]
  ]
}

🎯 任务

在本项目中,你将学习:

  • 如何安装 TensorFlow 和 TensorFlow Serving 的依赖项
  • 如何创建一个简单的 TensorFlow 模型用于基本算术运算
  • 如何以适合 TensorFlow Serving 的格式导出模型
  • 如何使用 Docker 和 TensorFlow Serving 服务模型
  • 如何向部署的模型发送预测请求并接收预测结果

🏆 成就

完成本项目后,你将能够:

  • 在 TensorFlow 中设置一个基本的机器学习模型
  • 导出 TensorFlow 模型以供服务
  • 使用 Docker 和 TensorFlow Serving 部署 TensorFlow 模型
  • 向部署的模型发送预测请求并观察结果
这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 中级 级别的实验,完成率为 80%。获得了学习者 78% 的好评率。

安装依赖

在开始之前,你需要在环境中安装 TensorFlow。此外,你还需要从 Docker Hub 拉取 TensorFlow Serving 镜像,以便在容器化环境中为模型提供服务。请在终端中执行以下命令。

安装 TensorFlow:

## 安装 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,这是一个用于数值计算和机器学习的强大库,然后拉取了 TensorFlow Serving 的 Docker 镜像。

TensorFlow Serving 是专门为在生产环境中服务机器学习模型而设计的。使用 Docker 可以确保 TensorFlow Serving 在一个隔离的环境中运行,并且所有依赖项都已满足,从而避免与机器上其他软件的冲突。

创建并导出模型

在这一步中,你将定义一个简单的 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)

这一步涉及定义一个 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 目录中,文件结构如下:

.
└── saved_model_half_plus_two
└── 1
├── assets
├── fingerprint.pb
├── saved_model.pb
└── variables
├── variables.data-00000-of-00001
└── variables.index
✨ 查看解决方案并练习

使用 Docker 和 TensorFlow Serving 服务模型

导出模型后,下一步是在 Docker 容器中使用 TensorFlow Serving 来服务模型。这使得你的模型可以通过网络访问,并能够响应预测请求。

在终端中使用 Docker 服务模型:

## 在 Docker 容器中使用 TensorFlow Serving 服务模型
docker run -t --rm -p 9500:8500 -p 9501:8501 \
  -v "/home/labex/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 要服务的模型名称。

这种设置封装了模型服务环境,确保无论部署在哪里,它都能一致地运行。

向模型发送预测请求

最后,你将通过发送预测请求来测试部署的模型。该请求将要求模型对其输入值应用其逻辑(乘以 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]]}'

输出:

{
  "predictions": [[2.5], [3.0], [4.5]
  ]
}

这最后一步涉及通过发送 HTTP POST 请求来测试部署的模型。该请求包含一个 JSON 负载,其中包含需要预测的实例。

  • curl 命令用于向 TensorFlow Serving 服务器发送 POST 请求。URL 指定了模型和预测 API 端点。
  • -d 标志以 JSON 格式提供预测请求的数据。signature_name 键指定要使用的服务签名,这是一种告诉 TensorFlow Serving 执行哪个计算图的方式。instances 键包含预测的输入数据。

服务器的响应包括模型对提供的输入实例所做的预测,表明模型已成功部署并正在提供预测。

总结

在本项目中,你学习了如何创建一个简单的 TensorFlow 模型,将其导出以供服务,并使用 TensorFlow Serving 和 Docker 进行部署。你从安装必要的依赖项开始,然后定义并导出了一个基本模型。接着,你在 Docker 容器中使用 TensorFlow Serving 服务模型,并通过发送预测请求来测试它。这种工作流是部署机器学习模型以实现可扩展性和可重复性的基本技能。