部署模型供 Azure AI 搜尋服務使用
適用於: Python SDK azureml v1 (部分機器翻譯)
本文教您如何使用 Azure Machine Learning 來部署模型供 Azure AI 搜尋服務使用。
Azure AI 搜尋服務會對異質內容執行內容處理,使其可供人或應用程式查詢。 從 Azure Machine Learning 部署的模型可用來增強此流程。
Azure Machine Learning 可以將定型的模型部署為 Web 服務。 然後,此 Web 服務內嵌在 Azure AI 搜尋服務「技能」中,成為處理管線的一部分。
重要
本文的資訊僅適用於模型的部署。 所提供的資訊是關於支援的部署設定,可讓模型供 Azure AI 搜尋服務使用。
如需如何設定 Azure AI 搜尋服務以使用已部署模型的相關資訊,請參閱使用 Azure Machine Learning 建立和部署自訂技能教學課程。
部署模型供 Azure AI 搜尋服務使用時,部署必須符合下列需求:
- 使用 Azure Kubernetes Service 來裝載用於推斷的模型。
- 對 Azure Kubernetes Service 啟用傳輸層安全性 (TLS)。 TLS 用來保護 Azure AI 搜尋服務和已部署模型之間的 HTTPS 通訊。
- 輸入腳本必須使用
inference_schema
封裝來產生服務的 OpenAPI (Swagger) 結構描述。 - 輸入腳本也必須接受 JSON 資料作為輸入,並產生 JSON 作為輸出。
必要條件
Azure Machine Learning 工作區。 如需詳細資訊,請參閱建立工作區資源。
已安裝 Azure Machine Learning SDK 的 Python 開發環境。 如需詳細資訊,請參閱 Azure Machine Learning SDK。
已註冊的模型。
大致了解部署模型的方式和位置。
連線到您的工作區
Azure Machine Learning 工作區可集中處理您使用 Azure Machine Learning 服務時建立的所有成品。 工作區保留所有定型作業的歷程記錄,包括記錄、計量、輸出,以及指令碼的快照集。
若要連線到現有的工作區,請使用下列程式碼:
重要
此程式碼片段預期工作區組態會儲存在目前目錄或其父系目錄中。 如需詳細資訊,請參閱建立和管理 Azure Machine Learning 工作區。 如需將組態儲存至檔案的詳細資訊,請參閱建立工作區組態檔。
from azureml.core import Workspace
try:
# Load the workspace configuration from local cached inffo
ws = Workspace.from_config()
print(ws.name, ws.location, ws.resource_group, ws.location, sep='\t')
print('Library configuration succeeded')
except:
print('Workspace not found')
建立 Kubernetes 叢集
估計時間:約 20 分鐘。
Kubernetes 叢集是一組虛擬機器執行個體 (稱為節點),用來執行容器化應用程式。
當您將模型從 Azure Machine Learning 部署至 Azure Kubernetes Service 時,模型和將模型裝載為 Web 服務所需的所有資產都封裝成 Docker 容器。 然後,此容器會部署到叢集上。
下列程式碼示範如何為工作區建立新的 Azure Kubernetes Service (AKS) 叢集:
提示
您也可以將現有的 Azure Kubernetes Service 附加至 Azure Machine Learning 工作區。 如需詳細資訊,請參閱如何將模型部署至 Azure Container Service。
重要
請注意,程式碼使用 enable_ssl()
方法對叢集啟用傳輸層安全性 (TLS)。 當您打算從 Azure AI 搜尋服務使用已部署的模型時,這是必要的。
from azureml.core.compute import AksCompute, ComputeTarget
# Create or attach to an AKS inferencing cluster
# Create the provisioning configuration with defaults
prov_config = AksCompute.provisioning_configuration()
# Enable TLS (sometimes called SSL) communications
# Leaf domain label generates a name using the formula
# "<leaf-domain-label>######.<azure-region>.cloudapp.azure.com"
# where "######" is a random series of characters
prov_config.enable_ssl(leaf_domain_label = "contoso")
cluster_name = 'amlskills'
# Try to use an existing compute target by that name.
# If one doesn't exist, create one.
try:
aks_target = ComputeTarget(ws, cluster_name)
print("Attaching to existing cluster")
except Exception as e:
print("Creating new cluster")
aks_target = ComputeTarget.create(workspace = ws,
name = cluster_name,
provisioning_configuration = prov_config)
# Wait for the create process to complete
aks_target.wait_for_completion(show_output = True)
重要
只要 AKS 叢集存在,Azure 就會向您收費。 AKS 叢集使用完畢務必刪除。
如需 AKS 和 Azure Machine Learning 一起使用的詳細資訊,請參閱如何部署至 Azure Kubernetes Service。
撰寫輸入腳本
輸入腳本接收提交至 Web 服務的資料,將資料傳遞至模型,然後傳回評分結果。 下列指令碼在開始時載入模型,然後使用模型給資料評分。 此檔案有時稱為 score.py
。
提示
這是模型特定的輸入指令碼。 例如,指令碼必須知道要用於模型、資料格式等的架構。
重要
打算從 Azure AI 搜尋服務使用已部署的模型時,您必須使用 inference_schema
封裝來產生部署的結構描述。 此封裝提供裝飾項目,可讓您為使用模型執行推斷的 Web 服務,定義輸入和輸出資料格式。
from azureml.core.model import Model
from nlp_architect.models.absa.inference.inference import SentimentInference
from spacy.cli.download import download as spacy_download
import traceback
import json
# Inference schema for schema discovery
from inference_schema.schema_decorators import input_schema, output_schema
from inference_schema.parameter_types.numpy_parameter_type import NumpyParameterType
from inference_schema.parameter_types.standard_py_parameter_type import StandardPythonParameterType
def init():
"""
Set up the ABSA model for Inference
"""
global SentInference
spacy_download('en')
aspect_lex = Model.get_model_path('hotel_aspect_lex')
opinion_lex = Model.get_model_path('hotel_opinion_lex')
SentInference = SentimentInference(aspect_lex, opinion_lex)
# Use inference schema decorators and sample input/output to
# build the OpenAPI (Swagger) schema for the deployment
standard_sample_input = {'text': 'a sample input record containing some text' }
standard_sample_output = {"sentiment": {"sentence": "This place makes false booking prices, when you get there, they say they do not have the reservation for that day.",
"terms": [{"text": "hotels", "type": "AS", "polarity": "POS", "score": 1.0, "start": 300, "len": 6},
{"text": "nice", "type": "OP", "polarity": "POS", "score": 1.0, "start": 295, "len": 4}]}}
@input_schema('raw_data', StandardPythonParameterType(standard_sample_input))
@output_schema(StandardPythonParameterType(standard_sample_output))
def run(raw_data):
try:
# Get the value of the 'text' field from the JSON input and perform inference
input_txt = raw_data["text"]
doc = SentInference.run(doc=input_txt)
if doc is None:
return None
sentences = doc._sentences
result = {"sentence": doc._doc_text}
terms = []
for sentence in sentences:
for event in sentence._events:
for x in event:
term = {"text": x._text, "type":x._type.value, "polarity": x._polarity.value, "score": x._score,"start": x._start,"len": x._len }
terms.append(term)
result["terms"] = terms
print("Success!")
# Return the results to the client as a JSON document
return {"sentiment": result}
except Exception as e:
result = str(e)
# return error message back to the client
print("Failure!")
print(traceback.format_exc())
return json.dumps({"error": result, "tb": traceback.format_exc()})
如需輸入腳本的詳細資訊,請參閱部署模型的方式和位置。
定義軟體環境
環境類別用來定義服務的 Python 相依性。 其中包括模型和輸入腳本所需的相依性。 在此範例中,環境會從一般 pypi 索引及 GitHub 存放庫安裝封裝。
from azureml.core.conda_dependencies import CondaDependencies
from azureml.core import Environment
conda = None
pip = ["azureml-defaults", "azureml-monitoring",
"git+https://github.com/NervanaSystems/nlp-architect.git@absa", 'nlp-architect', 'inference-schema',
"spacy==2.0.18"]
conda_deps = CondaDependencies.create(conda_packages=None, pip_packages=pip)
myenv = Environment(name='myenv')
myenv.python.conda_dependencies = conda_deps
如需環境的詳細資訊,請參閱建立和管理用於定型和部署的環境。
定義部署設定
部署設定可定義用來執行 Web 服務的 Azure Kubernetes Service 主控環境。
提示
如果不確定部署的記憶體、CPU 或 GPU 需求,您可以使用分析來查明。 如需詳細資訊,請參閱部署模型的方式和位置。
from azureml.core.model import Model
from azureml.core.webservice import Webservice
from azureml.core.image import ContainerImage
from azureml.core.webservice import AksWebservice, Webservice
# If deploying to a cluster configured for dev/test, ensure that it was created with enough
# cores and memory to handle this deployment configuration. Note that memory is also used by
# things such as dependencies and Azure Machine Learning components.
aks_config = AksWebservice.deploy_configuration(autoscale_enabled=True,
autoscale_min_replicas=1,
autoscale_max_replicas=3,
autoscale_refresh_seconds=10,
autoscale_target_utilization=70,
auth_enabled=True,
cpu_cores=1, memory_gb=2,
scoring_timeout_ms=5000,
replica_max_concurrent_requests=2,
max_request_wait_time=5000)
如需詳細資訊,請參閱 AksService.deploy_configuration 的參考文件。
定義推斷設定
推斷設定指向輸入腳本和環境物件:
from azureml.core.model import InferenceConfig
inf_config = InferenceConfig(entry_script='score.py', environment=myenv)
如需詳細資訊,請參閱 InferenceConfig 的參考文件。
部署模型
將模型部署至 AKS 叢集,並等待模型建立服務。 在此範例中,兩個已註冊的模型會從登錄載入,然後部署至 AKS。 部署之後,部署中的 score.py
檔案載入這些模型,並用來執行推斷。
from azureml.core.webservice import AksWebservice, Webservice
c_aspect_lex = Model(ws, 'hotel_aspect_lex')
c_opinion_lex = Model(ws, 'hotel_opinion_lex')
service_name = "hotel-absa-v2"
aks_service = Model.deploy(workspace=ws,
name=service_name,
models=[c_aspect_lex, c_opinion_lex],
inference_config=inf_config,
deployment_config=aks_config,
deployment_target=aks_target,
overwrite=True)
aks_service.wait_for_deployment(show_output = True)
print(aks_service.state)
如需詳細資訊,請參閱 Model 的參考文件。
向服務發出範例查詢
下列範例使用先前程式碼區段儲存在 aks_service
變數中的部署資訊。 此變數用來取得與服務通訊所需的評分 URL 和驗證權杖:
import requests
import json
primary, secondary = aks_service.get_keys()
# Test data
input_data = '{"raw_data": {"text": "This is a nice place for a relaxing evening out with friends. The owners seem pretty nice, too. I have been there a few times including last night. Recommend."}}'
# Since authentication was enabled for the deployment, set the authorization header.
headers = {'Content-Type':'application/json', 'Authorization':('Bearer '+ primary)}
# Send the request and display the results
resp = requests.post(aks_service.scoring_uri, input_data, headers=headers)
print(resp.text)
從服務傳回的結果類似下列 JSON:
{"sentiment": {"sentence": "This is a nice place for a relaxing evening out with friends. The owners seem pretty nice, too. I have been there a few times including last night. Recommend.", "terms": [{"text": "place", "type": "AS", "polarity": "POS", "score": 1.0, "start": 15, "len": 5}, {"text": "nice", "type": "OP", "polarity": "POS", "score": 1.0, "start": 10, "len": 4}]}}
連線至 Azure AI 搜尋服務
如需如何從 Azure AI 搜尋服務使用此模型的相關資訊,請參閱使用 Azure Machine Learning 建立和部署自訂技能教學課程。
清除資源
如果您已特別針對此範例建立 AKS 叢集,請在使用 Azure AI 搜尋服務完成測試之後,刪除您的資源。
重要
Azure 會根據 AKS 叢集已部署多久來收費。 使用完畢務必清除。
aks_service.delete()
aks_target.delete()