将机器学习模型部署到 Azure 应用服务(预览版)
了解如何从 Azure 机器学习将模型部署为 Azure 应用服务中的 Web 应用。
重要
尽管 Azure 机器学习和 Azure 应用服务都已正式发布,但将模型从机器学习服务部署到应用服务的功能处于预览阶段。
通过 Azure 机器学习,可从经训练的机器学习模型创建 Docker 映像。 此映像包含一个 Web 服务,它会接收数据,将数据提交到模型,然后返回响应。 Azure 应用服务可用于部署映像,并提供以下功能:
有关 Azure 应用服务提供的功能的详细信息,请参阅应用服务概述。
重要
如果需要记录已部署模型所使用的评分数据或评分结果的功能,应改为部署到 Azure Kubernetes 服务。 有关详细信息,请参阅在生产模型上收集数据。
先决条件
Azure 机器学习工作区。 有关详细信息,请参阅创建工作区一文。
工作区中注册的已训练的机器学习模型。 如果没有模型,请使用图像分类教程:训练模型来训练和注册模型。
重要
本文中的代码片段假设你已设置以下变量:
ws
- Azure 机器学习工作区。model
- 将要部署的注册模型。inference_config
- 用于模型的推理配置。
有关设置这些变量的详细信息,请参阅使用 Azure 机器学习部署模型。
准备部署
在部署之前,必须确定将模型作为 Web 服务运行所需的内容。 以下列表描述了部署所需的主要项:
一个入口脚本。 此脚本接受请求,使用模型为请求评分并返回结果。
重要
入口脚本特定于你的模型;它必须能够识别传入请求数据的格式、模型所需数据的格式以及返回给客户端的数据的格式。
如果请求数据的格式对模型不可用,则该脚本可以将其转换为可接受的格式。 在将响应返回给客户端之前,它还可以对响应进行转换。
重要
Azure 机器学习 SDK 不为 Web 服务提供访问数据存储或数据集的方法。 如果需要部署的模型访问存储在部署外的数据,例如 Azure 存储帐户中的数据,则必须使用相关的 SDK 开发自定义代码解决方案。 例如,用于 Python 的 Azure 存储 SDK。
可能适用于该方案的另一种方法是批量预测,它在评分时提供对数据存储的访问权限。
有关入口脚本的详细信息,请参阅使用 Azure 机器学习部署模型。
依赖项,如运行入口脚本或模型所需的帮助程序脚本或 Python/Conda 包
这些实体被封装到推理配置中。 推理配置引用入口脚本和其他依赖项。
重要
创建用于 Azure 应用服务的推理配置时,必须使用 Environment 对象。 请注意,如果要定义自定义环境,必须将版本 >= 1.0.45 的 azureml-defaults 添加为 pip 依赖项。 此包包含将模型作为 Web 服务托管时所需的功能。 下面的示例演示如何创建环境对象并将其用于推理配置:
from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies
from azureml.core.model import InferenceConfig
# Create an environment and add conda dependencies to it
myenv = Environment(name="myenv")
# Enable Docker based environment
myenv.docker.enabled = True
# Build conda dependencies
myenv.python.conda_dependencies = CondaDependencies.create(conda_packages=['scikit-learn'],
pip_packages=['azureml-defaults'])
inference_config = InferenceConfig(entry_script="score.py", environment=myenv)
有关环境的详细信息,请参阅创建和管理用于训练和部署的环境。
有关推理配置的详细信息,请参阅使用 Azure 机器学习部署模型。
重要
部署到 Azure 应用服务时,无需创建部署配置。
创建映像
若要创建部署到 Azure 应用服务的 Docker 映像,请使用 Model.package。 下面的代码片段演示如何从模型和推理配置生成新的映像:
注意
该代码片段假定 model
包含已注册的模型,并且 inference_config
包含推理环境的配置。 有关详细信息,请参阅使用 Azure 机器学习部署模型。
from azureml.core import Model
package = Model.package(ws, [model], inference_config)
package.wait_for_creation(show_output=True)
# Display the package location/ACR path
print(package.location)
当 show_output=True
时,将显示 Docker 生成过程的输出。 此过程完成后,即在 Azure 容器注册表中为工作区创建了映像。 映像生成后,会显示其在 Azure 容器注册表中的位置。 返回的位置采用 <acrinstance>.azurecr.cn/package@sha256:<imagename>
格式。 例如,myml08024f78fd10.azurecr.cn/package@sha256:20190827151241
。
重要
保存位置信息,因为会在部署映像时使用。
将映像部署为 Web 应用
使用以下命令获取包含映像的 Azure 容器注册表的登录凭据。 将
<acrinstance>
替换为之前从package.location
返回的值:az acr credential show --name <myacr>
此命令的输出类似于以下 JSON 文档:
{ "passwords": [ { "name": "password", "value": "Iv0lRZQ9762LUJrFiffo3P4sWgk4q+nW" }, { "name": "password2", "value": "=pKCxHatX96jeoYBWZLsPR6opszr==mg" } ], "username": "myml08024f78fd10" }
保存“用户名”和某个“密码”的值。
如果你还没有资源组或应用服务计划来部署服务,以下命令将演示如何创建这两项:
az group create --name myresourcegroup --location "China East 2" az appservice plan create --name myplanname --resource-group myresourcegroup --sku B1 --is-linux
在此示例中,使用了基本定价层 (
--sku B1
)。重要
Azure 机器学习创建的映像使用 Linux,因此必须使用
--is-linux
参数。若要创建 Web 应用,请使用以下命令。 将
<app-name>
替换为要使用的名称。 将<acrinstance>
和<imagename>
替换为之前返回的package.location
的值:az webapp create --resource-group myresourcegroup --plan myplanname --name <app-name> --deployment-container-image-name <acrinstance>.azurecr.cn/package@sha256:<imagename>
此命令将返回类似以下 JSON 文档的信息:
{ "adminSiteName": null, "appServicePlanName": "myplanname", "geoRegion": "China East 2", "hostingEnvironmentProfile": null, "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myplanname", "kind": "linux", "location": "China East 2", "maximumNumberOfWorkers": 1, "name": "myplanname", < JSON data removed for brevity. > "targetWorkerSizeId": 0, "type": "Microsoft.Web/serverfarms", "workerTierName": null }
重要
此时,已创建了 Web 应用。 但是,由于你尚未向包含映像的 Azure 容器注册表提供凭据,因此 Web 应用未处于活动状态。 在下一步中,为容器注册表提供身份验证信息。
若要为 Web 应用提供访问容器注册表所需的凭据,请使用以下命令。 将
<app-name>
替换为要使用的名称。 将<acrinstance>
和<imagename>
替换为之前返回的package.location
的值。 将<username>
和<password>
替换为之前检索到的 ACR 登录信息:az webapp config container set --name <app-name> --resource-group myresourcegroup --docker-custom-image-name <acrinstance>.azurecr.cn/package@sha256:<imagename> --docker-registry-server-url https://<acrinstance>.azurecr.cn --docker-registry-server-user <username> --docker-registry-server-password <password>
此命令将返回类似以下 JSON 文档的信息:
[ { "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE", "slotSetting": false, "value": "false" }, { "name": "DOCKER_REGISTRY_SERVER_URL", "slotSetting": false, "value": "https://myml08024f78fd10.azurecr.cn" }, { "name": "DOCKER_REGISTRY_SERVER_USERNAME", "slotSetting": false, "value": "myml08024f78fd10" }, { "name": "DOCKER_REGISTRY_SERVER_PASSWORD", "slotSetting": false, "value": null }, { "name": "DOCKER_CUSTOM_IMAGE_NAME", "value": "DOCKER|myml08024f78fd10.azurecr.cn/package@sha256:20190827195524" } ]
此时,Web 应用开始加载映像。
重要
加载映像可能需要几分钟时间。 若要监视进度,请使用以下命令:
az webapp log tail --name <app-name> --resource-group myresourcegroup
加载映像且站点处于活动状态后,该日志将显示一条消息,表明 Container <container name> for site <app-name> initialized successfully and is ready to serve requests
。
部署映像后,可以使用以下命令查找主机名:
az webapp show --name <app-name> --resource-group myresourcegroup
此命令将返回类似以下主机名的信息 - <app-name>.chinacloudsites.cn
。 将此值用作服务基 URL 的一部分。
使用 Web 应用
向模型传递请求的 Web 服务位于 {baseurl}/score
。 例如,https://<app-name>.chinacloudsites.cn/score
。 以下 Python 代码演示了如何将数据提交到 URL 并显示响应:
import requests
import json
scoring_uri = "https://mywebapp.chinacloudsites.cn/score"
headers = {'Content-Type':'application/json'}
test_sample = json.dumps({'data': [
[1,2,3,4,5,6,7,8,9,10],
[10,9,8,7,6,5,4,3,2,1]
]})
response = requests.post(scoring_uri, data=test_sample, headers=headers)
print(response.status_code)
print(response.elapsed)
print(response.json())
后续步骤
请参阅 Linux 上的应用服务文档,了解如何配置 Web 应用。
请参阅 Azure 中的自动缩放入门,详细了解缩放。