WatchStor.com — 领先的中文存储网络媒体 | 51CTO旗下网站

专栏文章 > 商用办公 > 正文
用 Azure ML Service 构建和部署机器学习模型
作者: 布加迪编译 2019-01-28 19:26 【AI推手】

我们在本教程中将构建和部署一个机器模型,以便利用 Stackoverflow 数据集预测工资。看完本文后,你能够调用充分利用 REST 的 Web 服务来获得预测结果。

由于目的是演示工作流程,我们将使用一个简单的双列数据集进行试验,该数据集包含多年的工作经验和薪水。

先决条件

1.Python 和 Scikit-learn 方面的基础知识

2.有效的微软 Azure 订阅

3.Anaconda 或 Miniconda

配置开发环境

使用 Azure ML SDK 配置一个虚拟环境。 运行以下命令以安装 Python SDK,并启动 Jupyter Notebook。从 Jupyter 启动一个新的 Python 3内核。

$ conda create -n aml -y Python=3.6

$ conda activate aml

$ conda install nb_conda

$ pip install azureml-sdk[notebooks]

$ jupyter notebook

初始化 Azure ML 环境

先导入所有必要的 Python 模块,包括标准的 Scikit-learn 模块和 Azure ML 模块。

import datetime

import numpy as np

import pandas as pd

from sklearn.model_selection import train_test_split

from sklearn.linear_model import LinearRegression

from sklearn.externals import joblib

import azureml.core

from azureml.core import Workspace

from azureml.core.model import Model

from azureml.core import Experiment

from azureml.core.webservice import Webservice

from azureml.core.image import ContainerImage

from azureml.core.webservice import AciWebservice

from azureml.core.conda_dependencies import CondaDependencies

我们需要创建一个 Azure ML Workspace,该工作区充当我们这次试验的逻辑边界。Workspace 创建用于存储数据集的 Storage Account、存储秘密信息的 Key Vault、维护映像中心的 Container Registry 以及记录度量指标的 Application Insights。

别忘了把占位符换成你的订阅 ID。

ws = Workspace.create(name='salary',

subscription_id='',

resource_group='mi2',

create_resource_group=True,

location='southeastasia'

)

几分钟后,我们会看到 Workspace 里面创建的资源。

现在我们可以创建一个 Experiment 开始记录度量指标。由于我们没有许多参数要记录,于是获取训练过程的启始时间。

exp = Experiment(workspace=ws, name='salexp')

run = exp.start_logging()

run.log("Experiment start time", str(datetime.datetime.now()))

训练和测试 Scikit-learn ML 模块

现在我们将进而借助 Scikit-learn 训练和测试模型。

sal = pd.read_csv('data/sal.csv',header=0, index_col=None)

X = sal[['x']]

y = sal['y']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=10)

lm = LinearRegression()

lm.fit(X_train,y_train)

经过训练的模型将被序列化成输出目录中的 pickle 文件。Azure ML 将输出目录的内容自动拷贝到云端。

filename = 'outputs/sal_model.pkl'

joblib.dump(lm, filename)

不妨记录训练作业的斜率、截距和结束时间,从而完成试验。

run.log('Intercept :', lm.intercept_)

run.log('Slope :', lm.coef_[0])

run.log("Experiment end time", str(datetime.datetime.now()))

run.complete()

我们可以通过 Azure Dashboard 来跟踪度量指标和执行时间。

注册和加载经过训练的模型

每当我们冻结模型,它可以用独特的版本向 Azure ML 注册。这让我们能够在加载时在不同的模型之间轻松切换。

不妨将 SDK 指向 PKL 文件的位置,注册来自上述训练作业的工资模型。我们还将一些额外的元数据以标签这种形式添加到模型中。

model = Model.register(model_path = "outputs/sal_model.pkl",

model_name = "sal_model",

tags = {"key": "1"},

description = "Salary Prediction",

workspace = ws)

检查 Workspace 的 Models 部分,确保我们的模型已注册。

是时候将模型打包成容器映像(到时作为 Web 服务来公开)并部署的时候了。

为了创建容器映像,我们需要将模型所需的环境告诉 Azure ML。然而,我们传递一段 Python 脚本,该脚本含有基于入站数据点来预测数值的代码。

Azure ML API 为两者提供了便利的方法。不妨先创建环境文件 salenv.yaml,该文件告诉运行时环境在容器映像中添加 Scikit-learn。

salenv = CondaDependencies()

salenv.add_conda_package("scikit-learn")

with open("salenv.yml","w") as f:

f.write(salenv.serialize_to_string())

with open("salenv.yml","r") as f:

print(f.read())

下列代码片段从 Jupyter Notebook 来执行时,创建一个名为 score.py 的文件,该文件含有模型的推理逻辑。

%%writefile score.py

import json

import numpy as np

import os

import pickle

from sklearn.externals import joblib

from sklearn.linear_model import LogisticRegression

from azureml.core.model import Model

def init():

global model

# retrieve the path to the model file using the model name

model_path = Model.get_model_path('sal_model')

model = joblib.load(model_path)

def run(raw_data):

data = np.array(json.loads(raw_data)['data'])

# make prediction

y_hat = model.predict(data)

return json.dumps(y_hat.tolist())

现在将推理文件和环境配置传递给映像,从而将各点连起来。

%%time

image_config = ContainerImage.image_configuration(execution_script="score.py",

runtime="python",

conda_file="salenv.yml")

这最终会创建将出现在 Workspace 的 Images 部分中的容器映像。

我们都已准备创建定义目标环境的部署配置,并将它作为托管在 Azure Container Instance 的 Web 服务来运行。我们还决定选择 AKS 或物联网边缘环境作为部署目标。

aciconfig = AciWebservice.deploy_configuration(cpu_cores=1,

memory_gb=1,

tags={"data": "Salary", "method" : "sklearn"},

description='Predict Stackoverflow Salary')

service = Webservice.deploy_from_model(workspace=ws,

name='salary-svc',

deployment_config=aciconfig,

models=[model],

image_config=image_config)

service.wait_for_deployment(show_output=True)

Azure Resource Group现在有一个为模型运行推理的 Azure Container Instance。

我们可以从下面这个方法获得推理服务的 URL:

print(service.scoring_uri)

现在通过 CURL 来调用 Web 服务。我们可以从同一个 Jupyter Notebook 来做到这一点。

你可以从 Github 代码库(https://github.com/janakiramm/azureml-tutorial)来访问数据集和 Jupyter Notebook。

这种方法的独特之处在于,我们可以从在 Jupyter Notebook 里面运行的 Python 内核来执行所有任务。开发人员可以利用代码完成训练和部署 ML 模型所需的各项任务。这正是使用诸如 ML Service 之类的 ML PaaS 具有的好处。

原文标题:Build and Deploy a Machine Learning Model with Azure ML Service,作者:Janakiram MSV

更多AI干货、资讯及福利,尽在AI推手!



标签:商用办公 

LecVideo