Bereitstellen eines Modells in einem Azure Kubernetes Service-Cluster mit v1

Wichtig

In diesem Artikel wird erläutert, wie Sie die Azure Machine Learning CLI (v1) und das Azure Machine Learning SDK für Python (v1) verwenden, um ein Modell bereitzustellen. Informationen zum empfohlenen Ansatz für v2 finden Sie unter Bereitstellen und Bewertung eines Machine Learning-Modells mithilfe eines Onlineendpunkts.

Erfahren Sie, wie Sie ein Modell mit Azure Machine Learning als Webdienst in Azure Kubernetes Service (AKS) bereitstellen. AKS eignet sich gut für umfangreiche Produktionsbereitstellungen. Verwenden Sie AKS, wenn Sie eine oder mehrere der folgenden Funktionen benötigen:

  • Schnelle Antwortzeiten
  • Autoskalierung des bereitgestellten Diensts
  • Logging
  • Modelldatensammlung
  • Authentifizierung
  • TLS-Terminierung
  • Optionen für die Hardwarebeschleunigung, beispielsweise GPU und FPGA (Field-Programmable Gate Arrays)

Bei der Bereitstellung in AKS stellen Sie ein AKS-Cluster bereit, das mit Ihrem Arbeitsbereich verbunden ist. Informationen zum Verbinden eines AKS-Clusters mit Ihrem Arbeitsbereich finden Sie unter Erstellen und Anfügen eines Azure Kubernetes Service-Clusters.

Wichtig

Es wird empfohlen, Debugvorgänge vor der Bereitstellung im Webdienst lokal durchzuführen. Weitere Informationen finden Sie unter Problembehandlung mit einer lokalen Modellimplementierung.

Hinweis

Azure Machine Learning-Endpunkte (v2) bieten eine verbesserte, einfachere Bereitstellungserfahrung. Endpunkte unterstützen Szenarien mit Echtzeit- und Batchrückschluss. Endpunkte verfügen über eine einheitliche Schnittstelle zum übergreifenden Aufrufen und Verwalten von Modellbereitstellungen für alle Computetypen. Siehe Was sind Azure Machine Learning-Endpunkte?.

Voraussetzungen

Grundlegendes zu Bereitstellungsprozessen

Das Wort Bereitstellung wird sowohl in Kubernetes als auch in Azure Machine Learning verwendet. Bereitstellung hat in diesen beiden Kontexten unterschiedliche Bedeutungen. In Kubernetes ist eine Bereitstellung eine konkrete Entität, die mit einer deklarativen YAML-Datei angegeben wird. Eine Kubernetes-Bereitstellung verfügt über einen definierten Lebenszyklus und konkrete Beziehungen zu anderen Kubernetes-Entitäten wie Pods und ReplicaSets. Informationen zu Kubernetes in Form von Dokumenten und Videos finden Sie unter Was ist Kubernetes?.

In Azure Machine Learning wird „Bereitstellung“ allgemeiner für das Verfügbarmachen und Bereinigen Ihrer Projektressourcen verwendet. Folgende Schritte werden in Azure Machine Learning als Teil der Bereitstellung betrachtet:

  1. Zippen der Dateien in Ihrem Projektordner, wobei die in .amlignore oder .gitignore angegebenen Dateien ignoriert werden
  2. Zentrales Hochskalieren Ihres Computeclusters (bezieht sich auf Kubernetes)
  3. Erstellen oder Herunterladen des Dockerfiles auf den Serverknoten (bezieht sich auf Kubernetes)
    1. Das System berechnet einen Hashwert aus:
    2. Das System verwendet diesen Hash als Schlüssel in einer Suche nach der Azure Container Registry (ACR) für den Arbeitsbereich.
    3. Wenn er nicht gefunden wird, wird nach einer Übereinstimmung in der globalen ACR gesucht
    4. Wenn keine gefunden wird, erstellt das System ein neues Image (das zwischengespeichert und an die ACR des Arbeitsbereichs übermittelt wird)
  4. Herunterladen der gezippten Projektdatei in den temporären Speicher auf dem Serverknoten
  5. Entzippen der Projektdatei
  6. Ausführen von python <entry script> <arguments> auf dem Serverknoten
  7. Speichern von Protokollen, Modelldateien und anderen Dateien, die in dem Speicherkonto, das dem Arbeitsbereich zugeordnet ist, in ./outputs geschrieben werden
  8. Zentrales Herunterskalieren von Compute, einschließlich Entfernen des temporären Speichers (bezieht sich auf Kubernetes)

