Azure Arc 机器学习(第二部分):使用 Azure Arc 启用的机器学习在本地训练机器学习模型





5.00/5 (2投票s)
在本文中,我们将学习如何在启用了 Arc 的 Kubernetes 集群上训练机器学习 (ML) 模型。
在本系列的第一篇文章中,我们已将本地 Kubernetes 集群连接到 Azure Arc。本文将介绍如何使用由 Arc 管理的本地 Kubernetes 集群上运行的 Azure 机器学习 (AML) 来训练模型。
您可以在GitHub上查看完整的项目代码。
在 ML 工作区中附加 Kubernetes 集群
要在启用了 Arc 的集群上运行 ML 工作负载,我们必须将 Kubernetes 集群附加到 Azure 中的 ML 工作区。首先,让我们在 Azure 门户中创建一个 AML 资源。
我们可以登录Azure 门户并在市场中搜索机器学习。在机器学习页面上,我们单击创建。
在下一页上,我们选择一个资源组,并为工作区指定名称和区域。完成后,我们单击审阅 + 创建。
验证指定设置需要几秒钟。完成后,我们单击创建。
部署完成后,我们转到资源。
在这里,除了其他配置外,我们还可以看到 AML Studio 的 URL。我们单击该链接以启动 Studio。
然后,在 Studio 中,我们单击左侧菜单中的计算。
在创建和运行 AML Studio 中的 Notebook 之前,我们必须先创建一个计算实例。在计算实例下,我们单击新建。
在下一页上,我们输入计算名称并指定要求。完成后,我们单击创建。
Azure 只需几秒钟即可部署计算实例。
下一步是将我们的 Kubernetes 集群附加到 ML 工作区。我们导航到已附加计算,单击新建,然后从菜单中选择Kubernetes (预览)。
在下一页上,我们为我们的计算机输入一个名称,并从列表中选择我们的 Kubernetes 集群。此外,我们必须将分配托管标识设置为系统分配。完成后,我们单击附加。
完成后,我们将在已附加计算下看到已附加的 Kubernetes 集群。现在,我们已准备好使用 AML 训练模型。
在启用了 Arc 的 Kubernetes 集群上训练 ML 模型
在 AML Studio 中,我们单击左上角的加号 (+) 键,然后单击Notebook。
在下一页上,我们指定文件位置、名称和类型,然后单击创建。
现在,我们将使用 fashion-mnist
数据集训练一个经典的图像分类模型。
在开始训练模型之前,我们必须连接到我们的 ML 工作区。输入以下代码以连接到 AML 工作区
# Connect to Azure Machine Learning Workspace
import azureml.core
from azureml.core import Workspace
ws = Workspace.from_config()
然后,我们将创建一个脚本文件夹来存放与我们的机器学习模型相关的所有脚本。
# Create script folder
import os
script_folder = os.path.join(os.getcwd(), 'script')
os.makedirs(script_folder, exist_ok=True)
此代码完成后,我们将在用户 > {$username}下看到脚本目录。
接下来,我们必须为我们的图像分类问题创建一个 ML 模型。以下代码在脚本文件夹中创建一个名为 train.py 的文件,其中包含用于训练和测试我们的分类模型的所有方法。
%%writefile script/train.py
import os
import time
import azureml
import argparse
import numpy as np
import tensorflow as tf
from tensorflow import keras
from keras import backend as K
from keras import utils, losses
from keras.models import Sequential
from azureml.core import Workspace, Run
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Dense, Dropout, Flatten
os.environ["TF_CPP_MIN_LOG_LEVEL"]= "2"
os.environ['KERAS_BACKEND'] = 'tensorflow'
#Fashion MNIST Dataset CNN model development: https://github.com/zalandoresearch/fashion-mnist
from keras.datasets import fashion_mnist
parser = argparse.ArgumentParser()
parser.add_argument('--data-folder', type=str, dest='data_folder', help='data folder mounting point')
args = parser.parse_args()
#load training and testing data
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
print(x_train.shape, y_train.shape, x_test.shape, y_test.shape, sep = '\n')
# Define the labels
fashion_mnist_labels = ["Top",
"Trouser",
"Jumper",
"Dress",
"Coat",
"Sandal",
"Shirt",
"Trainer",
"Bag",
"Ankle boot"]
#data pre-processing
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
y_train = utils.to_categorical(y_train, num_classes)
y_test = utils.to_categorical(y_test, num_classes)
#formatting issues for image depth (greyscale = 1) with different kernels (tensorflow, cntk, etc)
if K.image_data_format()== 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0],1,img_rows, img_cols)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols,1)
x_test = x_test.reshape(x_test.shape[0],img_rows, img_cols,1)
input_shape = (img_rows, img_cols,1)
# declare variables for model training
num_classes = 10
batch_size = 128
epochs = 10
img_rows,img_cols = 28,28
# model for image classification
model = Sequential()
model.add(Conv2D(64, kernel_size=(3,3), padding = 'same', activation = 'relu', input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Conv2D(32, kernel_size=(3,3), padding = 'same', activation = 'relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.summary()
# start an Azure ML run
run = Run.get_context()
# training the deep learning model
model.compile(loss=losses.categorical_crossentropy, optimizer="Adam", metrics=['accuracy'])
hist = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test))
# evaluate the model performance on test data
print('Predict the test set')
result = model.evaluate(x_test, y_test, verbose=0)
print('Test Loss: ', result[0])
print('Test Accuracy: ', result[1])
# calculate accuracy on the prediction
print('Accuracy is', result[1])
os.makedirs('outputs/model', exist_ok=True)
# save trained model
model.save('outputs/model/model.h5')
在此代码中,我们从 Keras 数据集中加载 fashion-mnist
数据。fashion-mnist
数据集包含 60,000 个用于训练的示例和一个包含 10 个类标签的 10,000 个示例的测试集。成功加载数据后,我们将对图像进行标准化并设置图像深度。
在预处理数据后,我们创建一个用于图像分类的序列模型。该模型由两个 2D 卷积层组成,每个卷积层后面都有一个 2D 池化层。神经网络模型还使用 softmax
函数作为多类分类的激活函数。
接下来,我们启动 Azure 机器学习运行,分别在训练和验证数据上训练和评估数据。模型训练完成后,我们将保存它以备将来使用。
脚本就位后,下一步是按以下方式附加启用了 Arc 的 Kubernetes 计算
# Get attached Arc-enabled kubernetes compute
arc_compute = ws.compute_targets["arc-ml-demo"]
上面的代码将计算目标设置为我们已附加的 Kubernetes 集群。
最后,让我们运行 ML 工作负载。
from azureml.core import Experiment
from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies
from azureml.core import ScriptRunConfig
# Register environment to re-use later
env = Environment('test')
conda_dep = packages = CondaDependencies.create(conda_packages=['pip', 'tensorflow', 'keras', 'scikit-learn'],
pip_packages=['azureml-defaults'])
env.python.conda_dependencies = conda_dep
env.register(workspace = ws)
# reference the data
datastore = ws.get_default_datastore()
data_ref = datastore.path('./data').as_mount()
src = ScriptRunConfig(source_directory=script_folder,
script='train.py',
arguments=['--data-folder', str(data_ref)],
compute_target=arc_compute,
environment=env)
# Run the experiment
src.run_config.data_references = {data_ref.data_reference_name: data_ref.to_config()}
run = Experiment(workspace=ws, name='fashion-mnist').submit(src)
run.wait_for_completion(show_output=True)
在此代码中,我们首先注册环境并定义环境的依赖项。我们还将当前 ML 工作区与环境一起注册。由于我们从 Keras 数据集中加载数据,因此我们必须创建一个 data_ref
对象来引用默认数据存储中的数据。要提交 AML 中的运行,我们将配置信息(包括脚本、计算目标和环境)打包到 ScriptRunConfig
类的实例中。接下来,我们提交这些配置并启动 Azure 中的 ML 加载。
模型开始训练后,它会提供一个 Web 链接来查看其训练进度。此链接允许我们一致地查看和提取历史记录中的日志、指标和模型。模型训练完成后,我们应该会看到与此图像类似的输出
我们还可以按以下方式检查模型的性能
print(run.get_metrics())
我们的模型已完成训练,并报告了 91% 的准确率。由于结果值得,我们可以将此模型注册到 Azure。
在 Azure 中注册模型
当我们向 Azure 注册模型时,Azure 会将其上传到我们工作区的默认存储帐户,我们可以在任何地方挂载它。当我们想要创建一个返回模型预测的后端系统时,这种方法很有用。注册后,我们可以下载或部署注册的模型。
Azure 默认会将 outputs 文件夹中的文件上传到实验记录中。由于我们将训练好的模型保存在 outputs 文件夹中,因此它应该在实验记录中。我们可以从那里注册模型。在注册之前,让我们验证一下我们在所需的文件夹中是否具有模型。
# get files in experiment record
print(run.get_file_names())
上面的代码行输出记录中所有文件的名称。我们还应该看到 model.h5 文件,在本例中该文件位于 outputs/model 文件夹中。
接下来,我们按以下方式注册此模型
# register model
model = run.register_model(model_name='fashion-mnist-tf', model_path='outputs/')
print(model.name, model.id, model.version, sep = '\t')
上面的代码成功执行后,我们应该在 Azure 中看到我们的模型。
我们还可以将训练好的模型的副本下载到本地系统并用于推理。
后续步骤
本文将我们本地托管的、启用了 Arc 的 Kubernetes 集群附加到 AML 工作区,并使用它来训练经典的图像分类模型。请继续阅读下一篇文章,在其中我们将学习部署模型并通过 Azure Arc 启用机器学习在任何地方进行推理。
要详细了解如何配置 Azure Kubernetes Service (AKS) 和 Azure Arc 启用 Kubernetes 集群以进行机器学习工作负载的训练和推理,请参阅配置 Kubernetes 集群以进行机器学习。