Microsoft Azure函数部署

这是一个快速指南,可以使用培训的型号 Microsoft Azure函数.

本指南将培训的图像分类器上传到Azure函数。推断功能将由HTTP POST请求方法调用触发,该HTTP POST请求方法调用包括要分类的图像的URL。预测结果将在HTTP响应中返回。

Microsoft Azure函数

Microsoft Azure函数是Microsoft提供的无服务体系结构。您不需要配置服务器或维护操作系统,但只需要上传代码并定义它取决于的任何包。

价钱

微软Azure提供两种定价, 消费计划应用程序服务计划。主要区别是消费计划允许您仅在函数运行时支付。如果需要,它将为您扩展架构,但您没有任何对其缩放的控制。看 这里 为了消费计划定价。

使用“应用服务计划”,您可以选择要函数运行的计算资源级别。然后,只要您的资源定义,您就会收取,无论您的函数是否正在运行。看 这里 用于应用服务计划定价。

目前,Python仍在Azure函数中仍处于预览阶段,并且FastAi仅在应用程序服务计划上提供自己的自定义Docker映像时工作。

要求

软件

账户

1 - 本地设置

安装项目目录

Replace <PROJECT_DIR> with your own project directory name.

mkdir <PROJECT_DIR>
cd <PROJECT_DIR>
python -m venv .env
source .env/bin/activate

创建功能项目

创建使用Python运行时的Azure函数项目。

func init --docker

提示时:

  1. Select a worker runtime: Python

创建功能

创建名称的函数 使用模板“httptrigger”。替换``有自己的函数名称。

func new --name <FUNCTION_NAME> --template "HttpTrigger"

安装Fastai.& Dependencies

在虚拟环境中安装Fastai和您的应用需求的任何其他依赖关系。

然后将所有依赖项输出到要求。将在构建Docker映像时使用。

pip install fastai  # install other dependencies here
pip freeze > requirements.txt

更新功能

修改以下文件 directory:

<FUNCTION_NAME>/在里面.py.

这是您推断功能的生命的地方。以下是使用培训的图像分类模型的示例,其中您用于替换默认文件。

import logging
import os

import azure.functions as func
from fastai.vision import *
import requests


def main(req: func.HttpRequest) -> func.HttpResponse:

    path = Path.cwd()
    learn = load_learner(path)

    request_json = req.get_json()
    r = requests.get(request_json['url'])

    if r.status_code == 200:
        temp_image_name = "temp.jpg"        
        with open(temp_image_name, 'wb') as f:
            f.write(r.content)
    else:
        return func.HttpResponse(f"Image download failed, url: {request_json['url']}")

    img = open_image(temp_image_name)
    pred_class, pred_idx, outputs = learn.predict(img)

    return func.HttpResponse(f"request_json['url']: {request_json['url']}, pred_class: {pred_class}")

<FUNCTION_NAME>/function.json

更新函数授权,以便在没有任何其他安全密钥的情况下调用它。用以下内容替换文件中的相应行:

...
      "authLevel": "anonymous",
...

导出.pkl.

Copy your trained model file, 导出.pkl., to .

测试功能

运行以下命令以在本地计算机上启动函数:

func host start

这将为您提供测试URL的输出:

Now listening on: http://0.0.0.0:7071
Application started. Press Ctrl+C to shut down.

Http Functions:

	inference_function: [GET,POST] http://localhost:7071/api/<FUNCTION_NAME>

检查测试输出

要检查函数是否正常运行,请访问http:// localhost:7071,您应该看到以下内容:

Azure.本地跑步

You can send a HTTP POST method to http://localhost:7071/api/<FUNCTION_NAME> to check that your inference function is working. Replace <URL_TO_IMAGE> with a URL that points to the image:

POST http://localhost:7071/api/<FUNCTION_NAME> HTTP/1.1
content-type: application/json

{
    "url": "<URL_TO_IMAGE>"
}

然后,您应该看到HTTP响应:

HTTP/1.1 200 OK
Connection: close
Date: Sun, 17 Mar 2019 06:30:29 GMT
Content-Type: text/plain; charset=utf-8
Server: Kestrel
Content-Length: 216

request_json['url']: <URL_TO_IMAGE>, pred_class: <PREDICTED_CLASS>

你应该看到 be replaced with the class that your inference function predicts.

You can press Ctrl+C to stop the testing when you’re ready.

2 - Docker Setup