Azure Machine Learning-Router

Die Front-End-Komponente (azureml-fe), die eingehende Rückschlussanforderungen an bereitgestellte Dienste weiterleitet, wird automatisch nach Bedarf skaliert. Die Skalierung von azureml-fe basiert dem Zweck und der Größe (Anzahl der Knoten) des AKS-Clusters. Clusterzweck und -knoten werden konfiguriert, wenn Sie einen AKS-Cluster erstellen oder anfügen. Es gibt einen azureml-fe-Dienst pro Cluster, der auf mehreren Pods ausgeführt werden kann.

Wichtig

  • Bei Verwendung eines als dev-test konfigurierten Clusters wird die Selbstskalierung deaktiviert. Auch für FastProd-/DenseProd-Cluster ist Self-Scaler nur aktiviert, wenn dies gemäß den Telemetriedaten erforderlich ist.
  • Azure Machine Learning lädt Protokolle nicht automatisch aus Containern (einschließlich Systemcontainern) hoch oder speichert sie. Für ein umfassendes Debuggen empfiehlt es sich, Container Insights für Ihren AKS-Cluster zu aktivieren. Auf diese Weise können Sie Containerprotokolle bei Bedarf speichern, verwalten und für das AML-Team freigeben. Andernfalls kann AML keine Unterstützung für Probleme im Zusammenhang mit azureml-fe garantieren.
  • Die maximale Größe der Anforderungsnutzdaten beträgt 100 MB.

Azureml-fe wird sowohl (vertikal) hochskaliert, um mehr Kerne zu verwenden, als auch (horizontal) aufskaliert, um mehr Pods zu verwenden. Wenn Sie die Entscheidung zum zentralen Hochskalieren treffen, wird die Zeit herangezogen, die zum Weiterleiten eingehender Rückschlussanforderungen benötigt wird. Wenn diese Zeit den Schwellenwert überschreitet, erfolgt eine Hochskalierung. Wenn die Zeit zum Weiterleiten eingehender Anforderungen weiterhin den Schwellenwert überschreitet, erfolgt eine Aufskalierung.

Beim Herunter- und Abskalieren wird die CPU-Auslastung verwendet. Wenn der Schwellenwert für die CPU-Auslastung erreicht ist, wird das Front-End zuerst herunterskaliert. Wenn die CPU-Auslastung auf den Schwellenwert für die Abskalierung sinkt, erfolgt eine Abskalierung. Ein Hoch- und Aufskalieren erfolgt nur, wenn genügend Clusterressourcen verfügbar sind.

Beim Hoch- oder Herunterskalieren werden Pods vom Typ azureml-fe neu gestartet, um die Änderungen an CPU bzw. Arbeitsspeicher zu übernehmen. Neustarts wirken sich nicht auf das Ableiten von Anforderungen aus.

Grundlegendes zu Konnektivitätsanforderungen für AKS-Rückschlusscluster

Wenn Azure Machine Learning einen AKS-Cluster erstellt oder anfügt, wird das AKS-Cluster mit einem der beiden folgenden Netzwerkmodelle bereitgestellt:

  • Kubenet-Netzwerke: Die Netzwerkressourcen werden normalerweise bei der Bereitstellung des AKS-Clusters erstellt und konfiguriert.
  • Azure Container Networking Interface (CNI)-Netzwerke: Das AKS-Cluster wird mit einer vorhandenen virtuellen Netzwerkressource und -konfigurationen verbunden.

Für das Kubenet-Netzwerk wird das Netzwerk für den Azure Machine Learning Service erstellt und ordnungsgemäß konfiguriert. Für das CNI-Netzwerk müssen Sie die Konnektivitätsanforderungen verstehen und die DNS-Auflösung und die ausgehende Konnektivität für AKS-Rückschlüsse sicherstellen. So können Sie z. B. eine Firewall verwenden, um den Netzwerkdatenverkehr zu blockieren.

Das folgende Diagramm zeigt die Konnektivitätsanforderungen für AKS-Rückschlüsse. Die schwarzen Pfeile stehen für die tatsächliche Kommunikation und die blauen Pfeile für die Domänennamen. Möglicherweise müssen Sie Einträge für diese Hosts zu Ihrer Firewall oder zu Ihrem benutzerdefinierten DNS-Server hinzufügen.

