教程帖:使用TensorFlow服务和Flask部署Keras模型!

部署Keras模型通常需要抽象出你的机器学习模型,并将其与易于使用的API端点一起部署或集成。例如,我们可以提供一个URL端点,任何人都可以使用它来发出POST请求,他们会得到模型推断的JSON响应,而不必担心其技术性细节。

教程帖:使用TensorFlow服务和Flask部署Keras模型!


在本教程中,我们将创建一个TensorFlow服务器来部署我们在Keras内置的InceptionV3图像分类卷积神经网络(CNN)。 然后,我们将创建一个简单的Flask服务器,该服务器将接受POST请求并执行Tensorflow服务器所需的一些图像预处理,并返回JSON响应。

什么是TensorFlow服务?

TensorFlow服务是你训练应用机器学习模型的方式。

教程帖:使用TensorFlow服务和Flask部署Keras模型!


了解TensorFlow服务(https://www.youtube.com/watch?v=q_IkJcPyNl0)

TensorFlow服务使得投入生产的过程模型更容易、更快速。它允许你安全地部署新模型并运行实验,同时保持相同的服务器体系结构和API。开箱即用,它提供了与TensorFlow的集成,而且它可以扩展为其他类型的模型。

安装TensorFlow服务

先决条件:请创建一个python虚拟环境,并在其中安装带有TensorFlow后端的Keras。在这里阅读更多(https://keras.io/#installation)

注意:所有命令都在Ubuntu 18.04.1 LTS的python虚拟环境中执行。

现在,在同一虚拟环境中运行以下命令(使用sudo获取root权限):

教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


你可以使用以下命令升级到tensorflow-model-server的较新版本:

教程帖:使用TensorFlow服务和Flask部署Keras模型!


我们将要构建的目录概述

在开始之前了解目录结构将有助于我们清楚地了解每个步骤的位置。

教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


你可以从我的GitHub存储库中获取所有这些文件:https://github.com/himanshurawlani/keras-and-tensorflow-serving

导出用于Tensorflow服务的Keras模型

在本教程中,我们将使用download_inceptionv3_model.py在Keras中下载并保存具有Imagenet权重的InceptionV3 CNN。你可以下载keras.applications库中提供的任何其他模型,或者如果你在Keras中构建了自己的模型,则可以跳过此步骤。

教程帖:使用TensorFlow服务和Flask部署Keras模型!


执行上面的脚本后,你应该得到以下输出:

教程帖:使用TensorFlow服务和Flask部署Keras模型!


现在我们以Keras格式保存了我们的InceptionV3 CNN(inception.h5)。我们希望以TensorFlow服务器可以处理的格式导出我们的模型。我们通过执行export_saved_model.py脚本来完成此操作。

TensorFlow提供了SavedModel格式作为导出模型的通用格式。在后台中,我们的Keras模型完全按照TensorFlow对象进行指定,因此我们可以使用Tensorflow方法将其导出。TensorFlow提供了一个便利的函数tf.saved_model.simple_save(),这适用于大多数用例。

教程帖:使用TensorFlow服务和Flask部署Keras模型!


输出:

教程帖:使用TensorFlow服务和Flask部署Keras模型!


我们收到此警告是因为我们已经下载了预先训练过的模型。我们可以使用这个模型进行推理,但如果我们想进一步训练它,我们需要在加载后运行compile()函数。现在可以安全地忽略此警告。执行此脚本后,以下文件保存在my_image_classifier目录中:

教程帖:使用TensorFlow服务和Flask部署Keras模型!


假设我们将来想要更新我们的模型(可能是因为我们收集了更多的训练数据并在更新的数据集上训练了模型),我们可以这样做:

1. 在新的keras模型上运行相同的脚本

2. 在export_saved_model.py中将export_path ='../my_image_classifier/1'更新为export_path ='../ my_image_classifier/2'

TensorFlow服务将在my_image_classifier目录中自动检测模型的新版本,并在服务器中更新它。

启动TensorFlow服务器

要在本地计算机上启动TensorFlow服务器,请运行以下命令:

教程帖:使用TensorFlow服务和Flask部署Keras模型!


·--model_base_path:这必须是一个绝对路径,否则你会得到一个错误提示:

教程帖:使用TensorFlow服务和Flask部署Keras模型!


·--rest_api_port:Tensorflow服务将在端口8500上启动gRPC ModelServer,并且REST API将在端口9000上可用。

·--model_name:这将是你将用于发送POST请求的服务服务器的名称。你可以在此处输入任何名称。

测试我们的TensorFlow服务器

教程帖:使用TensorFlow服务和Flask部署Keras模型!


从原始数据到生产模型(来源https://twitter.com/tensorflow/status/832008382408126464)

serving_sample_request.py脚本向TensorFlow服务服务器发出POST请求。输入图像通过命令行参数传递。

教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


输出:

教程帖:使用TensorFlow服务和Flask部署Keras模型!


与后续调用相比,TensorFlow服务服务器需要稍多的时间来响应第一个请求。

为什么我们需要Flask服务器?

我们可以看到,我们在serving_sample_request.py(前端调用者)中执行了一些图像预处理步骤。以下是在TensorFlow服务器上创建Flask服务器的原因:

·当我们向前端团队提供API端点时,我们需要确保不会因预处理技术问题而造成阻碍。

·我们可能并不总是拥有Python后端服务器(例如Node.js服务器),因此使用numpy和keras库进行预处理可能会很麻烦。

·如果我们计划提供多个模型,那么我们将不得不创建多个TensorFlow服务服务器,并且必须在我们的前端代码中添加新的URL。但是我们的Flask服务器会保持域URL相同,我们只需要添加一个新路由(一个函数)。

·可以在Flask应用程序中执行基于订阅的访问、异常处理和其他任务。

我们要做的是消除TensorFlow服务器和我们的前端之间的紧密耦合。

教程帖:使用TensorFlow服务和Flask部署Keras模型!


多个TensorFlow服务服务器隐藏在Flask服务器后面

在本教程中,我们将在与TensorFlow服务相同的机器和相同的虚拟环境中创建Flask服务器,并使用已安装的库。理想情况下,两者都应该在不同的机器上运行,因为太多的请求会导致Flask服务器因为执行图像预处理而变慢。此外,如果请求数量非常高,单个Flask服务器可能还不够。如果我们有多个前端呼叫者,我们可能还需要一个排队系统。尽管如此,我们可以使用这种方法来制定令人满意的概念证明。

创建Flask服务器

先决条件:从此处在python虚拟环境中安装Flask。

我们只需要一个app.py文件来创建我们的Flask服务器。

教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


转到保存app.py文件的目录,然后使用以下命令启动Flask服务器:

教程帖:使用TensorFlow服务和Flask部署Keras模型!


·FLASK_ENV =development:这启用了调试模式,它基本上为你提供了完整的错误日志。不要在生产环境中使用它。

·flask run命令自动执行当前目录中的app.py文件。

·--host = 0.0.0.0:这使你可以从任何其他计算机向Flask服务器发出请求。要从其他计算机发出请求,你必须指定运行Flask服务器的计算机的IP地址来代替localhost。

输出:

教程帖:使用TensorFlow服务和Flask部署Keras模型!


使用上一个命令启动TensorFlow服务服务器:

教程帖:使用TensorFlow服务和Flask部署Keras模型!


这是一个脚本(auto_cmd.py),用于自动启动和停止两个服务器(TensorFlow Serving和Flask)。你也可以为两个以上的服务器修改此脚本。

教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


请记住更改auto_cmd.py第10行的路径,使其指向app.py的目录。你可能还需要更改第6行,以使其指向虚拟环境的bin。然后,你可以通过在终端中执行以下命令从任何目录执行上述脚本:

教程帖:使用TensorFlow服务和Flask部署Keras模型!


测试我们的Flask服务器和TensorFlow服务器

我们使用flask_sample_request.py脚本发出示例请求。该脚本基本上模仿了来自前端的请求:

1. 我们获取输入图像,将其编码为base64格式,并使用POST请求将其发送到Flask服务器。

2. Flask服务器解码此base64格式并为我们的TensorFlow服务器预处理它。

3. 然后,Flask服务器向我们的TensorFlow服务器发出POST请求并解码响应。

4. 解码后的响应被格式化并发送回前端。

教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


输出:

教程帖:使用TensorFlow服务和Flask部署Keras模型!


教程帖:使用TensorFlow服务和Flask部署Keras模型!


我们的flask服务器目前只有一条路由用于我们的单个Tensorflow服务器。我们可以通过在不同或相同的机器上创建多个Tensorflow服务器来提供多种模型。为此,我们只需要在app.py文件中添加更多路由(函数),并在其中执行所需的模型特定预处理。我们可以将这些路线提供给我们的前端团队,让他们根据需要调用模型。

处理跨源HTTP请求

考虑这样一个场景,我们使用Angular发出POST请求,我们的Flask服务器接收OPTIONS标头,而不是POST。

·当Web应用程序在请求具有与其自己的源不同的源(域,协议和端口)的资源时,会发出跨源HTTP请求。

·CORS(跨源资源共享)是一种机制,它使用其他HTTP标头告诉浏览器让在一个源(域)上运行的Web应用程序有权从不同来源的服务器访问所选资源。在此处阅读有关CORS的更多信息(https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)

因此,Angular不会从Flask服务器返回任何响应。要解决这个问题,我们必须在app.py中启用Flask-CORS。在这里了解更多。(https://flask-cors.readthedocs.io/en/latest/index.html)

结论

这就是我们为机器学习模型提供服务所需的全部内容。TensorFlow服务使机器学习集成到网站和其他应用程序中变得非常容易。由于keras(https://github.com/keras-team/keras-applications)提供了大量预构建模型,因此利用最少的机器学习和深度学习算法知识来开发超级有用的应用程序是可能的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31545819/viewspace-2217665/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31545819/viewspace-2217665/

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,我可以给出以下的设计与实现方案: ## 设计方案: 1. 首先,需要准备好一个已经训练好的模型,可以使用 Keras, PyTorch, TensorFlow 等深度学习框架进行模型训练。 2. 使用 Flask 框架来搭建一个 Web 服务器,以便提供 API 接口供用户使用。 3. 创建一个用于加载模型Python 文件,在其中加载模型并定义用于预测的函数。 4. 在 Flask 中,使用 `@app.route` 装饰器来定义 API 接口路径,将用户请求的数据传递给预测函数,获取预测结果并返回给用户。 ## 实现步骤: 1. 安装 Flask 框架:可以使用 pip 包管理器进行安装,具体命令为 `pip install Flask`。 2. 在项目目录下创建一个 Python 文件,用于加载模型并定义预测函数。例如,可以创建一个名为 `model.py` 的文件。 3. 在 `model.py` 文件中使用深度学习框架来加载模型,例如 TensorFlow 可以使用 `tf.keras.models.load_model` 函数来加载模型。然后,定义一个预测函数,接收用户请求的数据,经过预处理后进行模型预测,最后返回预测结果。 4. 在 Flask 中,使用 `@app.route` 装饰器来定义 API 接口路径,例如可以定义一个名为 `/predict` 的接口路径。 5. 在接口路径中,使用 `request` 模块获取用户请求的数据,并传递给预测函数进行预测。 6. 获取预测结果后,使用 `jsonify` 函数将结果转换为 JSON 格式,并返回给用户。 以下是一个简单的示例代码: ```python from flask import Flask, request, jsonify from model import predict app = Flask(__name__) @app.route('/predict', methods=['POST']) def predict_api(): data = request.json result = predict(data) return jsonify(result) ``` 其中,`model.py` 文件中的 `predict` 函数需要根据具体的模型进行定义,例如: ```python import tensorflow as tf model = tf.keras.models.load_model('my_model.h5') def predict(data): # 数据预处理代码 ... # 模型预测代码 result = model.predict(inputs) # 结果后处理代码 ... return result ``` 以上就是一个基于 Flask 框架使用 Python 进行模型部署的设计与实现方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值