教程帖:使用TensorFlow服务和Flask部署Keras模型!
点击上方关注,All in AI中国
作者——Himanshu Rawlani
部署Keras模型通常需要抽象出你的机器学习模型,并将其与易于使用的API端点一起部署或集成。例如,我们可以提供一个URL端点,任何人都可以使用它来发出POST请求,他们会得到模型推断的JSON响应,而不必担心其技术性细节。
在本教程中,我们将创建一个TensorFlow服务器来部署我们在Keras内置的InceptionV3图像分类卷积神经网络(CNN)。 然后,我们将创建一个简单的Flask服务器,该服务器将接受POST请求并执行Tensorflow服务器所需的一些图像预处理,并返回JSON响应。
什么是TensorFlow服务?
TensorFlow服务是你训练应用机器学习模型的方式。
了解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-model-server的较新版本:
我们将要构建的目录概述
在开始之前了解目录结构将有助于我们清楚地了解每个步骤的位置。
你可以从我的GitHub存储库中获取所有这些文件:https://github.com/himanshurawlani/keras-and-tensorflow-serving
导出用于Tensorflow服务的Keras模型
在本教程中,我们将使用download_inceptionv3_model.py在Keras中下载并保存具有Imagenet权重的InceptionV3 CNN。你可以下载keras.applications库中提供的任何其他模型,或者如果你在Keras中构建了自己的模型,则可以跳过此步骤。
执行上面的脚本后,你应该得到以下输出:
现在我们以Keras格式保存了我们的InceptionV3 CNN(inception.h5)。我们希望以TensorFlow服务器可以处理的格式导出我们的模型。我们通过执行export_saved_model.py脚本来完成此操作。
TensorFlow提供了SavedModel格式作为导出模型的通用格式。在后台中,我们的Keras模型完全按照TensorFlow对象进行指定,因此我们可以使用Tensorflow方法将其导出。TensorFlow提供了一个便利的函数tf.saved_model.simple_save(),这适用于大多数用例。
输出:
我们收到此警告是因为我们已经下载了预先训练过的模型。我们可以使用这个模型进行推理,但如果我们想进一步训练它,我们需要在加载后运行compile()函数。现在可以安全地忽略此警告。执行此脚本后,以下文件保存在my_image_classifier目录中:
假设我们将来想要更新我们的模型(可能是因为我们收集了更多的训练数据并在更新的数据集上训练了模型),我们可以这样做:
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服务器,请运行以下命令:
·--model_base_path:这必须是一个绝对路径,否则你会得到一个错误提示:
·--rest_api_port:Tensorflow服务将在端口8500上启动gRPC ModelServer,并且REST API将在端口9000上可用。
·--model_name:这将是你将用于发送POST请求的服务服务器的名称。你可以在此处输入任何名称。
测试我们的TensorFlow服务器
从原始数据到生产模型(来源https://twitter.com/tensorflow/status/832008382408126464)
serving_sample_request.py脚本向TensorFlow服务服务器发出POST请求。输入图像通过命令行参数传递。
输出:
与后续调用相比,TensorFlow服务服务器需要稍多的时间来响应第一个请求。
为什么我们需要Flask服务器?
我们可以看到,我们在serving_sample_request.py(前端调用者)中执行了一些图像预处理步骤。以下是在TensorFlow服务器上创建Flask服务器的原因:
·当我们向前端团队提供API端点时,我们需要确保不会因预处理技术问题而造成阻碍。
·我们可能并不总是拥有Python后端服务器(例如Node.js服务器),因此使用numpy和keras库进行预处理可能会很麻烦。
·如果我们计划提供多个模型,那么我们将不得不创建多个TensorFlow服务服务器,并且必须在我们的前端代码中添加新的URL。但是我们的Flask服务器会保持域URL相同,我们只需要添加一个新路由(一个函数)。
·可以在Flask应用程序中执行基于订阅的访问、异常处理和其他任务。
我们要做的是消除TensorFlow服务器和我们的前端之间的紧密耦合。
多个TensorFlow服务服务器隐藏在Flask服务器后面
在本教程中,我们将在与TensorFlow服务相同的机器和相同的虚拟环境中创建Flask服务器,并使用已安装的库。理想情况下,两者都应该在不同的机器上运行,因为太多的请求会导致Flask服务器因为执行图像预处理而变慢。此外,如果请求数量非常高,单个Flask服务器可能还不够。如果我们有多个前端呼叫者,我们可能还需要一个排队系统。尽管如此,我们可以使用这种方法来制定令人满意的概念证明。
创建Flask服务器
先决条件:从此处在python虚拟环境中安装Flask。
我们只需要一个app.py文件来创建我们的Flask服务器。
转到保存app.py文件的目录,然后使用以下命令启动Flask服务器:
·FLASK_ENV =development:这启用了调试模式,它基本上为你提供了完整的错误日志。不要在生产环境中使用它。
·flask run命令自动执行当前目录中的app.py文件。
·--host = 0.0.0.0:这使你可以从任何其他计算机向Flask服务器发出请求。要从其他计算机发出请求,你必须指定运行Flask服务器的计算机的IP地址来代替localhost。
输出:
使用上一个命令启动TensorFlow服务服务器:
这是一个脚本(auto_cmd.py),用于自动启动和停止两个服务器(TensorFlow Serving和Flask)。你也可以为两个以上的服务器修改此脚本。
请记住更改auto_cmd.py第10行的路径,使其指向app.py的目录。你可能还需要更改第6行,以使其指向虚拟环境的bin。然后,你可以通过在终端中执行以下命令从任何目录执行上述脚本:
测试我们的Flask服务器和TensorFlow服务器
我们使用flask_sample_request.py脚本发出示例请求。该脚本基本上模仿了来自前端的请求:
1. 我们获取输入图像,将其编码为base64格式,并使用POST请求将其发送到Flask服务器。
2. Flask服务器解码此base64格式并为我们的TensorFlow服务器预处理它。
3. 然后,Flask服务器向我们的TensorFlow服务器发出POST请求并解码响应。
4. 解码后的响应被格式化并发送回前端。
输出:
我们的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)提供了大量预构建模型,因此利用最少的机器学习和深度学习算法知识来开发超级有用的应用程序是可能的。