Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
GILT FÜR:
Azure Machine Learning SDK v1 für Python
Wichtig
Dieser Artikel enthält Informationen zur Verwendung des Azure Machine Learning SDK v1. SDK v1 ist ab dem 31. März 2025 veraltet. Der Support für sie endet am 30. Juni 2026. Sie können SDK v1 bis zu diesem Datum installieren und verwenden. Ihre vorhandenen Workflows mit SDK v1 funktionieren weiterhin nach dem Enddatum des Supports. Sie können jedoch Sicherheitsrisiken oder Breaking Changes im Falle von Architekturänderungen im Produkt ausgesetzt sein.
Es wird empfohlen, vor dem 30. Juni 2026 zum SDK v2 zu wechseln. Weitere Informationen zu SDK v2 finden Sie unter Was ist Azure Machine Learning CLI und Python SDK v2? und die SDK v2-Referenz.
In diesem Artikel wird erläutert, wie Sie Eintragsskripts für spezielle Anwendungsfälle in Azure Machine Learning schreiben. Ein Eintragsskript, das auch als Bewertungsskript bezeichnet wird, akzeptiert Anforderungen, verwendet ein Modell zum Bewerten von Daten und gibt eine Antwort zurück.
Voraussetzungen
Ein trainiertes Machine Learning-Modell, das Sie mit Azure Machine Learning bereitstellen möchten. Weitere Informationen zur Modellbereitstellung finden Sie unter Bereitstellen von Machine Learning-Modellen in Azure.
Automatisches Generieren eines Swagger-Schemas
Um automatisch ein Schema für Ihren Webdienst zu generieren, stellen Sie ein Beispiel für die Eingabe oder Ausgabe im Konstruktor für eines der definierten Typobjekte bereit. Der Typ und das Beispiel werden verwendet, um das Schema automatisch zu erstellen. Azure Machine Learning erstellt dann eine OpenAPI-Spezifikation (früher eine Swagger-Spezifikation) für den Webdienst während der Bereitstellung.
Warnung
Verwenden Sie keine vertraulichen oder privaten Daten für die Beispieleingabe oder -ausgabe. In Azure Machine Learning macht die Seite "Swagger" zum Ableiten die Beispieldaten verfügbar.
Die folgenden Typen werden derzeit unterstützt:
pandasnumpypyspark- Python-Standardobjekt
Um die Schemagenerierung zu verwenden, schließen Sie die Open-Source-Paketversion inference-schema 1.1.0 oder höher in die Abhängigkeitsdatei ein. Weitere Informationen zu diesem Paket finden Sie unter InferenceSchema auf GitHub. Um einen konformen Swagger für den automatisierten Webdienstverbrauch zu generieren, muss die run-Funktion in Ihrem Bewertungsskript die folgenden Bedingungen erfüllen:
- Der erste Parameter muss den Typ
StandardPythonParameterType, den NamenInputshaben und geschachtelt sein. - Es muss ein optionaler zweiter Parameter vom Typ
StandardPythonParameterTypevorhanden sein, der benanntGlobalParameterswird. - Die Funktion muss ein Wörterbuch vom Typ
StandardPythonParameterTypezurückgeben, der benanntResultsist und geschachtelt ist.
Definieren Sie in den Variablen sample_input und sample_output das Format für das Ein- und Ausgabebeispiel. (Die Variablen stellen das Anforderungs- und das Antwortformat für den Webdienst dar.) Verwenden Sie diese Beispiele in den Decorator-Elementen der Ein- und Ausgabefunktion für die Funktion run. In Beispiel scikit-learn im folgenden Abschnitt wird die Schemagenerierung verwendet.
Mit Power BI kompatibler Endpunkt
Im folgenden Beispiel wird veranschaulicht, wie die run Funktion gemäß den Anweisungen im vorherigen Abschnitt definiert wird. Sie können dieses Skript verwenden, wenn Sie Ihren bereitgestellten Webdienst aus Power BI nutzen.
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
Tipp
Der Rückgabewert aus dem Skript kann ein beliebiges Python-Objekt sein, das in JSON serialisierbar ist. Wenn Ihr Modell beispielsweise einen Pandas-Datenrahmen zurückgibt, der mehrere Spalten enthält, können Sie einen Ausgabedekoror verwenden, der dem folgenden Code ähnelt:
output_sample = pd.DataFrame(data=[{"a1": 5, "a2": 6}])
@output_schema(PandasParameterType(output_sample))
...
result = model.predict(data)
return result
Binäre Daten (Bild)
Wenn Ihr Modell Binärdaten wie ein Image akzeptiert, müssen Sie die score.py Datei ändern, die Ihre Bereitstellung verwendet, damit sie unformatierte HTTP-Anforderungen akzeptiert. Um Rohdaten zu akzeptieren, verwenden Sie die AMLRequest-Klasse in Ihrem Eingangsskript und fügen der @rawhttp-Funktion den run-Decorator hinzu.
Das folgende score.py Skript akzeptiert Binärdaten:
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)
Wichtig
Die AMLRequest-Klasse befindet sich im azureml.contrib-Namespace. Entitäten in diesem Namespace befinden sich in der Vorschau. Sie ändern sich häufig, während der Dienst Verbesserungen durchläuft. Microsoft bietet keinen vollständigen Support für diese Entitäten.
Wenn Sie Code testen müssen, der diese Klasse in Ihrer lokalen Entwicklungsumgebung verwendet, können Sie die Komponenten mithilfe des folgenden Befehls installieren:
pip install azureml-contrib-services
Hinweis
Es wird nicht empfohlen, als benutzerdefinierter Statuscode zu verwenden 500 . Auf der Seite des Azure Machine Learning-Rückschlussrouters (azureml-fe) wird der Statuscode in 502 umgeschrieben.
- Der Statuscode wird durch
azureml-feübergeben und dann an den Client gesendet. - Der
azureml-fe-Code schreibt den von der Modellseite zurückgegebenen500-Code als502um. Der Client empfängt einen Code von502. - Wenn der
azureml-fe-Code selbst500zurückgibt, empfängt die Clientseite weiterhin den Code500.
Wenn Sie die AMLRequest Klasse verwenden, können Sie nur auf die unformatierten geposteten Daten in der score.py-Datei zugreifen. Es gibt keine clientseitige Komponente. Von einem Client aus können Sie Daten wie gewohnt posten. Der folgende Python-Code liest z. B. eine Imagedatei und stellt die Daten bereit:
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)
Cross-Origin Resource Sharing
CORS ist eine Möglichkeit, Anforderungen eingeschränkter Ressourcen auf einer Webseite aus anderen Domänen zuzulassen. CORS funktioniert über HTTP-Header, die mit der Clientanforderung gesendet und mit der Dienstantwort zurückgegeben werden. Weitere Informationen zu CORS und gültigen Headern finden Sie unter "Ursprungsübergreifende Ressourcenfreigabe".
Um Ihre Modellimplementierung für die Unterstützung von CORS zu konfigurieren, verwenden Sie die AMLResponse-Klasse in Ihrem Eingangsskript. Wenn Sie diese Klasse verwenden, können Sie die Header für das Antwortobjekt festlegen.
Im folgenden Beispiel wird der Access-Control-Allow-Origin-Header für die Antwort aus dem Eingangsskript festgelegt:
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)
Wichtig
Die AMLRequest-Klasse befindet sich im azureml.contrib-Namespace. Entitäten in diesem Namespace befinden sich in der Vorschau. Sie ändern sich häufig, während der Dienst Verbesserungen durchläuft. Microsoft bietet keinen vollständigen Support für diese Entitäten.
Wenn Sie Code testen müssen, der diese Klasse in Ihrer lokalen Entwicklungsumgebung verwendet, können Sie die Komponenten mithilfe des folgenden Befehls installieren:
pip install azureml-contrib-services
Warnung
Azure Machine Learning leitet nur POST- und GET-Anforderungen an die Container weiter, die den Bewertungsdienst ausführen. Fehler können dazu führen, dass Browser OPTIONS-Anforderungen zum Ausgeben von Preflight-Anforderungen verwenden.
Laden von registrierten Modellen
Es gibt zwei Möglichkeiten, in einem Eingabeskript nach Modellen zu suchen:
-
AZUREML_MODEL_DIR: Eine Umgebungsvariable, die den Pfad zum Modellspeicherort enthält -
Model.get_model_path: Eine API, die den Pfad zur Modelldatei mithilfe des registrierten Modellnamens zurückgibt.
AZUREML_MODEL_DIR
AZUREML_MODEL_DIR ist eine Umgebungsvariable, die während der Dienstbereitstellung erstellt wird. Sie können diese Umgebungsvariable verwenden, um den Speicherort der bereitgestellten Modelle zu finden.
In der folgenden Tabelle werden mögliche Werte AZUREML_MODEL_DIR für eine unterschiedliche Anzahl von bereitgestellten Modellen beschrieben:
| Bereitstellung | Wert der Umgebungsvariablen |
|---|---|
| Einzelnes Modell | Der Pfad zum Ordner, der das Modell enthält. |
| Mehrere Modelle | Der Pfad zum Ordner, der alle Modelle enthält. Modelle befinden sich nach Name und Version im Format <model-name>/<version> in diesem Ordner. |
Während der Modellregistrierung und -bereitstellung werden Modelle im AZUREML_MODEL_DIR Pfad platziert, und ihre ursprünglichen Dateinamen bleiben erhalten.
Um den Pfad zu einer Modelldatei in Ihrem Eingabeskript abzurufen, kombinieren Sie die Umgebungsvariable mit dem Dateipfad, nach dem Sie suchen.
Einzelnes Modell
Das folgende Beispiel zeigt, wie Sie den Pfad finden, wenn Sie über ein einzelnes Modell verfügen:
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')
Mehrere Modelle
Das folgende Beispiel zeigt, wie Sie den Pfad finden, wenn Sie über mehrere Modelle verfügen. In diesem Szenario werden zwei Modelle unter dem Arbeitsbereich registriert:
-
my_first_model: Dieses Modell enthält eine Datei, my_first_model.pkl, und hat eine Version,1. -
my_second_model: Dieses Modell enthält eine Datei, my_second_model.pkl, und hat zwei Versionen,1und2.
Wenn Sie den Dienst bereitstellen, stellen Sie beide Modelle im Bereitstellungsvorgang bereit:
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)
Im Docker-Image, das den Dienst hostt, enthält die AZUREML_MODEL_DIR Umgebungsvariable den Ordner, in dem sich die Modelle befinden. In diesem Ordner befindet sich jedes Modell in einem Ordnerpfad von <model-name>/<version>. In diesem Pfad <model-name> ist der Name des registrierten Modells und <version> die Version des Modells. Die Dateien, aus denen das registrierte Modell besteht, werden in diesen Ordnern gespeichert.
In diesem Beispiel lautet $AZUREML_MODEL_DIR/my_first_model/1/my_first_model.pklder Pfad des ersten Modells . Der Pfad des zweiten Modells lautet $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
Wenn Sie ein Modell registrieren, geben Sie einen Modellnamen ein. Dieser wird dazu verwendet, das Modell in der Registrierung zu verwalten. Sie verwenden diesen Namen mit der Model.get_model_path Methode, um den Pfad der Modelldatei oder -dateien im lokalen Dateisystem abzurufen. Wenn Sie einen Ordner oder eine Sammlung von Dateien registrieren, gibt diese API den Pfad des Ordners zurück, der diese Dateien enthält.
Wenn Sie ein Modell registrieren, geben Sie ihm einen Namen. Der Name entspricht dem Ort, an dem sich das Modell befindet (entweder lokal oder während der Dienstbereitstellung).
Frameworkspezifische Beispiele
Weitere Einstiegsskriptbeispiele für bestimmte Anwendungsfälle für maschinelles Lernen finden Sie in den folgenden Artikeln: