原文:
www.kdnuggets.com/2020/07/building-rest-api-tensorflow-serving-part-2.html
评论
由 Guillermo Gomez,数据科学家及机器学习工程师
一旦生成了这些 Tensorflow 对象,就该将它们公开供大家使用了。通过围绕这些对象构建 REST API,人们将能够在他们的项目中使用你的服务。让我们看看如何做到这一点!
在这一部分,我假设我们对 Docker 有基本了解。对于那些不熟悉的人,Docker 是一种在计算机上构建隔离环境(容器)的工具,这样它不会与本地文件系统(主机)中的任何文件或程序冲突。它的所有优点中,我会特别强调这些:
-
与虚拟机不同,你可以仅用运行项目单一组件所需的内容来运行容器。这有助于你生成轻量级的容器。
-
Docker 网络功能允许你轻松地让多个容器之间进行通信。
-
即使你的操作系统与所需工具不完全兼容,使用容器也不会再遇到兼容性问题。
-
无论托管环境是你的计算机还是运行在云服务上的服务器,Docker 容器的运行方式都是相同的。
每当我开始学习新东西时,我建议查看文档中的教程或快速入门。Tensorflow Serving 在其 Github 仓库中有一个简短的教程:
# Download the TensorFlow Serving Docker image and repo
docker pull tensorflow/serving
git clone https://github.com/tensorflow/serving
# Location of demo models
TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata"
# Start TensorFlow Serving container and open the REST API port
docker run -t --rm -p 8501:8501 \
-v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" \
-e MODEL_NAME=half_plus_two \
tensorflow/serving &
# Query the model using the predict API
curl -d '{"instances": [1.0, 2.0, 5.0]}' \
-X POST http://localhost:8501/v1/models/half_plus_two:predict
# Returns => { "predictions": [2.5, 3.0, 4.5] }
请注意传递给 docker run
命令的参数,特别是那些接受外部值的参数:
-
-p 8501:8501
,将容器的端口映射到主机上的相同端口。对于 REST API,Tensorflow Serving 使用这个端口,所以在实验中不要更改这个参数。 -
-v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two"
,将一个卷附加到容器。这个卷包含你保存 Tensorflow 对象的文件夹的副本。这个文件夹位于名为/1/
的文件夹的上一层。这一文件夹将在容器中显示在/models/
下。 -
-e MODEL_NAME=half_plus_two
,定义一个环境变量。这个变量是服务你的模型所必需的。为了方便,使用与容器中附加模型的文件夹名称相同的标识符。
你可以为你的可服务对象设计一个 API,但 Tensorflow Serving 通过 Docker 抽象化了这个步骤。一旦你部署了容器,你可以向容器所在的服务器发送请求以执行某种计算。在请求体中,你可以附加一些输入(这是运行可服务对象所必需的),并获得一些输出作为回报。
为了进行计算,你需要在请求中指定可服务对象的端点 URL。在上面显示的示例中,这个端点 URL 是 [
localhost:8501/v1/models/half_plus_two:predict](http://localhost:8501/v1/models/half_plus_two:predict)
。现在一切都准备好运行我们的 Tensorflow 对象了。我们将从 Keras 模型开始:
docker run -t --rm -p 8501:8501 -v "$(pwd)/mobilenet_v2_test:/models/mobilenet_v2_test" -e MODEL_NAME=mobilenet_v2_test tensorflow/serving &
当执行这个命令时,当前目录是 tmp/
。这是我保存所有模型的文件夹。这是终端返回的内容:
模型已经启动并准备好使用。
现在容器已经启动并运行,我们可以通过发送需要识别的图像来发起请求。我将展示两种实现方式。首先,我写了一个小的 shell 脚本(可以从 这里 下载),它接收一个图像文件的路径作为参数,并使用 curl
库进行调用。在这里,我展示了如何发起请求以及模型正在尝试分类的图像。
这只放松的熊猫在实验过程中没有受伤
这就是我们如何使用我们构建的 API 进行调用。
第二个示例涉及一个可服务对象,它将 2 添加到向量的每个元素中。这是容器启动后如何进行调用的示例。
requests
库允许你做相同的事情,但使用 Python 代码
import json
import requests
import base64
data = {}
with open('../../Downloads/imagenes-osos-panda.jpg', mode='rb') as file:
img = file.read()
data = {"inputs":[{"b64":base64.encodebytes(img).decode("utf-8")}]}
# Making the request
r = requests.post("http://localhost:8501/v1/models/mobilenet_v2_test:predict", data=json.dumps(data))
r.content
# And returns:
# b'{\n "outputs": [\n "giant panda"\n ]\n}'
在这段代码中,你会注意到在定义发送到请求中的 JSON 时需要遵循一些规则,例如键的命名和嵌套结构的存在。这在 Tensorflow 的 文档 中有更详细的说明。关于图像,它们在发送到可服务对象之前使用 Base64 编码进行二值化处理。
这涵盖了我目前想用 Tensorflow Serving 解释的所有内容。我希望这个教程能激发你构建机器学习服务的动力。这只是冰山一角。祝你好运!
个人简介:Guillermo Gomez 在公共基础设施和服务行业构建基于机器学习的产品。他的网站可以找到更多教程:thelongrun.blog
原文。经许可转载。
相关内容:
-
使用 TensorFlow Serving 构建 REST API(第一部分)
-
优化机器学习 API 在生产环境中的响应时间
-
开始使用 TensorFlow 2
1. Google 网络安全证书 - 快速进入网络安全职业生涯。
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你的组织在 IT 领域