只需要简单3 步!在 Azure 上构建部署微服务 NLP 模型

只需要简单3 步!在 Azure 上构建部署微服务 NLP 模型

在你花了大量时间训练模型之后,你需要把这些模型运用到其他的应用程序或服务。

根据不同的云部署方式,这个 过程可能需要几分钟到几个小时不等。更重要的是,部署方式还应该基于可扩展性和你的预算要求。

在这里,我将展示一种直接使用 Python 代码(不是构建容器),将 NLP 模型作为微服务,然后部署到 Azure 的快速方法。如果你想了解更多数据分析相关内容,可以阅读以下这些文章:
如何征服数据科学面试中的Python编程考试
数据科学面试中Product Sense问题,怎么完美解答?
如何回答ML机器学习的面试问题?
如何准备DS数据科学家面试?

图源:Unsplash 摄影:bruce mars

当然,本教程适用于任何 ML 模型,而不仅仅是 NLP。

我在本文展示的设置可能是最简单的设置之一,同时这些设置的维护成本最低。

在开始之前,请确保做好以下准备:

  • 1. 创建一个有订阅的 Azure 帐户:如果你还没有订阅帐户,你可以在 Azure 创建一个新帐户,可以有两周的试用期。
  • 2. 安装 Azure CLI:我们会用命令(Commands)在 Azure 上(不是 Azure Portal UI)创建资源。这种方法的可维护性是最高的,因为我们创建的每个资源都会有脚本,方便发展和复制。通过此链接,查看如何安装 Azure CLI:https://docs.microsoft.com/en-us/cli/azure/install-azure-cli
  • 3. 安装 Azure Functions 核心工具(Azure Functions Core Tools):在把微服务部署到 Azure 之前,我们会在本地创建并测试所有内容,不需要花一分钱。Azure Functions Core Tools将为Azure Functions的设计、开发、测试、运行和调试提供本地开发体验。单击此处查看如何安装Azure Functions 核心工具:https://github.com/Azure/azure-functions-core-tools

下面,我们将实施以下三个步骤:

1. Create and test an Azure function locally
2. Create the resources on Azure
3. Deploy the function to Azure

1. 在本地创建并测试Azure函数

理想情况下,我们希望在部署到 Azure 之前,在本地测试完所有内容。本地测试可以确保一切正常运行,并且不用花在线调试的成本。话虽如此,在 Azure 上的“Application Insights”监控工具也值得一试,它也可以确保你的应用程序顺利运行。但这超出了本文范围,所以先按下不提。

首先,我们要用终端创建并激活python环境;然后,在本地创建一个FunctionApp项目,将多个函数合并在一起;最后,我们创建函数 getSentiment该函数将由 HTTP 请求触发。

# Create and activate an environment
python3 -m venv .venv
source .venv/bin/activate
# Create a FunctionApp Project Locally
func init --worker-runtime python
# Create a Function
func new --name getSentiment --template "HTTP trigger" --authlevel anonymous

现在,我们可以编辑文件 getSentiment\__init__.py 中的函数,添加以下代码(具体取决于模型本身)

import logging
import json
import azure.functions as func
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from transformers import pipeline
import torch

tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")
nlp = pipeline('sentiment-analysis', model=model, tokenizer=tokenizer)

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    text = req.params.get('text')
    if not text:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            text = req_body.get('text')

    sentiment = nlp(text)
    if text:
        return func.HttpResponse(json.dumps({"text": text, "sentiment": sentiment}), mimetype="application/json")
    else:
        return func.HttpResponse(
             "Function executed successfully. Pass a text in the query string or in the request body for sentiment analysis.",
             status_code=400
        )

上面创建的函数将接收一个text参数,并返回输入文本,以及从 Hugging Face 的模型“DistilBERT base uncased finetuned SST-2”中获得的相应的情感分析。

因为我们已经为上面的代码添加了一些库,因此请按照如下方式更新你的 requirements.txt 文件:

# Do not include azure-functions-worker as it may conflict with the Azure Functions platform

azure-functions
transformers
requests
-f https://download.pytorch.org/whl/torch_stable.html
torch==1.9.0+cpu

然后,在上面创建的环境中安装这些库:

pip install -r requirements.txt

现在我们准备在本地测试该函数。为此,你需要运行:

func start

你应该在终端中得到以下输出结果:

“func start”命令的输出示例 图片由作者提供

这样,我们就可以转到上面列出的URL,传递参数text,从而测试模型。例如:

http://localhost:7071/api/getSentiment?text=I%20really%20like%20bananas

输出结果应该为:

本地函数的输出示例 图片由作者提供

现在,一切都按预期在本地运行,我们可以在 Azure 上创建所需资源,并部署微服务。

2. 在 Azure 上创建资源

你可以通过 Azure Potal点击每个资源,并选择设置,执行以下步骤。但这会比较难维持。所以,一般来说,我建议你使用脚本。

所以下面,我们将在终端中运行一些命令,创建以下资源,这些资源是在 Azure 上部署函数所需的最少资源:

  • 资源组(Resource Group):资源组只是为 Azure 解决方案保存多个相关资源的一种方式。
  • 存储帐户(Strorage Account):Azure 存储帐户集中数据对象,例如 blob、文件共享、队列、表和磁盘。该账户为存储提供唯一的命名空间。我们将使用标准类型(也是最便宜的标准类型),主要推荐用于文件、blob 和表。
  • 函数应用(Function App):函数应用是一种资源,将函数分组为一个逻辑单元,以便于管理、部署、扩展以及共享资源。我们将使用最基本的消费计划托管函数应用,并指定创建的存储帐户。
# Login to your Azure Account from the Command Line
az login
# Create a Resource Group
az group create --name rgSENT --location westus
# Create a Storage Account
az storage account create --name stracc2sent --location westus --resource-group rgSENT --sku Standard_LRS
# Create a FunctionApp
az functionapp create --name nlpfuncsa --resource-group rgSENT --os-type linux --consumption-plan-location westus --storage-account stracc2sent --functions-version 3 --runtime python --runtime-version 3.9

请注意,这里我使用 nlpfuncsa,作为 FunctionApp 的名称。此名称在 Azure 上必须是唯一的,因此请给你的应用使用不同的名称。如果上面的命令返回操作返回无效状态“冲突”,可能就是使用了相同的名称。因此,请确保为你的 FunctionApp 使用不同(且唯一)的名称。

3. 将函数部署到 Azure

最后,我们可以将本地项目的代码部署到 Azure 上创建的 FunctionApp,具体命令如下:

func azure functionapp publish nlpfuncsa

由于是远程构建,该过程需要一段时间。最后,输出结果应该如下:

将函数部署到 Azure 后的输出示例 图片由作者提供

现在,你可以转到上面列出的 URL,传递参数text,测试你的模型。例如:

https://nlpfuncsa.azurewebsites.net/api/getsentiment?text=I%20really%20like%20bananas

输出结果应该与在本地运行时的结果相同:

已部署在 Azure 上的函数的输出示例 图片由作者提供

所有操作基本结束。现在,你已将 NLP 模型部署到了 Azure。所有的代码在这里:https://github.com/ricardocarvalhods/azure-app-nlp

如果你想删除你创建的所有内容,打开Azure Portal,找到“资源组”,点击创建的资源组(如果你完全按照这篇文章,该资源组应该为“rgSENT”),然后点击“删除资源组” ”。由于创建的所有资源都在同一个资源组下,执行上述操作将删除所有内容。

以上就是本文的全部内容,建议你动手操作,在Azure上部署自己的NLP模型。感谢你的阅读!你还可以订阅我们的YouTube频道,观看大量数据科学相关公开课:https://www.youtube.com/channel/UCa8NLpvi70mHVsW4J_x9OeQ;在LinkedIn上关注我们,扩展你的人际网络!https://www.linkedin.com/company/dataapplab/

原文作者:Stephen Miracle
翻译作者:Lia
美工编辑:过儿
校对审稿:Jiawei Tong
原文链接:https://towardsdatascience.com/3-steps-to-build-and-deploy-your-nlp-model-as-a-microservice-on-azure-426ca77c66df