Build Docker image

You can now build the Docker image that will contain your app and all the python libraries that it needs to run:

docker build --tag <DOCKER_HUB_ID>/<DOCKER_IMAGE_NAME>:<TAG> .

如果构建抛出错误

unable to execute 'gcc': No such file or directory

将以下代码添加到dockerfile中 最后一个运行命令。

RUN apt-get update && \
    apt-get install -y build-essential

测试码头图像

以下将在本地计算机上运行Docker映像以进行测试:

docker run -p 8080:80 -it <DOCKER_HUB_ID>/<DOCKER_IMAGE_NAME>:<TAG>

You app in the Docker image is now running at the URL: localhost:8080. 您可以运行相同的测试 检查测试输出 使用新的URL,您应该看到与以前相同的测试输出。

将Docker图像推到Docker Hub

使用以下命令从命令提示符登录docker。出现提示时输入您的Docker Hub密码。

docker login --username <DOCKER_HUB_ID>

您现在可以推动前面创建的Docker映像到Docker Hub:

docker push <DOCKER_HUB_ID>/<DOCKER_IMAGE_NAME>:<TAG>

3 - Azure设置

设置Azure资源

如果您还没有,请使用Azure CLI登录Microsoft Azure:

az login

您现在可以运行以下命令以创建在Azure函数上运行推理应用所需的Azure资源。

以下示例使用最低定价层B1。

用自己的名字替换以下占位符:

    • 为此应用程序创建的所有其他Azure资源的资源组的名称将属于下降
    • 例如 ResourceGroup
    • 运行以下命令以查看可用位置列表:
      • az appservice list-locations --sku B1 --linux-workers-enabled
    • 例如 centralus
    • 是一个通用帐户的Azure存储帐户的名称,以维护有关您功能的信息
    • 必须长度为3到24个字符,并且只能包含数字和小写字母
    • 例如 inferencestorage
    • 您将创建的Azure函数应用程序的名称
    • 将是默认的DNS域,在Azure中的所有应用中必须是唯一的
    • 例如 inferenceapp123

创建资源组

az group create \
--name <RESOURCE_GROUP> \
--location <LOCATION_ID>

创建存储帐户

az storage account create \
--name <STORAGE_ACCOUNT> \
--location <LOCATION_ID> \
--resource-group <RESOURCE_GROUP> \
--sku Standard_LRS

创建Linux应用程序服务计划

az appservice plan create \
--name <APP_PLAN_NAME> \
--resource-group <RESOURCE_GROUP> \
--sku B1 \
--is-linux

创建应用程序&从Docker Hub部署Docker Image

az functionapp create \
--resource-group <RESOURCE_GROUP> \
--name <FUNCTION_APP> \
--storage-account  <STORAGE_ACCOUNT> \
--plan <APP_PLAN_NAME> \
--deployment-container-image-name <DOCKER_HUB_ID>/<DOCKER_IMAGE_NAME>:<TAG>

配置功能应用程序

以下假设occker集线器配置文件前面上传的Docker映像是公共的。如果您已将其设置为私密,您可以看到 这里 添加您的Docker凭据,以便Azure可以访问图像。

storageConnectionString=$(az storage account show-connection-string \
--resource-group <RESOURCE_GROUP> \
--name <STORAGE_ACCOUNT> \
--query connectionString --output tsv)  

az functionapp config appsettings set --name <FUNCTION_APP> \
--resource-group <RESOURCE_GROUP> \
--settings Azure.WebJobsDashboard=$storageConnectionString \
Azure.WebJobsStorage=$storageConnectionString

运行您的Azure函数

在上一个命令之后,应用程序通常需要15-20分钟,以便在Azure上部署。您也可以在此处查看您的应用程序 Microsoft Azure门户网站 under Function Apps.

您应用的URL将是:

//<FUNCTION_APP>.azurewebsites.net/api/<FUNCTION_NAME>

您可以运行相同的测试 检查测试输出 使用新的URL,您应该看到以前的输出。

删除资源组

完成后,删除资源组。

az group delete \
--name <RESOURCE_GROUP> \
--yes

请记住,使用应用程序服务计划,即使您没有调用该函数,您正在收取您的资源运行。因此,最好在不调用该功能以避免意外收费时删除资源组。

参考:

在Azure中创建第一个Python函数(预览)

使用自定义图像在Linux上创建功能

Azure.函数Python Developer Guide