使用 Azure Functions 进行大规模无服务器机器学习推理
本文是#ServerlessSeptember活动的一部分。在这个涵盖所有 Serverless 相关内容的合集中,您可以找到其他有用的文章、详细的教程和视频。整个九月,社区成员和云技术倡导者每天都会发布新文章——没错,每天都有!
请访问https://docs.microsoft.com/azure/azure-functions/了解更多关于 Microsoft Azure 如何启用您的无服务器函数的信息。
Azure Functions 近期宣布正式推出对 Python 语言的支持。我们可以使用 Python 3.6 以及 Python 庞大的软件包生态系统(例如 TensorFlow)来构建无服务器函数。今天,我们将探讨如何将 TensorFlow 与 Python Azure Functions 结合使用,以执行大规模机器学习推理。
概述
图像分类是机器学习中常见的任务。图像分类是一项计算密集型任务,执行速度可能很慢。如果我们需要对图像流(例如来自物联网摄像头的图像流)进行分类,则需要部署大量基础设施,以获得足够的计算能力来应对不断增长的图像数量和处理速度。
由于像 Azure Functions 这样的无服务器平台可以根据需求自动扩展,我们可以利用它们来执行机器学习推理,并确信它们能够应对高容量工作负载。
在不进行任何扩展的情况下,我们的应用程序目前的运行速度是这样的:
申请流程非常简单。以下是主要部分:
- Azure 存储队列是一个低成本但高度可扩展的消息队列。我们将在队列中创建一条消息,其中包含每个待分类图像的 URL。
- Azure Functions是 Azure 的无服务器函数平台。对于队列中的每个图像 URL,都会运行一个 Python 函数来使用 TensorFlow 模型对图像进行分类。Azure Functions 能够横向扩展并并行处理这项工作。
- Azure SignalR 服务是一种完全托管的实时消息服务,支持 WebSocket 等协议。每个分类结果都会广播到一个或多个使用 SignalR 服务的浏览器中运行的状态页面。
构建应用程序
我们正在构建的应用会使用 TensorFlow 模型分析图像,预测图像中包含的是猫还是狗。它使用了上述 Azure 服务。我们将首先在本地构建并运行该函数应用。
创建 Azure 服务
我们首先在 Azure 门户中配置以下 Azure 服务。
- 创建一个具有以下参数的 Azure 函数应用:
- Linux消费计划
- Python
- 新建存储帐户(我们也会在这个帐户中创建队列)
- 使用以下参数创建 Azure SignalR 服务帐户:
- 与您的函数应用位于同一区域
- 免费套餐
创建函数应用
接下来,我们将使用 Azure Functions CLI 创建一个 Python 函数应用。有关完整详细信息,请参阅这篇Python Azure Functions 机器学习教程。
func init --worker-runtime python
接下来,我们将创建一个名为 `getMessage()` 的函数classifyimage,该函数会在队列中有消息时触发。
func new --template AzureQueueStorageTrigger --name classifyimage
在名为“.”的文件夹中创建了一个函数classifyimage。
要使用 Azure SignalR 服务及其 Azure Functions 绑定来广播图像,我们需要将扩展添加到函数应用中。一种方法是运行以下命令。
func extensions install -p Microsoft.Azure.WebJobs.Extensions.SignalRService -v 1.0.0
我们稍后会修改函数。但首先,我们需要导入一个TensorFlow模型,我们将使用该模型对图像进行分类。
导入 TensorFlow 模型
在这个应用中,我们导入了一个使用 Azure 自定义视觉服务训练的 TensorFlow 模型,该模型可以将图像分类为“猫”或“狗”。如需了解如何训练和导出您自己的模型以识别几乎任何您能想到的东西,请查看这些说明。
该模型由model.pb和组成。这里labels.txt有一个已经训练好的模型。我们可以将这些文件复制到包含该函数的文件夹中。classifyimage
在函数中使用该模型。
我们需要一些软件包,例如 TensorFlow。请将它们添加到您的目录中requirements.txt并安装:
azure-functions
tensorflow
Pillow
requests
pip install --no-cache-dir -r requirements.txt
classifyimage/function.json描述函数的触发器、输入和输出。我们将更新队列名称,images并为该函数添加 SignalR 服务输出绑定。
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "msg",
"type": "queueTrigger",
"direction": "in",
"queueName": "images",
"connection": "AzureWebJobsStorage"
},
{
"type": "signalR",
"direction": "out",
"name": "$return",
"hubName": "imageclassification"
}
]
}
然后我们将更新函数体(classifyimage/__init__.py),以使用队列消息中的 URL 下载图像,运行 TensorFlow 模型,并返回结果。
import logging
import azure.functions as func
import json
from .predict import predict_image_from_url
def main(msg: func.QueueMessage) -> str:
image_url = msg.get_body().decode('utf-8')
results = predict_image_from_url(image_url)
logging.info(f"{results['predictedTagName']} {image_url}")
return json.dumps({
'target': 'newResult',
'arguments': [{
'predictedTagName': results['predictedTagName'],
'url': image_url
}]
})
大部分工作由辅助函数完成,predict.py这些函数可以在这里找到并复制到我们的函数应用中。该函数还会返回一条通过 Azure SignalR 服务广播的消息。消息包含图像 URL 和预测结果(“猫”或“狗”)。
在本地配置并运行应用程序
我们使用 Azure Functions 应用在本地进行配置local.settings.json。将连接字符串添加到我们的存储帐户和 SignalR 服务。
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "python",
"AzureWebJobsStorage": "<STORAGE_CONNECTION_STRING>",
"AzureSignalRConnectionString": "<SIGNALR_CONNECTION_STRING>"
}
}
现在我们运行函数应用程序。
func start
使用Azure 存储资源管理器之类的工具,我们在存储帐户中创建一个名为“queue”的队列images,并添加一条包含图像 URL 的消息。我们应该会看到函数执行。
大规模部署和运行应用程序
现在应用程序已经在本地运行,是时候将其部署到云端了!
运行以下 Azure Functions Core Tools 命令,将我们的应用部署到之前创建的 Azure 函数应用中。我们使用远程构建,以便引入在 Linux 上运行所需的正确依赖项。
func azure functionapp publish <FUNCTION_APP_NAME> -b remote
我们还需要在函数应用程序的配置设置中配置存储帐户和 SignalR 服务连接字符串。
要向队列中添加大量图像 URL,请运行类似这样的加载生成器脚本。
示例应用还包含一个状态页面,该页面连接到 Azure SignalR 服务,接收分类结果并实时显示。要将此页面部署到 Azure,请参阅SignalR 服务无服务器开发人员指南中的详细信息。
当状态页面在浏览器中打开时,每次函数执行并对图像进行分类后,都会将结果推送到状态页面。随着队列中消息数量的不断增加,Azure Functions 平台检测到队列长度增长,函数应用就会横向扩展到更多实例。随着函数应用的横向扩展,每秒分类的图像数量也会增加。
概括
本文介绍了 Azure Functions 对 Python 及其众多常用软件包(包括 TensorFlow)的支持。它使我们能够大规模运行机器学习推理任务。要了解更多信息,请查看以下资源:
文章来源:https://dev.to/azure/large-scale-serverless-machine-learning-inference-with-azure-functions-4mb7