Abbildung der Konnektivitätsanforderungen für AKS-Rückschlüsse

Allgemeine Anforderungen an die AKS-Konnektivität finden Sie unter Einschränken des Netzwerkdatenverkehrs mit Azure Firewall in AKS.

Informationen zum Zugreifen auf Azure Machine Learning-Dienste hinter einer Firewall finden Sie unter Konfigurieren von ein- und ausgehendem Netzwerkdatenverkehr.

Allgemeine Anforderungen an die DNS-Auflösung

Die DNS-Auflösung in einem vorhandenen virtuellen Netzwerk befindet sich unter Ihrer Kontrolle. Beispiel: Firewall oder benutzerdefinierter DNS-Server. Die folgenden Hosts müssen erreichbar sein:

Hostname Verwendet von
<cluster>.hcp.<region>.azmk8s.io AKS-API-Server
mcr.microsoft.com Microsoft Container Registry (MCR)
<ACR name>.azurecr.io Azure Container Registry (ACR)
<account>.table.core.windows.net Azure Storage-Konto (Tabellenspeicher)
<account>.blob.core.windows.net Azure Storage-Konto (Blobspeicher)
api.azureml.ms Microsoft Entra-Authentifizierung
ingest-vienna<region>.kusto.windows.net Kusto-Endpunkt zum Hochladen von Telemetriedaten
<leaf-domain-label + auto-generated suffix>.<region>.cloudapp.azure.com Endpunktdomänenname, wenn er von Azure Machine Learning automatisch generiert wird. Wenn Sie einen benutzerdefinierten Domänennamen verwendet haben, benötigen Sie diesen Eintrag nicht.

Konnektivitätsanforderungen in chronologischer Reihenfolge

Beim Erstellen oder Anfügen von AKS wird der Azure Machine Learning-Router (azureml-fe) im AKS-Cluster bereitgestellt. Für die Bereitstellung des Azure Machine Learning-Routers sollte der AKS-Knoten Folgendes ermöglichen:

  • Auflösen von DNS für den AKS-API-Server
  • Auflösen von DNS für MCR, um Docker-Images für Azure Machine Learning-Router herunterzuladen
  • Herunterladen von Images aus MCR, wo die ausgehende Konnektivität erforderlich ist

Direkt nach der Bereitstellung von azureml-fe versucht es zu starten, und dies erfordert Folgendes:

  • Auflösen von DNS für den AKS-API-Server
  • Fragen Sie den AKS-API-Server ab, um andere Instanzen von sich selbst zu ermitteln (es handelt sich um einen Multi-Pod-Dienst).
  • Herstellen einer Verbindung mit anderen Instanzen von sich selbst

Nachdem azureml-fe gestartet wurde, benötigt es die folgende Konnektivität, um ordnungsgemäß zu funktionieren:

  • Herstellen einer Verbindung mit Azure Storage zum Herunterladen einer dynamischen Konfiguration
  • Lösen Sie das DNS für den Microsoft Entra-Authentifizierungsserver api.azureml.ms auf und kommunizieren Sie mit ihm, wenn der bereitgestellte Dienst die Microsoft Entra-Authentifizierung verwendet.
  • Abfragen des AKS-API-Servers, um bereitgestellte Modelle zu entdecken
  • Kommunizieren mit bereitgestellten Modell-PODs

Zum Zeitpunkt der Modellimplementierung sollte der AKS-Knoten zu Folgendem in der Lage sein:

  • Auflösen von DNS für die ACR des Kunden
  • Herunterladen von Images aus der ACR des Kunden
  • Auflösen von DNS für Azure-BLOBs, in denen das Modell gespeichert wird
  • Herunterladen von Modellen aus Azure-BLOBs

Nach der Bereitstellung des Modells und dem Start des Diensts wird azureml-fe automatisch mithilfe der AKS-API erkannt und ist bereit, Anforderungen an das Modell weiterzuleiten. Es muss in der Lage sein, mit den Modell-PODs zu kommunizieren.

Hinweis

Wenn das bereitgestellte Modell eine Konnektivität erfordert (z. B. Abfragen einer externen Datenbank oder eines anderen REST-Diensts, Herunterladen eines BLOBs), dann sollten sowohl die DNS-Auflösung als auch die ausgehende Kommunikation für diese Dienste aktiviert sein.

