Share via


使用 Azure Cache for Redis 將機器學習模型部署至 Azure Functions

在本文中,您會使用 Azure Cache for Redis 執行個體,將模型從 Azure Machine Learning 部署為 Azure Functions 中的函數應用程式。

Azure Cache for Redis 高效能且可調整。 與 Azure Machine Learning 模型配對時,您在應用程式中會獲得低延遲和高輸送量。 快取會很有幫助的一些案例:在推斷資料以及對於實際模型推斷結果時。 在任一案例中,中繼資料或結果會儲存在記憶體中,這會導致效能增加。

注意

雖然 Azure Machine Learning 和 Azure Functions 已普遍可用,但將 Machine Learning 服務中的模型封裝至 Functions 的能力仍處於預覽階段。

必要條件

重要

本文中的程式碼片段假設您已設定下列變數:

  • ws - 您的 Azure Machine Learning 工作區。
  • model - 將部署的登錄模型。
  • inference_config - 模型的推斷設定。

如需設定這些變數的詳細資訊,請參閱使用 Azure Machine Learning 部署模型

建立 Azure Cache for Redis 執行個體

您能夠使用基本、標準或進階版快取執行個體將機器學習模型部署到 Azure Functions。 若要建立快取執行個體,請遵循下列步驟。

  1. 移至 Azure 入口網站首頁或開啟資訊看板功能表,然後選取 [建立資源]

  2. 在 [新增] 頁面上選取 [資料庫],然後選取 [Azure Cache for Redis]

    Select Azure Cache for Redis.

  3. 在 [新的 Redis 快取] 頁面上,設定新快取的設定。

    設定 建議的值 描述
    DNS 名稱 輸入全域唯一名稱。 快取名稱必須是介於 1 到 63 個字元之間的字串。 字串只能包含數字、字母或連字號。 名稱的開頭和結尾必須是數字或字母,且不可包含連續的連字號。 快取執行個體的主機名稱將為 <DNS 名稱>.redis.cache.windows.net
    訂用帳戶 下拉並選取您的訂用帳戶。 這個新的 Azure Cache for Redis 執行個體建立所在的訂用帳戶。
    資源群組 下拉並選取資源群組,或選取 [新建] 並輸入新的資源群組名稱。 用來建立快取和其他資源的資源群組名稱。 將所有的應用程式資源放在一個資源群組中,您將可輕鬆地一併管理或刪除這些資源。
    地點 下拉並選取位置。 選取其他將使用快取的服務附近的區域
    定價層 下拉並選取 定價層 快取的可用大小、效能和功能取決於定價層。 如需詳細資訊,請參閱 Azure Cache for Redis 概觀
  4. 選取 [網路] 索引標籤,或選取頁面底部的 [網路] 按鈕。

  5. 在 [網路功能] 索引標籤中,選取您的連線方法。

  6. 選取 [下一步: 進階] 索引標籤,或選取頁面底部的 [下一步: 進階] 按鈕。

  7. 在基本或標準快取執行個體的 [進階] 索引標籤中,如果您想要啟用非 TLS 連接埠,請選取啟用切換。

  8. 在高階快取執行個體的 [進階] 索引標籤中,設定非 TLS 連接埠、叢集和資料持續性的設定。

  9. 選取 [下一步: 標記] 索引標籤,或選取頁面底部的 [下一步: 標記] 按鈕。

  10. 在 [標記] 索引標籤中,如果您想要分類資源,可以選擇性地輸入名稱和值。

  11. 選取 [檢閱 + 建立]。 您會移至 [檢閱 + 建立] 索引標籤,Azure 會在其中驗證您的設定。

  12. 出現綠色的「通過驗證」訊息之後,請選取 [建立]

建立快取需要一些時間。 您可以在 Azure Cache for Redis 的 [概觀] 頁面上監視進度。 當 [狀態] 顯示為 [執行中] 時,表示快取已可供使用。

準備開始部署

在部署之前,您必須定義以 Web 服務形式執行模型所需的內容。 下列清單描述部署所需的核心項目:

  • 輸入腳本。 此腳本會接受要求,使用模型對要求進行評分,並傳回結果。

    重要

    輸入腳本為您的模型所專用;其必須了解傳入要求資料的格式、您的模型所預期的資料格式,以及傳回用戶端的資料格式。

    如果要求資料的格式無法供您的模型使用,腳本可以將其轉換成可接受的格式。 也可能會先轉換回應,然後再將回應傳回給用戶端。

    依預設,封裝函式時,會將輸入視為文字。 如果您有興趣 (針對 Blob 觸發程序的執行個體) 使用輸入的原始位元組,您應該使用 AMLRequest 以接受未經處理資料

針對 run 函式,請確定其會連線到 Redis 端點。

import json
import numpy as np
import os
import redis
from sklearn.externals import joblib

def init():
    global model
    global azrediscache
    azrediscache = redis.StrictRedis(host='<host_url>', port=6380, password="<access_key>", ssl=True)
    model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'sklearn_mnist_model.pkl')
    model = joblib.load(model_path)

@input_schema('data', NumpyParameterType(input_sample))
@output_schema(NumpyParameterType(output_sample))
def run(data):
    try:
        input = azrediscache.get(data)
        result = model.predict(input)
        data = np.array(json.loads(data))
        result = model.predict(data)
        # You can return any data type, as long as it is JSON serializable.
        return result.tolist()
    except Exception as e:
        error = str(e)
        return error

如需關於輸入腳本的詳細資訊,請參閱定義評分程式碼。

  • 相依性,例如執行輸入腳本或模型所需的協助程式指令碼 或 Python/Conda 套件

這些實體會封裝成推斷設定。 推斷設定會參考輸入指令碼和其他相依性。

重要

建立與 Azure Functions 搭配使用的推斷設定時,您必須使用環境物件。 請注意,如果您要定義自訂環境,必須將版本 >= 1.0.45 的 azureml-defaults 新增為 pip 相依性。 此套件包含將模型裝載為 Web 服務所需的功能。 下列範例示範如何建立環境物件,並將其與推斷設定搭配使用:

from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies

# Create an environment and add conda dependencies to it
myenv = Environment(name="myenv")
# Enable Docker based environment
myenv.docker.enabled = True
# Build conda dependencies
myenv.python.conda_dependencies = CondaDependencies.create(conda_packages=['scikit-learn'],
                                                           pip_packages=['azureml-defaults', 'redis'])
inference_config = InferenceConfig(entry_script="score.py", environment=myenv)

如需環境的詳細資訊,請參閱建立和管理用於定型和部署的環境

如需推斷設定的詳細資訊,請參閱使用 Azure Machine Learning 部署模型

重要

部署至函式時,您不需要建立部署設定

安裝 SDK 預覽套件以取得函式支援

若要建立 Azure Functions 的套件,您必須安裝 SDK 預覽套件。

pip install azureml-contrib-functions

建立映像

若要建立部署至 Azure Functions 的 Docker 映像,請使用 azureml.contrib.functions.package,或您所想要使用觸發程序的特定套件函式。 下列程式碼片段示範如何使用模型和推斷設定中的 HTTP 觸發程序來建立新套件:

注意

程式碼片段假設 model 包含已登錄的模型,且該 inference_config 包含推斷環境的設定。 如需詳細資訊,請參閱使用 Azure Machine Learning 部署模型

from azureml.contrib.functions import package
from azureml.contrib.functions import HTTP_TRIGGER
model_package = package(ws, [model], inference_config, functions_enabled=True, trigger=HTTP_TRIGGER)
model_package.wait_for_creation(show_output=True)
# Display the package location/ACR path
print(model_package.location)

show_output=True 時,會顯示 Docker 建置程序的輸出。 程序完成後,會在您工作區的 Azure Container Registry 中建立映像。 建立映像之後,就會顯示 Azure Container Registry 中的位置。 傳回的位置格式為 <acrinstance>.azurecr.io/package@sha256:<imagename>

注意

函式的封裝目前支援 HTTP 觸發程序、Blob 觸發程序和服務匯流排觸發程序。 如需觸發程序的詳細資訊,請參閱 Azure Functions 繫結

重要

儲存位置資訊,因為會在部署映像時使用該資訊。

