Skip to content

Latest commit

 

History

History
205 lines (120 loc) · 11 KB

serving-tensorflow-models.md

File metadata and controls

205 lines (120 loc) · 11 KB

使用 TensorFlow Serving 部署训练好的模型到生产环境

原文:www.kdnuggets.com/2020/11/serving-tensorflow-models.html

评论图示

照片由 Kate Townsend 提供,来源于 Unsplash

一旦你训练了一个 TensorFlow 模型,并且它准备好部署,你可能会想将其移动到生产环境中。幸运的是,TensorFlow 提供了一种方法来以最小的努力完成这项工作。在本文中,我们将使用一个预训练模型,保存它,并使用 TensorFlow Serving 提供服务。让我们开始吧!

TensorFlow ModelServer

TensorFlow Serving 是一个专门用于将机器学习模型投入生产的系统。TensorFlow 的 ModelServer 提供对 RESTful API 的支持。不过,在使用之前,我们需要先安装它。首先,让我们将其添加为软件包源。

echo "deb [arch=amd64] [`storage.googleapis.com/tensorflow-serving-apt`](https://storage.googleapis.com/tensorflow-serving-apt) stable tensorflow-model-server tensorflow-model-server-universal" | sudo tee /etc/apt/sources.list.d/tensorflow-serving.list && curl [`storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg`](https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg) | sudo apt-key add -

现在可以通过更新系统并使用 apt-get 安装 TensorFlow ModelServer。

$ sudo apt-get update$ sudo apt-get install tensorflow-model-server

开发模型

接下来,让我们使用一个预训练模型来创建我们希望提供的模型。在这种情况下,我们将使用一个版本的 VGG16,其权重在 ImageNet 上进行了预训练。为了使其正常工作,我们必须先完成几个导入:

  • VGG16 架构

  • image 用于处理图像文件

  • preprocess_input 用于预处理图像输入

  • decode_predictions 用于显示概率和类别名称

from tensorflow.keras.applications.vgg16 import VGG16
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import preprocess_input, decode_predictions
import numpy as np

接下来,我们使用 ImageNet 权重定义模型。

model = VGG16(weights=imagenet’)

模型准备好后,我们可以尝试一个示例预测。我们首先定义图像文件(一个狮子)的路径,并使用 image 加载它。

img_path =lion.jpgimg = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

在预处理后,我们可以使用它进行预测。我们可以看到它能够以 99% 的准确率预测图像是狮子。

preds = model.predict(x)
# decode the results into a list of tuples (class, description, probability)
# (one such list for each sample in the batch)
print(‘Predicted:’, decode_predictions(preds, top=3)[0])# Predicted: [('n02129165', 'lion', 0.9999999), ('n02130308',
# 'cheetah', 7.703386e-08), ('n02128385', 'leopard', 6.330456e-09)]

现在我们有了模型,我们可以将其保存,以便为 TensorFlow 提供服务做好准备。

保存模型

现在让我们保存这个模型。请注意,我们将其保存到一个/1文件夹中以指示模型版本。这是关键的,特别是当你希望自动提供新的模型版本时。稍后会详细介绍。

model.save(‘vgg16/1’)

使用 TensorFlow ModelServer 运行服务器

让我们首先定义用于服务的配置:

  • name 是我们模型的名称——在这种情况下,我们将其命名为 vgg16

  • base_path 是我们保存模型的位置的绝对路径。请确保将其更改为您自己的路径。

  • model_platform 显然是 TensorFlow。

  • model_version_policy 使我们能够指定模型版本信息。

现在我们可以运行命令来从命令行提供模型:

  • rest_api_port=8000 意味着我们的 REST API 将在 8000 端口提供服务。

  • model_config_file 定义了我们之前定义的配置文件。

  • model_config_file_poll_wait_seconds 表示检查配置文件更改之前的等待时间。例如,将配置文件中的版本更改为 2 会自动服务模型的版本 2。这是因为在这种情况下配置文件的更改每 300 秒检查一次。

tensorflow_model_serverrest_api_port=8000model_config_file=models.configmodel_config_file_poll_wait_seconds=300

使用 REST API 进行预测

此时,我们的模型的 REST API 可以在这里找到: localhost:8000/v1/models/vgg16/versions/1:predict