Bereitstellen für AKS

Um ein Modell für AKS bereitzustellen, erstellen Sie eine Bereitstellungskonfiguration, welche die erforderlichen Computeressourcen beschreibt. Dies sind beispielsweise die Anzahl von Kernen und die Arbeitsspeichergröße. Außerdem benötigen Sie eine Rückschlusskonfiguration, in der die zum Hosten des Modells und des Webdiensts erforderliche Umgebung beschrieben wird. Weitere Informationen zum Erstellen der Rückschlusskonfiguration finden Sie unter Wie und wo Modelle bereitgestellt werden.

Hinweis

Die Anzahl der bereitzustellenden Modelle ist auf 1.000 Modelle pro Bereitstellung (pro Container) beschränkt.

GILT FÜR: Python SDK azureml v1

from azureml.core.webservice import AksWebservice, Webservice
from azureml.core.model import Model
from azureml.core.compute import AksCompute

aks_target = AksCompute(ws,"myaks")
# 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 AML components.
deployment_config = AksWebservice.deploy_configuration(cpu_cores = 1, memory_gb = 1)
service = Model.deploy(ws, "myservice", [model], inference_config, deployment_config, aks_target)
service.wait_for_deployment(show_output = True)
print(service.state)
print(service.get_logs())

Weitere Informationen zu den in diesem Beispiel verwendeten Klassen, Methoden und Parametern finden Sie in den folgenden Referenzdokumenten:

Automatische Skalierung

GILT FÜR: Python SDK azureml v1

Die Komponente, die die automatische Skalierung für Implementierungen von Azure Machine Learning-Modellen behandelt, ist azureml-fe, ein intelligenter Anforderungsrouter. Da er von allen Rückschlussanforderungen durchlaufen wird, verfügt er über die zum automatischen Skalieren der bereitgestellten Modelle erforderlichen Daten.

Wichtig

  • Aktivieren Sie die horizontale automatische Kubernetes-Podskalierung (HPA) nicht für Modellbereitstellungen. Dies führt dazu, dass die beiden Komponenten für die automatische Skalierung miteinander konkurrieren würden. Azureml-fe ist für die automatische Skalierung von Modellen konzipiert, die von Azure Machine Learning bereitgestellt wurden. Dabei müsste HPA die Modellauslastung anhand einer generischen Metrik wie der CPU-Auslastung oder einer benutzerdefinierten Metrikkonfiguration erraten oder näherungsweise ermitteln.

  • Azureml-fe skaliert die Anzahl der Knoten in einem AKS-Cluster nicht, da dies zu unerwarteten Kostensteigerungen führen könnte. Stattdessen erfolgt eine Skalierung der Anzahl der Replikate für das Modell innerhalb der physischen Clustergrenzen. Wenn Sie die Anzahl der Knoten im Cluster skalieren müssen, können Sie den Cluster manuell skalieren oder die Autoskalierung von AKS-Clustern konfigurieren.

Die automatische Skalierung kann durch Festlegen von autoscale_target_utilization, autoscale_min_replicas und autoscale_max_replicas für den AKS-Webdienst gesteuert werden. Die Aktivierung der automatischen Skalierung wird im folgenden Beispiel veranschaulicht:

aks_config = AksWebservice.deploy_configuration(autoscale_enabled=True, 
                                                autoscale_target_utilization=30,
                                                autoscale_min_replicas=1,
                                                autoscale_max_replicas=4)

Entscheidungen zum Hoch- oder Herunterskalieren werden auf der Grundlage der Auslastung der aktuellen Containerreplikate getroffen. Zur Ermittlung der aktuellen Auslastung wird die Anzahl ausgelasteter Replikate (Replikate, die eine Anforderung verarbeiten) durch die Gesamtanzahl aktueller Replikate geteilt. Übersteigt dieser Wert autoscale_target_utilization, werden weitere Replikate erstellt. Wenn es niedriger ist, werden Replikate reduziert. Die Zielauslastung ist standardmäßig auf 70 Prozent festgelegt.

Entscheidungen zum Hinzufügen von Replikaten sind eifrig und schnell (ungefähr 1 Sekunde). Die Entscheidung, Replikate zu entfernen, erfolgt zurückhaltend (etwa 1 Minute).

