Bereitstellen eines Modells zur Verwendung mit Azure KI Search

GILT FÜR:Python SDK azureml v1

In diesem Artikel wird die Verwendung von Azure Machine Learning zum Bereitstellen eines Modells für die Nutzung mit Azure KI Search erläutert.

Azure KI Search führt die Inhaltsverarbeitung heterogener Inhalte durch, damit diese von Personen oder Anwendungen abgefragt werden können. Dieser Prozess kann mithilfe eines Modells erweitert werden, das von Azure Machine Learning bereitgestellt wird.

Azure Machine Learning kann ein trainiertes Modell als Webdienst bereitstellen. Der Webdienst wird dann in einen Azure KI Search-Skill eingebettet, der Teil der Verarbeitungspipeline wird.

Wichtig

Die Informationen in diesem Artikel gelten für die Bereitstellung des Modells. Der Artikel enthält Informationen zu den unterstützten Bereitstellungskonfigurationen, durch die das Modell von Azure KI Search verwendet werden kann.

Informationen zum Konfigurieren von Azure KI Search für die Verwendung des bereitgestellten Modells finden Sie im Tutorial Erstellen und Bereitstellen eines benutzerdefinierten Skills mit Azure Machine Learning.

Wenn Sie ein Modell für die Verwendung mit Azure KI Search bereitstellen, muss die Bereitstellung die folgenden Anforderungen erfüllen:

  • Verwenden Sie Azure Kubernetes Service, um das Modell für Rückschlüsse zu hosten.
  • Aktivieren Sie TLS (Transport Layer Security) für Azure Kubernetes Service. TLS wird zum Sichern der HTTPS-Kommunikation zwischen Azure KI Search und dem bereitgestellten Modell verwendet.
  • Das Einstiegsskript muss das inference_schema-Paket verwenden, um ein OpenAPI-Schema (Swagger) für den Dienst zu generieren.
  • Das Einstiegsskript muss auch JSON-Daten als Eingabe akzeptieren und JSON-Daten als Ausgabe generieren.

Voraussetzungen

Herstellen einer Verbindung mit Ihrem Arbeitsbereich

Ein Azure Machine Learning-Arbeitsbereich ist ein zentraler Ort für die Arbeit mit allen Artefakten, die Sie bei der Verwendung von Azure Machine Learning erstellen. Im Arbeitsbereich wird der Verlauf aller Trainingsaufträge gespeichert, einschließlich Protokollen, Metriken, Ausgabe und einer Momentaufnahme Ihrer Skripts.

Verwenden Sie den folgenden Code, um eine Verbindung mit einem vorhandenen Arbeitsbereich herzustellen:

Wichtig

In diesem Codeausschnitt wird davon ausgegangen, dass die Arbeitsbereichskonfiguration im aktuellen Verzeichnis oder in dessen übergeordnetem Verzeichnis gespeichert wird. Weitere Informationen finden Sie unter Erstellen und Verwalten von Azure Machine Learning-Arbeitsbereichen im Azure-Portal. Weitere Informationen zum Speichern der Konfiguration in einer Datei finden Sie unter Konfigurieren einer Entwicklungsumgebung für 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')

Erstellen eines Kubernetes-Clusters

Geschätzter Zeitaufwand: Ca. 20 Minuten.

Bei einem Kubernetes-Cluster handelt es sich um eine Reihe von VM-Instanzen (werden Knoten genannt), die zum Ausführen von Containeranwendungen verwendet werden.

Wenn Sie ein Modell aus Azure Machine Learning für Azure Kubernetes Service bereitstellen, werden das Modell und alle Ressourcen, die zum Hosten als Webdienst erforderlich sind, in einen Docker-Container gepackt. Dieser Container wird dann auf dem Cluster bereitgestellt.

Der folgende Code veranschaulicht, wie Sie einen neuen AKS-Cluster (Azure Kubernetes Service) für Ihren Arbeitsbereich erstellen:

Tipp

Sie können einen vorhandenen Azure Kubernetes Service-Cluster auch an Ihren Azure Machine Learning-Arbeitsbereich anfügen. Weitere Informationen finden Sie unter Bereitstellen eines Modells in einem Azure Kubernetes Service-Cluster.

Wichtig

Beachten Sie, dass der Code die enable_ssl()-Methode verwendet, um TLS (Transport Layer Security) für den Cluster zu aktivieren. Dies ist erforderlich, wenn Sie das bereitgestellte Modell aus Azure KI Search verwenden möchten.

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)

Wichtig

Azure berechnet Ihnen Gebühren, solange der AKS-Cluster vorhanden ist. Stellen Sie sicher, dass Sie Ihren AKS-Cluster löschen, wenn Sie ihn nicht mehr benötigen.

Weitere Informationen zum Verwenden von AKS mit Azure Machine Learning finden Sie unter Bereitstellen in Azure Kubernetes Service.

Schreiben des Eingangsskripts

Das Eingabeskript empfängt Daten, die an den Webdienst übermittelt wurden, übergibt sie an das Modell und gibt die Bewertungsergebnisse zurück. Das folgende Skript lädt das Modell beim Start und verwendet es dann zum Bewerten von Daten. Diese Datei wird manchmal als score.py bezeichnet.

Tipp

Das Eingabeskript ist für Ihr Modell spezifisch. Das Skript muss beispielsweise das Framework kennen, das bei Ihrem Modell, den Datenformaten usw. verwendet werden soll.

Wichtig

Wenn Sie planen, das bereitgestellte Modell aus Azure KI Search zu verwenden, müssen Sie das inference_schema-Paket verwenden, um die Schemagenerierung für die Bereitstellung zu aktivieren. Dieses Paket stellt Decorator-Elemente bereit, mit denen Sie das Eingabe- und Ausgabedatenformat für den Webdienst definieren können, der den Rückschluss mithilfe des Modells ausführt.

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()})

Weitere Informationen zu Eingabeskripts finden Sie unter Bereitstellung: wo und wie.

Definieren der Softwareumgebung

Die Umgebungsklasse wird verwendet, um die Python-Abhängigkeiten für den Dienst zu definieren. Sie enthält Abhängigkeiten, die sowohl für das Modell als auch das Eingabeskript erforderlich sind. In diesem Beispiel werden Pakete aus dem regulären pypi-Index und aus einem GitHub-Repository installiert.

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

Weitere Informationen zu Umgebungen finden Sie unter Erstellen und Verwalten von Umgebungen für Training und Bereitstellung.

Definieren der Bereitstellungskonfiguration

Die Bereitstellungskonfiguration definiert die Azure Kubernetes Service-Hostumgebung, die zum Ausführen des Webdiensts verwendet wird.

Tipp

Wenn Sie sich nicht sicher sind, welche Anforderungen es an den Arbeitsspeicher, die CPU oder die GPU im Rahmen Ihrer Bereitstellung gibt, können Sie diese mithilfe der Profilerstellung herausfinden. Weitere Informationen finden Sie unter Vorbereiten der Bereitstellung.

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)

Weitere Informationen finden Sie in der Referenzdokumentation zu AksService.deploy_configuration.

Definieren der Rückschlusskonfiguration

Die Rückschlusskonfiguration verweist auf das Einstiegsskript und das Umgebungsobjekt:

from azureml.core.model import InferenceConfig
inf_config = InferenceConfig(entry_script='score.py', environment=myenv)

Weitere Informationen finden Sie in der Referenzdokumentation zu InferenceConfig.

Bereitstellen des Modells

Stellen Sie dieses Modell in Ihrem AKS-Cluster bereit, und warten Sie, bis es den Dienst erstellt. In diesem Beispiel werden zwei registrierte Modelle aus der Registrierung geladen und in AKS bereitgestellt. Nach der Bereitstellung lädt die score.py-Datei in der Bereitstellung diese Modelle und verwendet sie, um Rückschlussvorgänge durchzuführen.

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)

Weitere Informationen finden Sie in der Referenzdokumentation zu Model.

Ausstellen einer Beispielabfrage für Ihren Dienst

Im folgenden Beispiel werden die Bereitstellungsinformationen verwendet, die im vorherigen Codeabschnitt in der Variablen aks_service gespeichert sind. Diese Variable wird verwendet, um die Bewertungs-URL und das Authentifizierungstoken abzurufen, die für die Kommunikation mit dem Dienst erforderlich sind:

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)

Das vom Dienst zurückgegebene Ergebnis ähnelt dem folgenden JSON-Code:

{"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}]}}

Informationen zum Verwenden dieses Modells aus Azure KI Search finden Sie im Tutorial Erstellen und Bereitstellen eines benutzerdefinierten Skills mit Azure Machine Learning.

Bereinigen der Ressourcen

Wenn Sie den AKS-Cluster speziell für dieses Beispiel erstellt haben, löschen Sie Ihre Ressourcen nach Abschluss des Testvorgangs mit Azure KI Search.

Wichtig

Azure berechnet Ihnen Gebühren basierend darauf, wie lange der AKS-Cluster bereitgestellt wird. Achten Sie darauf, ihn zu bereinigen, wenn Sie ihn nicht mehr nutzen.

aks_service.delete()
aks_target.delete()

Nächste Schritte