使用 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 的能力仍處於預覽階段。
必要條件
- Azure 訂用帳戶 - 建立免費帳戶。
- Azure Machine Learning 工作區。 如需詳細資訊,請參閱建立工作區一文。
- Azure CLI。
- 在您的工作區中登錄的已定型機器學習模型。 如果您沒有模型,請使用映像分類教學課程:定型模型來定型和登錄模型。
重要
本文中的程式碼片段假設您已設定下列變數:
ws
- 您的 Azure Machine Learning 工作區。model
- 將部署的登錄模型。inference_config
- 模型的推斷設定。
如需設定這些變數的詳細資訊,請參閱使用 Azure Machine Learning 部署模型。
建立 Azure Cache for Redis 執行個體
您能夠使用基本、標準或進階版快取執行個體將機器學習模型部署到 Azure Functions。 若要建立快取執行個體,請遵循下列步驟。
移至 Azure 入口網站首頁或開啟資訊看板功能表,然後選取 [建立資源]。
在 [新增] 頁面上選取 [資料庫],然後選取 [Azure Cache for Redis]。
在 [新的 Redis 快取] 頁面上,設定新快取的設定。
設定 建議的值 描述 DNS 名稱 輸入全域唯一名稱。 快取名稱必須是介於 1 到 63 個字元之間的字串。 字串只能包含數字、字母或連字號。 名稱的開頭和結尾必須是數字或字母,且不可包含連續的連字號。 快取執行個體的主機名稱將為 <DNS 名稱>.redis.cache.windows.net。 訂用帳戶 下拉並選取您的訂用帳戶。 這個新的 Azure Cache for Redis 執行個體建立所在的訂用帳戶。 資源群組 下拉並選取資源群組,或選取 [新建] 並輸入新的資源群組名稱。 用來建立快取和其他資源的資源群組名稱。 將所有的應用程式資源放在一個資源群組中,您將可輕鬆地一併管理或刪除這些資源。 地點 下拉並選取位置。 選取其他將使用快取的服務附近的區域。 定價層 下拉並選取 定價層。 快取的可用大小、效能和功能取決於定價層。 如需詳細資訊,請參閱 Azure Cache for Redis 概觀。 選取 [網路] 索引標籤,或選取頁面底部的 [網路] 按鈕。
在 [網路功能] 索引標籤中,選取您的連線方法。
選取 [下一步: 進階] 索引標籤,或選取頁面底部的 [下一步: 進階] 按鈕。
在基本或標準快取執行個體的 [進階] 索引標籤中,如果您想要啟用非 TLS 連接埠,請選取啟用切換。
在高階快取執行個體的 [進階] 索引標籤中,設定非 TLS 連接埠、叢集和資料持續性的設定。
選取 [下一步: 標記] 索引標籤,或選取頁面底部的 [下一步: 標記] 按鈕。
在 [標記] 索引標籤中,如果您想要分類資源,可以選擇性地輸入名稱和值。
選取 [檢閱 + 建立]。 您會移至 [檢閱 + 建立] 索引標籤,其中 Azure 會驗證您的設定。
出現綠色的「通過驗證」訊息之後,請選取 [建立]。
建立快取需要一些時間。 您可以在 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 應用程式
使用下列命令來取得包含映像的 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" }
複製使用者名稱的值,和其中一組密碼。
如果您目前沒有可部署服務的資源群組或 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
參數。建立用於 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
若要建立函數應用程式,請使用下列命令。 將
<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 的認證,因此,函數應用程式不是作用中狀態。 在接下來的步驟中,您會提供容器登錄的連接字串和驗證資訊。
若要使用存取容器登錄所需的認證來提供函數應用程式,請使用下列命令。 將
<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 觸發程序。
- 移至 Azure 入口網站中的函數應用程式。
- 在 [開發人員] 下,選取 [程式碼 + 測試]。
- 在右側,選取 [輸入] 索引標籤。
- 在 [執行] 按鈕上選取,以測試 Azure Functions HTTP 觸發程序。
您現在已使用 Azure Cache for Redis 執行個體,將模型從 Azure Machine Learning 成功部署為函數應用程式。 瀏覽至下一節中的連結,以深入了解 Azure Cache for Redis。
清除資源
如果您準備繼續進行下一個教學課程,則可以保留在本快速入門中所建立的資源,並重複加以使用。
否則,如果您已完成快速入門,您可以將在此快速入門中建立的 Azure 資源刪除,以避免衍生費用。
重要
刪除資源群組是無法回復的動作。 當您刪除資源群組時,其中包含的所有資源都將永久刪除。 請確定您不會不小心刪除錯誤的資源群組或資源。 如果您是在包含需保留資源的現有資源群組內部,建立用來裝載此範例的資源,則可以個別刪除左側的每個資源,而不必刪除整個資源群組。
刪除資源群組
登入 Azure 入口網站,然後選取 [資源群組]。
在 [依名稱篩選...] 方塊中,並輸入您的資源群組名稱。 在資源群組的結果清單中,選取 ...,然後選取 [刪除資源群組]。
系統將會要求您確認是否刪除資源群組。 輸入您的資源群組名稱以進行確認,然後選取 [刪除]。
不久後,系統便會刪除該資源群組及其所有的資源。
下一步
- 深入了解 Azure Cache for Redis
- 了解如何在函式文件中設定您的函數應用程式。
- API 參考
- 建立可使用 Azure Cache for Redis 的 Python 應用程式