Die erforderlichen Replikate können mithilfe des folgenden Codes berechnet werden:

from math import ceil
# target requests per second
targetRps = 20
# time to process the request (in seconds)
reqTime = 10
# Maximum requests per container
maxReqPerContainer = 1
# target_utilization. 70% in this example
targetUtilization = .7

concurrentRequests = targetRps * reqTime / targetUtilization

# Number of container replicas
replicas = ceil(concurrentRequests / maxReqPerContainer)

Weitere Informationen zum Festlegen von autoscale_target_utilization, autoscale_max_replicas und autoscale_min_replicas finden Sie in der Modulreferenz zu AksWebservice.

Webdienstauthentifizierung

Bei der Bereitstellung in Azure Kubernetes Service ist die schlüsselbasierte Authentifizierung standardmäßig aktiviert. Sie können auch die tokenbasierte Authentifizierung aktivieren. Die tokenbasierte Authentifizierung erfordert, dass Clients ein Microsoft Entra-Konto verwenden, um ein Authentifizierungstoken anzufordern, mit dem Anforderungen an den bereitgestellten Dienst gesendet werden.

Um die Authentifizierung zu deaktivieren, legen Sie den Parameter auth_enabled=False beim Erstellen der Bereitstellungskonfiguration fest. Im folgenden Beispiel wird die Authentifizierung mithilfe des SDKs deaktiviert:

deployment_config = AksWebservice.deploy_configuration(cpu_cores=1, memory_gb=1, auth_enabled=False)

Informationen zum Authentifizieren aus einer Clientanwendung finden Sie unter Nutzen eines als Webdienst bereitgestellten Azure Machine Learning-Modells.

Authentifizierung mit Schlüsseln

Bei aktivierter Schlüsselauthentifizierung können Sie mithilfe der Methode get_keys einen primären und einen sekundären Authentifizierungsschlüssel abrufen:

primary, secondary = service.get_keys()
print(primary)

Wichtig

Wenn Sie einen Schlüssel erneut generieren müssen, verwenden Sie service.regen_key.

Authentifizierung mit Tokens

Um die Tokenauthentifizierung zu aktivieren, legen Sie den token_auth_enabled=True Parameter fest, wenn Sie eine Bereitstellung erstellen oder aktualisieren. Im folgenden Beispiel wird die Authentifizierung mithilfe des SDKs aktiviert:

deployment_config = AksWebservice.deploy_configuration(cpu_cores=1, memory_gb=1, token_auth_enabled=True)

Bei aktivierter Tokenauthentifizierung können Sie mithilfe der Methode get_token ein JWT-Token und dessen Ablaufzeit abrufen:

token, refresh_by = service.get_token()
print(token)

Wichtig

Nach Ablauf der für refresh_by festgelegten Zeit müssen Sie ein neues Token anfordern.

Microsoft empfiehlt dringend, den Azure Machine Learning-Arbeitsbereich in der gleichen Region zu erstellen wie den AKS-Cluster. Im Zuge der Tokenauthentifizierung richtet der Webdienst einen Aufruf an die Region, in der Ihr Azure Machine Learning-Arbeitsbereich erstellt wird. Ist die Region Ihres Arbeitsbereichs nicht verfügbar, können Sie kein Token für Ihren Webdienst abrufen (auch dann nicht, wenn sich Ihr Cluster in einer anderen Region befindet als Ihr Arbeitsbereich). Die tokenbasierte Authentifizierung ist dann erst wieder verfügbar, wenn die Region Ihres Arbeitsbereichs wieder verfügbar wird. Außerdem wirkt sich die Entfernung zwischen der Region Ihres Clusters und der Region Ihres Arbeitsbereichs direkt auf die Tokenabrufdauer aus.

Zum Abrufen eines Tokens müssen Sie das Azure Machine Learning SDK oder den Befehl az ml service get-access-token verwenden.

Überprüfung auf Sicherheitsrisiken

Microsoft Defender for Cloud bietet eine einheitliche Sicherheitsverwaltung und erweiterten Bedrohungsschutz für Hybrid Cloud-Workloads. Sie sollten Microsoft Defender für Cloud erlauben, Ihre Ressourcen zu überprüfen, und die Empfehlungen befolgen. Weitere Informationen finden Sie unter Containersicherheit in Microsoft Defender für Container.