Share via


教學課程:使用 Jupyter Notebook 範例將影像分類模型定型並進行部署

適用於:Python SDK azureml v1

在本教學課程中,您會在遠端計算資源上定型機器學習模型。 您會在 Python Jupyter Notebook 中使用 Azure 機器學習 的訓練和部署工作流程。 然後,您可以使用 Notebook 作為範本,以自己的資料將您自己的機器學習服務模型定型。

本教學課程可讓您使用 MNIST 資料集,並搭配 scikit-learn 與 Azure Machine Learning 定型簡單的羅吉斯迴歸。 MNIST 是一種由 70,000 張灰階影像組成的熱門資料集。 每一張影像都是 28 x 28 像素的手寫數字,代表從 0 到 9 的數字。 目標是要建立多類別分類器,來識別特定影像代表的數字。

了解如何採取下列動作:

  • 下載資料集並查看資料。
  • 使用 MLflow 將影像分類模型定型並記錄計量。
  • 部署模型以執行即時推斷。

必要條件

從您的工作區執行筆記本

Azure 機器學習 在您的工作區中包含雲端筆記本伺服器,以取得無安裝和預先設定的體驗。 如果您想要控制您的環境、套件和相依性,請使用您自己的環境

複製 Notebook 資料夾

您將完成下列實驗設定,並在 Azure Machine Learning 工作室中執行步驟。 此整合介面包含機器學習工具,可為所有技能等級的資料科學從業人員執行資料科學案例。

  1. 登入 Azure Machine Learning Studio

  2. 選取訂用帳戶與您建立的工作區。

  3. 選取左側的 [筆記本]

  4. 選取頂端的 [範例] 索引標籤。

  5. 開啟 SDK v1 資料夾。

  6. 選取 tutorials 資料夾右側的 [...] 按鈕,然後選取 [複製]

    顯示複製教學課程資料夾的螢幕快照。

  7. 資料夾清單會顯示每位存取工作區的使用者。 選取您的資料夾,以將 tutorials 資料夾複製到該處。

開啟複製的筆記本

  1. 在 [使用者檔案] 區段中開啟已複製的 tutorials 資料夾。

  2. tutorials/compute-instance-quickstarts/quickstart-azureml-in-10mins 資料夾中選取 quickstart-azureml-in-10mins.ipynb 檔案。

    顯示 [開啟教學課程] 資料夾的螢幕快照。

安裝套件

計算執行個體執行且核心出現之後,請新增程式碼資料格以安裝本教學課程所需的套件。

  1. 在筆記本頂端,新增程式碼資料格。 新增筆記本程式代碼儲存格的螢幕快照。

  2. 將下列內容新增至資料格,然後使用 [執行] 工具或使用 Shift+Enter 來執行資料格。

    %pip install scikit-learn==0.22.1
    %pip install scipy==1.5.2
    

您可能會看到一些安裝警告。 請放心忽略這項錯誤訊息。

執行該筆記本

如果您想要在自己的本機環境中使用此教學課程,也可以在 GitHub 上取得此教學課程和隨附的 utils.py 檔案。 如果您未使用計算執行個體,則請將 %pip install azureml-sdk[notebooks] azureml-opendatasets matplotlib 新增至上述安裝。

重要

本文的其餘部分包含與您在 Notebook 中所見相同的內容。

如果您想要在閱讀時執行程式碼,請立即切換至 Jupyter Notebook。 若要在 Notebook 中執行單一程式碼資料格,請按一下程式碼資料格,然後按 Shift+Enter。 或者,從頂端工具列中選擇 [全部執行],以執行整個 Notebook。

匯入資料

將模型定型之前,您需要了解用來進行定型的資料。 在本節中,請了解如何:

  • 下載 MNIST 資料集
  • 顯示一些範例影像

您可以使用 Azure 開放資料集來取得原始 MNIST 資料檔。 Azure 開放資料集是策劃的公用資料集,您可以使用這些公用資料集,將案例專有的功能新增至機器學習解決方案,以獲得更好的模型。 每個資料集都有對應的類別 (在此案例中為 MNIST),來以不同的方式擷取資料。

import os
from azureml.opendatasets import MNIST

data_folder = os.path.join(os.getcwd(), "/tmp/qs_data")
os.makedirs(data_folder, exist_ok=True)

mnist_file_dataset = MNIST.get_file_dataset()
mnist_file_dataset.download(data_folder, overwrite=True)

查看資料

將壓縮的檔案載入到 numpy 陣列。 然後使用 matplotlib 來繪製 30 個來自資料集的隨機影像,並且在其上加上標籤。

請注意,此步驟需要 load_data 包含在檔案中的 utils.py 函式。 此檔案會放在與此 Notebook 相同的資料夾中。 load_data 函式會直接將壓縮檔案剖析為 numpy 陣列。

from utils import load_data
import matplotlib.pyplot as plt
import numpy as np
import glob


# note we also shrink the intensity values (X) from 0-255 to 0-1. This helps the model converge faster.
X_train = (
    load_data(
        glob.glob(
            os.path.join(data_folder, "**/train-images-idx3-ubyte.gz"), recursive=True
        )[0],
        False,
    )
    / 255.0
)
X_test = (
    load_data(
        glob.glob(
            os.path.join(data_folder, "**/t10k-images-idx3-ubyte.gz"), recursive=True
        )[0],
        False,
    )
    / 255.0
)
y_train = load_data(
    glob.glob(
        os.path.join(data_folder, "**/train-labels-idx1-ubyte.gz"), recursive=True
    )[0],
    True,
).reshape(-1)
y_test = load_data(
    glob.glob(
        os.path.join(data_folder, "**/t10k-labels-idx1-ubyte.gz"), recursive=True
    )[0],
    True,
).reshape(-1)


# now let's show some randomly chosen images from the traininng set.
count = 0
sample_size = 30
plt.figure(figsize=(16, 6))
for i in np.random.permutation(X_train.shape[0])[:sample_size]:
    count = count + 1
    plt.subplot(1, sample_size, count)
    plt.axhline("")
    plt.axvline("")
    plt.text(x=10, y=-10, s=y_train[i], fontsize=18)
    plt.imshow(X_train[i].reshape(28, 28), cmap=plt.cm.Greys)
plt.show()

程式代碼會顯示一組隨機影像及其標籤,如下所示:

具有標籤的影像範例。

使用 MLflow 將模型定型並記錄計量

使用下列程式代碼將模型定型。 此程式代碼會使用 MLflow 自動記錄來追蹤計量和記錄模型成品。

您會使用 SciKit Learn 架構中的 LogisticRegression 分類器來分類資料。

注意

模型定型大約需要 2 分鐘才能完成。

# create the model
import mlflow
import numpy as np
from sklearn.linear_model import LogisticRegression
from azureml.core import Workspace

# connect to your workspace
ws = Workspace.from_config()

# create experiment and start logging to a new run in the experiment
experiment_name = "azure-ml-in10-mins-tutorial"

# set up MLflow to track the metrics
mlflow.set_tracking_uri(ws.get_mlflow_tracking_uri())
mlflow.set_experiment(experiment_name)
mlflow.autolog()

# set up the Logistic regression model
reg = 0.5
clf = LogisticRegression(
    C=1.0 / reg, solver="liblinear", multi_class="auto", random_state=42
)

# train the model
with mlflow.start_run() as run:
    clf.fit(X_train, y_train)

檢視實驗

在 Azure Machine Learning 工作室的左側功能表中,選取 [作業],然後選取您的作業 (azure-ml-in10-mins-tutorial)。 作業聚集了指定指令碼或一段程式碼的多次執行。 多個作業可以分組在一起,做為實驗。

回合的資訊會儲存在該作業底下。 如果您提交作業時名稱不存在,如果您選取執行,您會看到包含計量、記錄、說明等的各種索引標籤。

使用模型登錄對模型進行版本控制

您可以使用模型註冊,以在工作區中儲存模型並設定其版本。 已註冊的模型可以用名稱和版本來識別。 每次您使用與既有名稱相同的名稱註冊模型時,登錄會遞增版本。 下列程式碼會註冊您在上面所定型的模型並設定其版本。 執行下列程式代碼數據格之後,您會在登錄中選取左側功能表中的 [模型],以在 Azure Machine Learning 工作室 中看到模型。

# register the model
model_uri = "runs:/{}/model".format(run.info.run_id)
model = mlflow.register_model(model_uri, "sklearn_mnist_model")

部署模型以執行即時推斷

在本節中,瞭解如何部署模型,讓應用程式可以透過 REST 取用模型(推斷)。

建立部署設定

程式碼資料格會取得策展的環境,以指定要裝載模型所需的所有相依性 (例如 scikit-learn 之類的套件)。 此外,您也會建立部署設定,以指定要裝載模型所需的計算數量。 在此情況下,計算具有 1CPU 和 1 GB 記憶體。

# create environment for the deploy
from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies
from azureml.core.webservice import AciWebservice

# get a curated environment
env = Environment.get(
    workspace=ws, 
    name="AzureML-sklearn-1.0"
)
env.inferencing_stack_version='latest'

# create deployment config i.e. compute resources
aciconfig = AciWebservice.deploy_configuration(
    cpu_cores=1,
    memory_gb=1,
    tags={"data": "MNIST", "method": "sklearn"},
    description="Predict MNIST with sklearn",
)

部署模型

下一個程式碼資料格會將模型部署至 Azure 容器執行個體。

注意

部署大約需要 3 分鐘才能完成。 但可能需要更長的時間,直到它可供使用,也許只要 15 分鐘。

%%time
import uuid
from azureml.core.model import InferenceConfig
from azureml.core.environment import Environment
from azureml.core.model import Model

# get the registered model
model = Model(ws, "sklearn_mnist_model")

# create an inference config i.e. the scoring script and environment
inference_config = InferenceConfig(entry_script="score.py", environment=env)

# deploy the service
service_name = "sklearn-mnist-svc-" + str(uuid.uuid4())[:4]
service = Model.deploy(
    workspace=ws,
    name=service_name,
    models=[model],
    inference_config=inference_config,
    deployment_config=aciconfig,
)

service.wait_for_deployment(show_output=True)

上述程式代碼中所參考的評分腳本檔案可以在與這個筆記本相同的資料夾中找到,並具有兩個函式:

  1. init 函式,此函式會在服務啟動時執行一次 - 在此函式中,您通常會從登錄取得模型並設定全域變數
  2. run(data) 函式,此函式會在每次呼叫服務時執行。 在此函式中,您通常會將輸入資料格式化、執行預測,以及輸出預測的結果。

檢視端點

成功部署模型之後,您可以瀏覽至 Azure Machine Learning 工作室 左側功能表中的 [端點] 來檢視端點。 您會看到端點的狀態(狀況良好/狀況不良)、記錄和取用(應用程式如何取用模型)。

測試模型服務

您可以傳送未經處理的 HTTP 要求來測試 Web 服務,藉此測試模型。

# send raw HTTP request to test the web service.
import requests

# send a random row from the test set to score
random_index = np.random.randint(0, len(X_test) - 1)
input_data = '{"data": [' + str(list(X_test[random_index])) + "]}"

headers = {"Content-Type": "application/json"}

resp = requests.post(service.scoring_uri, input_data, headers=headers)

print("POST to url", service.scoring_uri)
print("label:", y_test[random_index])
print("prediction:", resp.text)

清除資源

如果您不會繼續使用此模型,請透過下列方式刪除模型服務:

# if you want to keep workspace and only delete endpoint (it will incur cost while running)
service.delete()

如果您想要進一步控制成本,請選取 [計算] 下拉式清單旁邊的 [停止計算] 按鈕,以停止計算執行個體。 然後,在下次需要計算執行個體時,重新將其啟動。

刪除所有內容

請使用下列步驟來刪除 Azure Machine Learning 工作區和所有計算資源。

重要

您所建立的資源可用來作為其他 Azure Machine Learning 教學課程和操作說明文章的先決條件。

如果不打算使用您建立的任何資源,請刪除以免產生任何費用:

  1. 在 Azure 入口網站中,選取最左邊的 [資源群組]

  2. 從清單中,選取您所建立的資源群組。

  3. 選取 [刪除資源群組]

    要刪除 Azure 入口網站 中資源群組之選取項目的螢幕快照。

  4. 輸入資源群組名稱。 接著選取刪除