Azure Arc 机器学习(第三部分):使用 Azure Arc 启用的机器学习实现任意位置的推理





5.00/5 (2投票s)
在本文中,我们将学习如何部署模型并使用 Azure Arc 驱动的机器学习实现任意位置的推理。
在本系列文章的上一篇文章中,我们学习了如何在 Arc 驱动的 Kubernetes 集群上训练机器学习 (ML) 模型。模型训练完成后,理想情况下我们应该能够将其部署并在最适合我们用例的地方运行。
我们可以在本地运行它,也可以在 Azure 上运行它。使用 Arc 驱动的 ML 的一个显著优势在于,它不会迫使我们在两者之间做出选择。相反,它允许我们在边缘、本地或 Azure 等任意位置运行模型并实现推理。
在本文中,我们将演示如何在本地部署模型,然后在 Azure 上部署。您可以在GitHub上查看完整的项目代码。
使用托管在线终结点部署 ML 模型
在线终结点使我们能够以可扩展且托管的方式部署和运行 ML 模型。它们与 Azure 中功能强大的 CPU 和 GPU 驱动的机器配合使用,使我们能够在无需承担设置和管理底层基础架构的开销的情况下,对模型进行服务、扩展、保护和监视。终结点能够快速处理小型请求并提供近乎实时的响应。
必备组件
要使用托管在线终结点部署模型,我们必须确保拥有
- 一个有效的Azure 订阅。注册是免费的,并且可以在一年内以 200 美元的信用额度访问热门服务。
- 已安装并配置Azure CLI
- 通过执行以下命令将 ML 扩展添加到 Azure CLI:
$ az extension add -n ml -y
- 一个具有贡献者访问权限的 Azure 资源组
- 一个 Azure 机器学习 (AML) 工作区
- 已在本地系统上安装Docker,因为我们在本地部署时需要它
- 设置 Azure CLI 的默认设置
我们使用以下命令设置 Azure CLI 的默认设置,以避免传入订阅工作区和资源组的值
$ az account set --subscription <subscription ID>
$ az configure --defaults workspace=<Azure Machine Learning workspace name> group=<resource group>
注意:如果您一直在关注本文系列,应该已经有一个资源组和 AML 工作区。请使用之前创建的资源来设置您的系统以进行模型部署。
完成以上步骤后,我们的系统就可以进行部署了。要使用在线终结点部署模型,我们需要以下内容:
- 经过训练的模型文件,或者在工作区中注册的模型名称和版本
- 用于评分模型的评分文件
- 模型运行的部署环境
让我们开始在 Azure 上创建一个模型。
在 Azure 上创建模型
在 Azure 上创建 ML 资源有多种方法。我们可以选择在 AML 上训练和注册 ML 模型,或者使用 CLI 命令注册一些先前训练的模型。在本系列的上一篇文章中,我们已经训练并注册了模型到 Azure,但我们也可以使用 CLI 命令。
要在 Azure 上注册模型,我们需要一个包含模型规范的 YAML 文件。我们可以使用以下 YAML 模板文件来创建特定于资源的 YAML 文件。
$schema: https://azuremlschemas.azureedge.net/latest/model.schema.json
name: {model name}
version: 1
local_path: {path to local model}
上面的 YAML 文件首先指定模型的架构。它还指定了 Azure 模型的属性,如名称、版本以及本地模型位置的路径。我们可以根据特定模型更改这些属性。
有了包含模型规范的 YAML 文件后,我们执行以下命令在 Azure 上创建模型。
$az ml model create -f {path to YAML file}
在 Azure 上注册模型后,我们应该可以在 AML Studio 的“**模型**”下看到它。
创建评分文件
当调用终结点进行评分和预测时,它会调用评分文件。此评分文件遵循规定的结构,必须包含一个 init
函数和一个 run 函数。每次创建或更新终结点时,终结点都会调用 init
函数,而每次调用终结点时,它都会调用 run
函数。
让我们创建一个评分文件,并通过在本地系统上创建一个 score.py 文件并输入以下代码来对 fashion-mnist-tf
模型进行评分,从而更深入地了解这些方法。
import keras as K
import os
import sys
import numpy as np
import json
import tensorflow as tf
import logging
labels_map = {
0: 'T-Shirt',
1: 'Trouser',
2: 'Pullover',
3: 'Dress',
4: 'Coat',
5: 'Sandal',
6: 'Shirt',
7: 'Sneaker',
8: 'Bag',
9: 'Ankle Boot',
}
def predict(model: tf.keras.Model, x: np.ndarray) -> tf.Tensor:
y_prime = model(x, training=False)
probabilities = tf.nn.softmax(y_prime, axis=1)
predicted_indices = tf.math.argmax(input=probabilities, axis=1)
return predicted_indices
def init():
global model
print("Executing init() method...")
if 'AZUREML_MODEL_DIR' in os.environ:
model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), './outputs/model/model.h5')
else:
model_path = './outputs/model/model.h5'
model = K.models.load_model(model_path)
print("loaded model...")
def run(raw_data):
print("Executing run(raw_data) method...")
data = np.array(json.loads(raw_data)['data'])
data = np.reshape(data, (1,28,28,1))
predicted_index = predict(model, data).numpy()[0]
predicted_name = labels_map[predicted_index]
logging.info('Predicted name: %s', predicted_name)
logging.info('Run completed')
return predicted_name
在上面的代码中,predict
函数接收数据并返回具有最高概率的标签索引。init
函数负责加载模型。AZUREML_MODEL_DIR
环境变量为我们提供了模型在 Azure 中根文件夹的路径。如果环境变量不可用,它将从本地计算机加载模型。
run
函数负责预测。它以 raw_data
作为参数,其中包含我们在调用终结点时传递的数据。run
函数加载 JSON 数据,对其进行转换,对数据调用 predict
函数,返回预测结果,并通过将结果映射到我们定义的标签将其转换为人类可读的格式。
有了评分文件后,让我们创建部署环境。
创建部署环境
AML 环境指定了 Azure 中训练和预测作业的运行时及其他配置。Azure 提供了多种推理选项,包括预先构建的 Docker 镜像或用于自定义环境的基础镜像。在此,我们使用 Microsoft 提供的一个基础镜像,并手动扩展它,添加 Azure 上推理所需的所有包。
在创建部署环境之前,我们必须使用以下命令设置终结点名称
$ export ENDPOINT_NAME="azure-arc-demo"
我们还必须创建一个包含终结点规范(如架构和名称)的 YML 文件。我们按如下方式创建一个 endpoint.yml 文件:
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: azure-arc-demo
auth_mode: key
下一步是定义我们的部署环境依赖项。由于我们使用基础镜像,因此必须使用包含所有依赖项的 Conda YAML 文件来扩展该镜像。我们创建一个 conda.yml 文件并向其中添加以下代码:
name: test
channels:
- conda-forge
dependencies:
- python
- numpy
- pip
- tensorflow
- scikit-learn
- keras
- pip:
- azureml-defaults
- inference-schema[numpy-support]
此文件包含推理所需的所有依赖项。请注意,我们还添加了一个 azureml-defaults
包,这是我们在 Azure 上进行推理所必需的。就绪后,我们按如下方式创建一个 deployment.yml 文件:
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: fashion-mnist
type: kubernetes
endpoint_name: azure-arc-demo
app_insights_enabled: true
model:
name: fashion-mnist-tf
version: 1
local_path: "./outputs/model/model.h5"
code_configuration:
code:
local_path: .
scoring_script: score.py
instance_type: defaultinstancetype
environment:
conda_file: ./conda.yml
image: mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:latest
在上面的代码中,我们设置了几个变量,如 endpoint_name
、model
、scoring script
和 conda_file
,确保这些路径指向我们文件所在的目录。
创建完以上所有文件后,就可以部署模型了。
在本地部署模型
在部署模型之前,我们首先通过执行以下命令来创建终结点:
$ az ml online-endpoint create --local -n azure-arc-demo -f ./fashion-mnist-deployment/endpoint.yml
接下来,我们按如下方式部署模型:
$ az ml online-deployment create --local -n fashion-mnist --endpoint azure-arc-demo -f ./fashion-mnist-deployment/deployment.yml
上面的命令在 azure-arc-demo
终结点下创建了一个名为 fashion-mnist
的本地部署。我们使用此命令验证部署:
$ az ml online-endpoint show -n azure-arc-demo --local
部署成功,现在我们可以调用它进行推理了。
调用终结点进行推理
部署成功后,我们可以通过传递我们的请求来调用终结点进行推理。但在此之前,我们必须创建一个包含输入数据以供预测的文件。我们可以快速从测试数据集中获取一个图像文件,将其转换为 JSON,然后将其传递给终结点进行预测。我们使用以下代码创建了一个示例请求。
import json
import tensorflow as tf
#Fashion MNIST Dataset CNN model development: https://github.com/zalandoresearch/fashion-mnist
from keras.datasets import fashion_mnist
from tensorflow.keras.utils import to_categorical
# load the data
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
#no. of classes
num_classes = 10
x_test = x_test.astype('float32')
x_test /= 255
y_test = to_categorical(y_test, num_classes)
with open('mydata.json', 'w') as f:
json.dump({"data": x_test[10].tolist()}, f)
上面的代码加载单个图像文件,创建一个包含图像像素值的矩阵,将其添加到具有关键数据的 JSON 字典中,并将其保存到 mydata.json 文件中。
现在我们有了示例请求,我们按如下方式调用终结点:
$ az ml online-endpoint invoke --local --name azure-arc-demo --request-file ./fashion-mnist-deployment/mydata.json
终结点几乎实时地响应预测结果。
将在线终结点部署到 Azure
将终结点部署到 Azure 与将其部署到本地环境一样简单。在本地部署模型时,我们使用了 --local
标志,它指示 CLI 在本地 Docker 环境中部署终结点。只需删除此标志,我们就可以将模型部署到 Azure。
我们执行以下命令在云中创建终结点:
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
$ az ml online-endpoint create --name azure-arc-demo -f ./fashion-mnist-deployment/endpoint.yml
创建终结点后,我们可以在 AML Studio 的“**终结点**”下看到它。
接下来,我们在终结点下创建一个名为 fashion-mnist
的部署。
$ az ml online-deployment create --name fashion-mnist --endpoint azure-arc-demo –f ./fashion-mnist-deployment/deployment.yml --all-traffic
部署可能需要一些时间,具体取决于底层环境。部署成功后,我们可以按如下方式调用模型进行推理:
$ az ml online-endpoint invoke --name azure-arc-demo --request-file ./fashion-mnist-deployment/mydata.json
上面的命令返回与我们本地部署的模型相同的输出。
摘要
在本文中,我们学习了如何在本地和 Azure 上部署模型。即使我们在其他云提供商或边缘拥有 Arc 驱动的 Kubernetes 集群,模型部署过程也基本相同。Arc 驱动的机器学习使我们能够无缝部署和运行我们的模型,而无需考虑硬件和位置。
本文系列是入门 Arc 驱动机器学习的入门指南。毫无疑问,Kubernetes 为优化机器学习过程打开了许多大门。同时,Arc 使整个过程顺畅,并让我们能够自由地在自选硬件上训练和运行机器学习模型。
要追求强大、可扩展的机器学习,请注册免费的Azure Arc 帐户。
要了解有关如何为训练和推理机器学习工作负载配置 Azure Kubernetes Service (AKS) 和 Azure Arc 驱动的 Kubernetes 集群的更多信息,请查看为机器学习配置 Kubernetes 集群。