將映像部署為 Web 應用程式

  1. 使用下列命令來取得包含映像的 Azure Container Registry 登入認證。 將 <myacr> 取代為先前從 package.location 傳回的值:

    az acr credential show --name <myacr>
    

    此命令的輸出類似下列 JSON 文件:

    {
    "passwords": [
        {
        "name": "password",
        "value": "abcdefghijklmmopqrstuv1234567890"
        },
        {
        "name": "password2",
        "value": "1234567890abcdefghijklmmopqrstuv"
        }
    ],
    "username": "charlie.roy"
    }
    

    複製使用者名稱的值,和其中一組密碼

  2. 如果您目前沒有可部署服務的資源群組或 App Service 方案,下列命令會示範建立兩者的方式:

    az group create --name myresourcegroup --location "West Europe"
    az appservice plan create --name myplanname --resource-group myresourcegroup --sku B1 --is-linux
    

    在此範例中,會使用 Linux 基本定價層 (--sku B1)。

    重要

    Azure Machine Learning 所建立的映像會使用 Linux,因此您必須使用 --is-linux 參數。

  3. 建立用於 Web 作業儲存體的儲存體帳戶,並取得其連接字串。 將 <webjobStorage> 取代為您要使用的名稱。

    az storage account create --name <webjobStorage> --location westeurope --resource-group myresourcegroup --sku Standard_LRS
    
    az storage account show-connection-string --resource-group myresourcegroup --name <webJobStorage> --query connectionString --output tsv
    
  4. 若要建立函數應用程式,請使用下列命令。 將 <app-name> 取代為您要使用的名稱。 將 <acrinstance><imagename> 取代為先前傳回之 package.location 的值。 將 <webjobStorage> 取代為先前步驟中的儲存體帳戶名稱:

    az functionapp create --resource-group myresourcegroup --plan myplanname --name <app-name> --deployment-container-image-name <acrinstance>.azurecr.io/package:<imagename> --storage-account <webjobStorage>
    

    重要

    此時,會建立函數應用程式。 不過,由於您尚未提供 HTTP 觸發程序的連接字串,或包含該映像的 Azure Container Registry 的認證,因此,函數應用程式不是作用中狀態。 在接下來的步驟中,您會提供容器登錄的連接字串和驗證資訊。

  5. 若要使用存取容器登錄所需的認證來提供函數應用程式,請使用下列命令。 將 <app-name> 取代為函數應用程式的名稱。 請將 <acrinstance><imagetag> 取代為先前步驟中來自 AZ CLI 呼叫的值。 將 <username><password> 取代為先前擷取的 ACR 登入資訊:

    az functionapp config container set --name <app-name> --resource-group myresourcegroup --docker-custom-image-name <acrinstance>.azurecr.io/package:<imagetag> --docker-registry-server-url https://<acrinstance>.azurecr.io --docker-registry-server-user <username> --docker-registry-server-password <password>
    

    此命令會傳回類似以下 JSON 文件的資訊:

    [
    {
        "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
        "slotSetting": false,
        "value": "false"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_URL",
        "slotSetting": false,
        "value": "[server-name].azurecr.io"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_USERNAME",
        "slotSetting": false,
        "value": "[username]"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_PASSWORD",
        "slotSetting": false,
        "value": null
    },
    {
        "name": "DOCKER_CUSTOM_IMAGE_NAME",
        "value": "DOCKER|[server-name].azurecr.io/package:20190827195524"
    }
    ]
    

此時,函數應用程式會開始載入映像。

重要

可能需要幾分鐘的時間才會載入映像。 您可以使用 Azure 入口網站來監視進度。

測試 Azure Functions HTTP 觸發程序

我們現在將執行並測試我們的 Azure Functions HTTP 觸發程序。

  1. 移至 Azure 入口網站中的函數應用程式。
  2. 在 [開發人員] 下,選取 [程式碼 + 測試]
  3. 在右側,選取 [輸入] 索引標籤。
  4. 在 [執行] 按鈕上選取,以測試 Azure Functions HTTP 觸發程序。

您現在已使用 Azure Cache for Redis 執行個體,將模型從 Azure Machine Learning 成功部署為函數應用程式。 瀏覽至下一節中的連結,以深入了解 Azure Cache for Redis。

清除資源

如果您準備繼續進行下一個教學課程,則可以保留在本快速入門中所建立的資源,並重複加以使用。

否則,如果您已完成快速入門,您可以將在此快速入門中建立的 Azure 資源刪除,以避免衍生費用。

重要

刪除資源群組是無法回復的動作。 當您刪除資源群組時,其中包含的所有資源都將永久刪除。 請確定您不會不小心刪除錯誤的資源群組或資源。 如果您是在包含需保留資源的現有資源群組內部,建立用來裝載此範例的資源,則可以個別刪除左側的每個資源,而不必刪除整個資源群組。

刪除資源群組

  1. 登入 Azure 入口網站,然後選取 [資源群組]

  2. 在 [依名稱篩選...] 方塊中,並輸入您的資源群組名稱。 在資源群組的結果清單中,選取 ...,然後選取 [刪除資源群組]

系統將會要求您確認是否刪除資源群組。 輸入您的資源群組名稱以進行確認,然後選取 [刪除]

不久後,系統便會刪除該資源群組及其所有的資源。

下一步