我们可以使用这个端点进行预测。为此,我们需要将 JSON 格式的数据传递给端点。为了达到这一目的 — 并非双关 — 我们将使用 Python 中的 *json* 模块。为了向端点发出请求,我们将使用 requests Python 包。

让我们开始导入这两个模块。

import json
import requests

记住,x 变量包含了预处理的图像。我们将创建包含该图像的 JSON 数据。像其他 RESTFUL 请求一样,我们将内容类型设置为 application/json。然后,我们向端点发出请求,同时传递头信息和数据。获得预测结果后,我们将其解码,就像在本文开头一样。

Image for post

使用 Docker 服务模型

还有一种更快更简短的方式来服务 TensorFlow 模型——使用 Docker。这实际上是推荐的方法,但了解之前的方法很重要,以防你在特定用例中需要它。使用 Docker 服务模型就像拉取 TensorFlow Serving 镜像 并挂载你的模型一样简单。

使用 Docker 安装 后,运行此代码来拉取 TensorFlow Serving 镜像。

docker pull tensorflow/serving

现在让我们使用那个图像来服务模型。这可以通过 docker run 和传递一些参数来完成:

  • -p 8501:8501 表示容器的 8501 端口将在本地主机的 8501 端口上可访问。

  • — name 用于为我们的容器命名——选择你喜欢的名称。我在这个例子中选择了 tf_vgg_server

  • — mount type=bind,source=/media/derrick/5EAD61BA2C09C31B/Notebooks/Python/serving/saved_tf_model,target=/models/vgg16 表示模型将被挂载到 Docker 容器中的 /models/vgg16

  • -e MODEL_NAME=vgg16 表明 TensorFlow Serving 应该加载名为 vgg16 的模型。

  • -t tensorflow/serving 表示我们正在使用之前拉取的 tensorflow/serving 镜像。

  • & 表示在后台运行命令。

在你的终端中运行下面的代码。

docker run -p 8501:8501 --name tf_vgg_server --mount type=bind,source=/media/derrick/5EAD61BA2C09C31B/Notebooks/Python/serving/saved_tf_model,target=/models/vgg16  -e MODEL_NAME=vgg16 -t tensorflow/serving &

现在我们可以使用 REST API 端点进行预测,就像之前一样。

Image for post

很明显,我们得到了相同的结果。通过这一点,我们已经看到如何在有无 Docker 的情况下服务 TensorFlow 模型。

最后的想法

这篇文章来自 TensorFlow,将为你提供更多关于 TensorFlow Serving 架构的信息。如果你想深入了解,可以参考这个资源

你还可以探索使用标准的TensorFlow ModelServer来进行构建。在这篇文章中,我们专注于使用 CPU 进行服务,但你也可以探索如何在 GPU 上服务

这个仓库包含链接到更多关于 TensorFlow Serving 的教程。希望这篇文章对你有所帮助!

mwitiderrick/TensorFlow-Serving

提供 TensorFlow 模型服务。通过在 GitHub 上创建账户,参与 mwitiderrick/TensorFlow-Serving 的开发。

个人简介:Derrick Mwiti 是一名数据科学家,对分享知识充满热情。他通过 Heartbeat、Towards Data Science、Datacamp、Neptune AI、KDnuggets 等博客积极贡献于数据科学社区。他的内容在互联网上的浏览量已超过一百万次。Derrick 还是一名作者和在线讲师。他还与各种机构合作实施数据科学解决方案,并提升其员工技能。Derrick 在多媒体大学学习数学和计算机科学,同时也是 Meltwater 创业技术学院的校友。如果你对数据科学、机器学习和深度学习感兴趣,你可以查看他的完整数据科学与机器学习 Python 训练营课程

原文。转载已获许可。

相关内容:

  • 处理机器学习中的数据不平衡

  • 如何将 PyTorch Lightning 模型部署到生产环境

  • AI 不仅仅是一个模型:完成工作流程成功的四个步骤


我们的前三大课程推荐

1. Google 网络安全证书 - 快速开启网络安全职业生涯。

2. Google 数据分析专业证书 - 提升你的数据分析技能

3. 谷歌 IT 支持专业证书 - 支持您的组织在 IT 方面


更多相关内容