使用本地模型部署进行故障排除

尝试将本地模型部署用作对 Azure 容器实例 (ACI) 或 Azure Kubernetes 服务 (AKS) 部署进行故障排除的第一步。 使用本地 Web 服务可以更轻松地发现和修复常见的 Azure 机器学习 Docker Web 服务部署错误。

先决条件

  • 一个 Azure 订阅。 尝试试用版订阅
  • 选项 A(推荐)- 在 Azure 机器学习计算实例上进行本地调试
  • 选项 B - 在计算实例上进行本地调试
  • 选项 C - 通过 Azure 机器学习推理 HTTP 服务器启用本地调试。
    • Azure 机器学习推理 HTTP 服务器(预览版)是一个 Python 包,可用于在本地开发环境中轻松验证入口脚本 (score.py)。 如果评分脚本出现问题,该服务器将返回一个错误。 它还将返回发生错误的位置。
    • 在持续集成和部署管道中创建验证入口时,也可以使用该服务器。 例如,使用候选脚本启动服务器,并针对本地终结点运行测试套件。

Azure 机器学习推理 HTTP 服务器

在本地推理服务器中可以快速调试入口脚本 (score.py)。 如果基础评分脚本存在 bug,该服务器将无法初始化或者为模型提供服务。 相反,它会引发异常并指出发生问题的位置。 详细了解 Azure 机器学习推理 HTTP 服务器

  1. pypi 源安装 azureml-inference-server-http 包:

    python -m pip install azureml-inference-server-http
    
  2. 启动服务器并将 score.py 设置为入口脚本:

    azmlinfsrv --entry_script score.py
    
  3. 使用 curl 将评分请求发送到服务器:

    curl -p 127.0.0.1:5001/score
    

本地调试

可以在 MachineLearningNotebooks 存储库中找到示例本地部署笔记本,以探索可运行的示例。

警告

生成方案不支持本地 Web 服务部署。

若要进行本地部署,请修改代码以使用 LocalWebservice.deploy_configuration() 创建部署配置。 然后使用 Model.deploy() 部署该服务。 以下示例将模型(包含在 model 变量中)部署为本地 Web 服务:

适用于:Python SDK azureml v1

from azureml.core.environment import Environment
from azureml.core.model import InferenceConfig, Model
from azureml.core.webservice import LocalWebservice


# Create inference configuration based on the environment definition and the entry script
myenv = Environment.from_conda_specification(name="env", file_path="myenv.yml")
inference_config = InferenceConfig(entry_script="score.py", environment=myenv)
# Create a local deployment, using port 8890 for the web service endpoint
deployment_config = LocalWebservice.deploy_configuration(port=8890)
# Deploy the service
service = Model.deploy(
    ws, "mymodel", [model], inference_config, deployment_config)
# Wait for the deployment to complete
service.wait_for_deployment(True)
# Display the port that the web service is available on
print(service.port)

如果定义你自己的 conda 规范 YAML,请将版本大于等于 1.0.45 的 azureml-defaults 作为 pip 依赖项列出。 需要此包以将模型作为 Web 服务托管。

此时,你可以正常使用该服务。 以下代码演示了将数据发送到该服务的过程:

import 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]
]})

test_sample = bytes(test_sample, encoding='utf8')

prediction = service.run(input_data=test_sample)
print(prediction)

有关自定义 Python 环境的详细信息,请参阅创建和管理用于训练和部署的环境

更新服务

在本地测试中,可能需要更新 score.py 文件以添加记录或尝试解决发现的任何问题。 若要重新加载对 score.py 文件的更改,请使用 reload()。 例如,以下代码重新加载服务的脚本,然后向其发送数据。 使用 score.py 文件对数据进行评分:

重要

reload 方法仅适用于本地部署。 有关将部署更新到其他计算目标的信息,请参阅如何更新 webservice

service.reload()
print(service.run(input_data=test_sample))

注意

可从服务所使用的 InferenceConfig 对象指定的位置重新加载该脚本。

若要更改模型、Conda 依赖项或部署配置,请使用 update()。 以下示例更新服务使用的模型:

service.update([different_model], inference_config, deployment_config)

删除服务

要删除服务,请使用 delete()

检查 Docker 日志

可以通过服务对象打印详细的 Docker 引擎日志消息。 可以查看 ACI、AKS 和 Local 部署的日志。 以下示例演示如何打印日志。

# if you already have the service object handy
print(service.get_logs())

# if you only know the name of the service (note there might be multiple services with the same name but different version number)
print(ws.webservices['mysvc'].get_logs())

如果在日志中看到行 Booting worker with pid: <pid> 多次出现,则意味着没有足够的内存来启动辅助角色。 可以通过增加 deployment_configmemory_gb 的值来处理错误

后续步骤

详细了解部署: