Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
PLATÍ PRO:
Azure Machine Learning SDK v1 pro Python
Důležité
Tento článek poskytuje informace o použití Azure Machine Learning SDK verze 1. Sada SDK v1 je od 31. března 2025 zastaralá. Podpora bude ukončena 30. června 2026. Do tohoto data můžete nainstalovat a používat sadu SDK v1. Vaše stávající pracovní postupy využívající sadu SDK v1 budou fungovat i po datu ukončení podpory. Mohou však být vystaveny bezpečnostním rizikům nebo zásadním změnám v případě změn architektury v produktu.
Doporučujeme přejít na SDK v2 před 30. červnem 2026. Další informace o sadě SDK v2 najdete v tématu Co je Azure Machine Learning CLI a Python SDK v2? a referenční informace k sadě SDK v2.
Tento článek vysvětluje, jak psát vstupní skripty pro specializované případy použití ve službě Azure Machine Learning. Vstupní skript, který se také nazývá bodovací skript, přijímá požadavky, používá model k hodnocení dat a vrací odpověď.
Požadavky
Natrénovaný model strojového učení, který chcete nasadit pomocí služby Azure Machine Learning. Další informace o nasazení modelu najdete v tématu Nasazení modelů strojového učení do Azure.
Automatické generování schématu Swaggeru
Pokud chcete pro webovou službu automaticky vygenerovat schéma, zadejte v konstruktoru ukázku vstupu nebo výstupu pro jeden z definovaných objektů typu. Typ a ukázka se používají k automatickému vytvoření schématu. Azure Machine Learning pak vytvoří specifikaci OpenAPI (dříve specifikaci Swaggeru) pro webovou službu během nasazování.
Upozorňující
Nepoužívejte citlivá nebo soukromá data pro ukázkový vstup nebo výstup. Na stránce Swagger pro odvozování ve službě Azure Machine Learning se zobrazí ukázková data.
V současné době jsou podporovány následující typy:
pandasnumpypyspark- Standardní objekt Pythonu
Pokud chcete použít generování schématu, zahrňte do souboru závislostí opensourcový inference-schema balíček verze 1.1.0 nebo novější. Další informace o tomto balíčku najdete v tématu InferenceSchema na GitHubu. Aby bylo možné generovat odpovídající Swagger pro automatizovanou spotřebu webových služeb, funkce ve vašem skórovacím skriptu musí splňovat následující podmínky:
- První parametr musí mít typ
StandardPythonParameterType, musí mít názevInputsa být vnořený. - Musí existovat volitelný druhý parametr typu
StandardPythonParameterType, který má názevGlobalParameters. - Funkce musí vrátit slovník typu
StandardPythonParameterType, který se jmenujeResultsa je vnořený.
Definujte vstupní a výstupní ukázkové formáty v sample_input proměnných a sample_output které představují formáty požadavků a odpovědí pro webovou službu. Tyto ukázky použijte ve vstupních a výstupních dekorátorech run funkce. Příklad scikit-learn v následující části používá generování schématu.
Koncový bod kompatibilní s Power BI
Následující příklad ukazuje, jak definovat run funkci podle pokynů v předchozí části. Tento skript můžete použít při využívání nasazené webové služby z Power BI.
import os
import json
import pickle
import numpy as np
import pandas as pd
import azureml.train.automl
import joblib
from sklearn.linear_model import Ridge
from inference_schema.schema_decorators import input_schema, output_schema
from inference_schema.parameter_types.standard_py_parameter_type import StandardPythonParameterType
from inference_schema.parameter_types.numpy_parameter_type import NumpyParameterType
from inference_schema.parameter_types.pandas_parameter_type import PandasParameterType
def init():
global model
# Replace the file name if needed.
model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'sklearn_regression_model.pkl')
# Deserialize the model file back into a sklearn model.
model = joblib.load(model_path)
# Provide three sample inputs for schema generation.
numpy_sample_input = NumpyParameterType(np.array([[1,2,3,4,5,6,7,8,9,10],[10,9,8,7,6,5,4,3,2,1]],dtype='float64'))
pandas_sample_input = PandasParameterType(pd.DataFrame({'name': ['Sarah', 'John'], 'age': [25, 26]}))
standard_sample_input = StandardPythonParameterType(0.0)
# The following sample is a nested input sample. Any item wrapped by `ParameterType` is described by the schema.
sample_input = StandardPythonParameterType({'input1': numpy_sample_input,
'input2': pandas_sample_input,
'input3': standard_sample_input})
sample_global_parameters = StandardPythonParameterType(1.0) # This line is optional.
sample_output = StandardPythonParameterType([1.0, 1.0])
outputs = StandardPythonParameterType({'Results':sample_output}) # "Results" is case sensitive.
@input_schema('Inputs', sample_input)
# "Inputs" is case sensitive.
@input_schema('GlobalParameters', sample_global_parameters)
# The preceding line is optional. "GlobalParameters" is case sensitive.
@output_schema(outputs)
def run(Inputs, GlobalParameters):
# The parameters in the preceding line have to match those in the decorator. "Inputs" and
# "GlobalParameters" are case sensitive.
try:
data = Inputs['input1']
# The data gets converted to the target format.
assert isinstance(data, np.ndarray)
result = model.predict(data)
return result.tolist()
except Exception as e:
error = str(e)
return error
Návod
Návratovou hodnotou skriptu může být libovolný objekt Pythonu, který je serializovatelný na JSON. Pokud například váš model vrátí datový rámec Pandas, který obsahuje více sloupců, můžete použít výstupní dekorátor podobný následujícímu kódu:
output_sample = pd.DataFrame(data=[{"a1": 5, "a2": 6}])
@output_schema(PandasParameterType(output_sample))
...
result = model.predict(data)
return result
Binární (obrazová) data
Pokud váš model přijímá binární data, jako je image, musíte upravit score.py soubor, který vaše nasazení používá, aby přijímal nezpracované požadavky HTTP. Pokud chcete přijmout nezpracovaná data, použijte AMLRequest třídu ve vstupním skriptu a přidejte @rawhttp dekorátor do run funkce.
Následující skript score.py přijímá binární data:
from azureml.contrib.services.aml_request import AMLRequest, rawhttp
from azureml.contrib.services.aml_response import AMLResponse
from PIL import Image
import json
def init():
print("This is init()")
@rawhttp
def run(request):
print("This is run()")
if request.method == 'GET':
# For this example, return the URL for GET requests.
respBody = str.encode(request.full_path)
return AMLResponse(respBody, 200)
elif request.method == 'POST':
file_bytes = request.files["image"]
image = Image.open(file_bytes).convert('RGB')
# For a real-world solution, load the data from the request body
# and send it to the model. Then return the response.
# For demonstration purposes, this example returns the size of the image as the response.
return AMLResponse(json.dumps(image.size), 200)
else:
return AMLResponse("bad request", 500)
Důležité
Třída AMLRequest je v azureml.contrib oboru názvů. Entity v tomto jmenném prostoru jsou ve verzi náhledu. Často se mění, zatímco služba prochází vylepšením. Microsoft nenabízí plnou podporu těchto entit.
Pokud potřebujete otestovat kód, který používá tuto třídu v místním vývojovém prostředí, můžete komponenty nainstalovat pomocí následujícího příkazu:
pip install azureml-contrib-services
Poznámka:
Nedoporučujeme používat 500 jako vlastní stavový kód. Na straně směrovače odvozování služby Azure Machine Learning (azureml-fe) se stavový kód přepíše na 502.
- Stavový kód se předává
azureml-fea pak se odešle klientovi. - Kód
azureml-fepřepíše vrácenou500ze strany modelu jako502. Klient obdrží kód502. -
azureml-fePokud samotný kód vrátí500, strana klienta stále obdrží kód500.
Při použití AMLRequest třídy můžete přistupovat pouze k nezpracovaných publikovaných dat v souboru score.py. Neexistuje žádná komponenta na straně klienta. Z klienta můžete publikovat data jako obvykle. Například následující kód Pythonu načte soubor obrázku a publikuje data:
import requests
uri = service.scoring_uri
image_path = 'test.jpg'
files = {'image': open(image_path, 'rb').read()}
response = requests.post(uri, files=files)
print(response.json)
Sdílení prostředků napříč zdroji
Sdílení prostředků mezi zdroji (CORS) poskytuje způsob, jak si prostředky na webové stránce vyžádat z jiné domény. CORS funguje prostřednictvím hlaviček HTTP, které se odesílají s požadavkem klienta a vrátí se s odpovědí služby. Další informace o CORS a platných hlavičkách najdete v tématu Sdílení prostředků mezi zdroji.
Pokud chcete nakonfigurovat nasazení modelu tak, aby podporovalo CORS, použijte AMLResponse třídu ve vstupním skriptu. Pokud použijete tuto třídu, můžete nastavit hlavičky objektu odpovědi.
Následující příklad nastaví hlavičku Access-Control-Allow-Origin odpovědi ze vstupního skriptu:
from azureml.contrib.services.aml_request import AMLRequest, rawhttp
from azureml.contrib.services.aml_response import AMLResponse
def init():
print("This is init()")
@rawhttp
def run(request):
print("This is run()")
print("Request: [{0}]".format(request))
if request.method == 'GET':
# For this example, just return the URL for GET.
# For a real-world solution, you would load the data from URL params or headers
# and send it to the model. Then return the response.
respBody = str.encode(request.full_path)
resp = AMLResponse(respBody, 200)
resp.headers["Allow"] = "OPTIONS, GET, POST"
resp.headers["Access-Control-Allow-Methods"] = "OPTIONS, GET, POST"
resp.headers['Access-Control-Allow-Origin'] = "http://www.example.com"
resp.headers['Access-Control-Allow-Headers'] = "*"
return resp
elif request.method == 'POST':
reqBody = request.get_data(False)
# For a real-world solution, you would load the data from reqBody
# and send it to the model. Then return the response.
resp = AMLResponse(reqBody, 200)
resp.headers["Allow"] = "OPTIONS, GET, POST"
resp.headers["Access-Control-Allow-Methods"] = "OPTIONS, GET, POST"
resp.headers['Access-Control-Allow-Origin'] = "http://www.example.com"
resp.headers['Access-Control-Allow-Headers'] = "*"
return resp
elif request.method == 'OPTIONS':
resp = AMLResponse("", 200)
resp.headers["Allow"] = "OPTIONS, GET, POST"
resp.headers["Access-Control-Allow-Methods"] = "OPTIONS, GET, POST"
resp.headers['Access-Control-Allow-Origin'] = "http://www.example.com"
resp.headers['Access-Control-Allow-Headers'] = "*"
return resp
else:
return AMLResponse("bad request", 400)
Důležité
Třída AMLRequest je v azureml.contrib oboru názvů. Entity v tomto jmenném prostoru jsou ve verzi náhledu. Často se mění, zatímco služba prochází vylepšením. Microsoft nenabízí plnou podporu těchto entit.
Pokud potřebujete otestovat kód, který používá tuto třídu v místním vývojovém prostředí, můžete komponenty nainstalovat pomocí následujícího příkazu:
pip install azureml-contrib-services
Upozorňující
Azure Machine Learning směruje pouze požadavky POST a GET na kontejnery, které spouští službu vyhodnocování. Chyby mohou nastat, když prohlížeče používají požadavky OPTIONS pro realizaci předběžných požadavků.
Načtení registrovaných modelů
V zaváděcím skriptu je možné vyhledat modely dvěma způsoby:
-
AZUREML_MODEL_DIR: Proměnná prostředí, která obsahuje cestu k umístění modelu -
Model.get_model_path: Rozhraní API, které vrací cestu k souboru modelu pomocí názvu registrovaného modelu
AZUREML_MODEL_DIR
AZUREML_MODEL_DIR je proměnná prostředí vytvořená během nasazování služby. Tuto proměnnou prostředí můžete použít k vyhledání umístění nasazených modelů.
Následující tabulka popisuje možné hodnoty AZUREML_MODEL_DIR pro různý počet nasazených modelů:
| Nasazení | Hodnota proměnné prostředí |
|---|---|
| Jeden model | Cesta ke složce, která obsahuje model. |
| Více modelů | Cesta ke složce, která obsahuje všechny modely. Modely jsou umístěny podle názvu a verze v této složce ve formátu <model-name>/<version>. |
Během registrace a nasazení modelu se modely umístí do AZUREML_MODEL_DIR cesty a jejich původní názvy souborů se zachovají.
Pokud chcete získat cestu k souboru modelu ve vstupním skriptu, zkombinujte proměnnou prostředí s cestou k souboru, kterou hledáte.
Jeden model
Následující příklad ukazuje, jak najít cestu, když máte jeden model:
import os
# In the following example, the model is a file.
model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'sklearn_regression_model.pkl')
# In the following example, the model is a folder that contains a file.
file_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'my_model_folder', 'sklearn_regression_model.pkl')
Více modelů
Následující příklad ukazuje, jak najít cestu, když máte více modelů. V tomto scénáři jsou v pracovním prostoru zaregistrované dva modely:
-
my_first_model: Tento model obsahuje jeden soubor, my_first_model.pkl a má jednu verzi.1 -
my_second_model: Tento model obsahuje jeden soubor, my_second_model.pkl a má dvě verze a12.
Když službu nasadíte, poskytnete v operaci nasazení oba modely:
from azureml.core import Workspace, Model
# Get a handle to the workspace.
ws = Workspace.from_config()
first_model = Model(ws, name="my_first_model", version=1)
second_model = Model(ws, name="my_second_model", version=2)
service = Model.deploy(ws, "myservice", [first_model, second_model], inference_config, deployment_config)
V imagi Dockeru, která hostuje službu, obsahuje proměnná prostředí AZUREML_MODEL_DIR složku, ve které jsou umístěny modely. V této složce se každý model nachází v cestě <model-name>/<version> ke složce. V této cestě <model-name> je název registrovaného modelu a <version> je verzí modelu. Soubory, které tvoří registrovaný model, se ukládají do těchto složek.
V tomto příkladu je cesta prvního modelu $AZUREML_MODEL_DIR/my_first_model/1/my_first_model.pkl. Cesta druhého modelu je $AZUREML_MODEL_DIR/my_second_model/2/my_second_model.pkl.
# In the following example, the model is a file, and the deployment contains multiple models.
first_model_name = 'my_first_model'
first_model_version = '1'
first_model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), first_model_name, first_model_version, 'my_first_model.pkl')
second_model_name = 'my_second_model'
second_model_version = '2'
second_model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), second_model_name, second_model_version, 'my_second_model.pkl')
get_model_path
Při registraci modelu zadáte název modelu, který slouží ke správě modelu v registru. Tento název použijete s metodou Model.get_model_path k načtení cesty k modelovým souborům v místním systému souborů. Pokud zaregistrujete složku nebo kolekci souborů, vrátí toto rozhraní API cestu ke složce obsahující tyto soubory.
Při registraci modelu ho pojmenujete. Název odpovídá umístění modelu místně nebo během nasazení služby.
Příklady specifické pro architekturu
Další příklady vstupních skriptů pro konkrétní případy použití strojového učení najdete v následujících článcích: