用Azure ML Service構(gòu)建和部署機(jī)器學(xué)習(xí)模型
譯文【51CTO.com快譯】我們?cè)诒窘坛讨袑?gòu)建和部署一個(gè)機(jī)器模型,以便利用Stackoverflow數(shù)據(jù)集預(yù)測(cè)工資。 看完本文后,你能夠調(diào)用充分利用REST的Web服務(wù)來(lái)獲得預(yù)測(cè)結(jié)果。
由于目的是演示工作流程,我們將使用一個(gè)簡(jiǎn)單的雙列數(shù)據(jù)集進(jìn)行試驗(yàn),該數(shù)據(jù)集包含多年的工作經(jīng)驗(yàn)和薪水。想了解數(shù)據(jù)集的詳細(xì)信息,參閱我之前介紹線性回歸的那篇文章。
先決條件
1.Python和Scikit-learn方面的基礎(chǔ)知識(shí)
2.有效的微軟Azure訂閱
3.Anaconda或Miniconda
配置開(kāi)發(fā)環(huán)境
使用Azure ML SDK配置一個(gè)虛擬環(huán)境。 運(yùn)行以下命令以安裝Python SDK,并啟動(dòng)Jupyter Notebook。從Jupyter啟動(dòng)一個(gè)新的Python 3內(nèi)核。
- $ conda create -n aml -y Python=3.6
- $ conda activate aml
- $ conda install nb_conda
- $ pip install azureml-sdk[notebooks]
- $ jupyter notebook
初始化Azure ML環(huán)境
先導(dǎo)入所有必要的Python模塊,包括標(biāo)準(zhǔn)的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
我們需要?jiǎng)?chuàng)建一個(gè)Azure ML Workspace,該工作區(qū)充當(dāng)我們這次試驗(yàn)的邏輯邊界。Workspace創(chuàng)建用于存儲(chǔ)數(shù)據(jù)集的Storage Account、存儲(chǔ)秘密信息的Key Vault、維護(hù)映像中心的Container Registry以及記錄度量指標(biāo)的Application Insights。
別忘了把占位符換成你的訂閱ID。
- ws = Workspace.create(name='salary',
- subscription_id='',
- resource_group='mi2',
- create_resource_group=True,
- location='southeastasia'
- )
幾分鐘后,我們會(huì)看到Workspace里面創(chuàng)建的資源。
現(xiàn)在我們可以創(chuàng)建一個(gè)Experiment開(kāi)始記錄度量指標(biāo)。由于我們沒(méi)有許多參數(shù)要記錄,于是獲取訓(xùn)練過(guò)程的啟始時(shí)間。
- exp = Experiment(workspace=ws, name='salexp')
- run = exp.start_logging()
- run.log("Experiment start time", str(datetime.datetime.now()))
訓(xùn)練和測(cè)試Scikit-learn ML模塊
現(xiàn)在我們將進(jìn)而借助Scikit-learn訓(xùn)練和測(cè)試模型。
- 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)
經(jīng)過(guò)訓(xùn)練的模型將被序列化成輸出目錄中的pickle文件。Azure ML將輸出目錄的內(nèi)容自動(dòng)拷貝到云端。
- filename = 'outputs/sal_model.pkl'
- joblib.dump(lm, filename)
不妨記錄訓(xùn)練作業(yè)的斜率、截距和結(jié)束時(shí)間,從而完成試驗(yàn)。
- run.log('Intercept :', lm.intercept_)
- run.log('Slope :', lm.coef_[0])
- run.log("Experiment end time", str(datetime.datetime.now()))
- run.complete()
我們可以通過(guò)Azure Dashboard來(lái)跟蹤度量指標(biāo)和執(zhí)行時(shí)間。
注冊(cè)和加載經(jīng)過(guò)訓(xùn)練的模型
每當(dāng)我們凍結(jié)模型,它可以用獨(dú)特的版本向Azure ML注冊(cè)。這讓我們能夠在加載時(shí)在不同的模型之間輕松切換。
不妨將SDK指向PKL文件的位置,注冊(cè)來(lái)自上述訓(xùn)練作業(yè)的工資模型。我們還將一些額外的元數(shù)據(jù)以標(biāo)簽這種形式添加到模型中。
- model = Model.register(model_path = "outputs/sal_model.pkl",
- model_name = "sal_model",
- tags = {"key": "1"},
- description = "Salary Prediction",
- workspace = ws)
檢查Workspace的Models部分,確保我們的模型已注冊(cè)。
是時(shí)候?qū)⒛P痛虬扇萜饔诚?到時(shí)作為Web服務(wù)來(lái)公開(kāi))并部署的時(shí)候了。
為了創(chuàng)建容器映像,我們需要將模型所需的環(huán)境告訴Azure ML。然而,我們傳遞一段Python腳本,該腳本含有基于入站數(shù)據(jù)點(diǎn)來(lái)預(yù)測(cè)數(shù)值的代碼。
Azure ML API為兩者提供了便利的方法。不妨先創(chuàng)建環(huán)境文件salenv.yaml,該文件告訴運(yùn)行時(shí)環(huán)境在容器映像中添加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來(lái)執(zhí)行時(shí),創(chuàng)建一個(gè)名為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())
現(xiàn)在將推理文件和環(huán)境配置傳遞給映像,從而將各點(diǎn)連起來(lái)。
- %%time
- image_config = ContainerImage.image_configuration(execution_script="score.py",
- runtime="python",
- conda_file="salenv.yml")
這最終會(huì)創(chuàng)建將出現(xiàn)在Workspace的Images部分中的容器映像。
我們都已準(zhǔn)備創(chuàng)建定義目標(biāo)環(huán)境的部署配置,并將它作為托管在Azure Container Instance的Web服務(wù)來(lái)運(yùn)行。我們還決定選擇AKS或物聯(lián)網(wǎng)邊緣環(huán)境作為部署目標(biāo)。
- 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現(xiàn)在有一個(gè)為模型運(yùn)行推理的Azure Container Instance。
我們可以從下面這個(gè)方法獲得推理服務(wù)的URL:
- print(service.scoring_uri)
現(xiàn)在通過(guò)cURL來(lái)調(diào)用Web服務(wù)。我們可以從同一個(gè)Jupyter Notebook來(lái)做到這一點(diǎn)。
你可以從Github代碼庫(kù)來(lái)訪問(wèn)數(shù)據(jù)集和Jupyter Notebook。
這種方法的獨(dú)特之處在于,我們可以從在Jupyter Notebook里面運(yùn)行的Python內(nèi)核來(lái)執(zhí)行所有任務(wù)。開(kāi)發(fā)人員可以利用代碼完成訓(xùn)練和部署ML模型所需的各項(xiàng)任務(wù)。這正是使用諸如ML Service之類的ML PaaS具有的好處。
原文標(biāo)題:Build and Deploy a Machine Learning Model with Azure ML Service,作者:Janakiram MSV
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】