Bereitstellen eines Machine Learning-Modells in Azure App Service (Vorschauversion)

Hier erfahren Sie, wie Sie ein Modell in Azure Machine Learning als Web-App in Azure App Service bereitstellen.

Wichtig

Azure Machine Learning und Azure App Service sind zwar allgemein verfügbar, die Funktion zum Bereitstellen eines Modells über Machine Learning in App Service befindet sich jedoch in der Vorschauphase.

Mit Azure Machine Learning können Sie Docker-Images auf der Grundlage trainierter Machine Learning-Modelle erstellen. Dieses Image enthält einen Webdienst, der Daten empfängt und an das Modell übermittelt und anschließend die Antwort zurückgibt. Azure App Service kann zum Bereitstellen des Images verwendet werden und bietet die folgenden Features:

  • Erweiterte Authentifizierung für höhere Sicherheit. Zu den Authentifizierungsmethoden zählen Azure Active Directory und mehrstufige Authentifizierung.
  • Autoskalierung ohne erneute Bereitstellung
  • TLS-Unterstützung für die sichere Kommunikation zwischen Clients und dem Dienst

Weitere Informationen zu den Features von Azure App Service finden Sie unter App Service: Übersicht.

Wichtig

Wenn die mit dem bereitgestellten Modell verwendeten Bewertungsdaten oder die Ergebnisse der Bewertung protokolliert werden sollen, sollten Sie die Bereitstellung stattdessen in Azure Kubernetes Service durchführen. Weitere Informationen finden Sie unter Sammeln von Daten zu Ihren Produktionsmodellen.

Voraussetzungen

Vorbereiten der Bereitstellung

Vor der Bereitstellung müssen Sie die Elemente definieren, die zum Ausführen des Modells als Webdienst erforderlich sind. Die folgende Liste beschreibt die wesentlichen für eine Bereitstellung erforderlichen Elemente:

  • Ein Eingabeskript. Dieses Skript akzeptiert Anforderungen, bewertet die Anforderung mithilfe des Modells und gibt die Ergebnisse zurück.

    Wichtig

    Das Eingabeskript ist spezifisch für Ihr Modell. Es muss das Format der Daten der eingehenden Anforderung, das Format der im Modell erwarteten Daten und das Format der an Clients zurückgegebenen Daten erkennen.

    Wenn die Anforderungsdaten in einem Format vorliegen, das in Ihrem Modell nicht verwendet werden kann, können sie im Skript in ein akzeptables Format umgewandelt werden. Außerdem kann die Antwort umgewandelt werden, bevor sie an den Client zurückgegeben wird.

    Wichtig

    Das Azure Machine Learning SDK bietet keine Möglichkeit des Zugriffs auf Ihren Datenspeicher oder Ihre Datasets durch den Webdienst. Wenn das bereitgestellte Modell auf Daten zugreifen muss, die außerhalb der Bereitstellung gespeichert sind – wie z.B. in einem Azure Storage-Konto –, müssen Sie mit dem entsprechenden SDK eine benutzerdefinierte Codelösung entwickeln. Ein Beispiel hierfür ist das Azure Storage SDK für Python.

    Eine andere Alternative, die in Ihrem Szenario funktionieren könnte, ist die Batchvorhersage, die beim Erstellen von Bewertungen Zugriff auf Datenspeicher bietet.

    Weitere Informationen zu Eingabeskripts finden Sie unter Bereitstellen von Modellen mit Azure Machine Learning.

  • Abhängigkeiten, z. B. Hilfsprogramme oder Python/Conda-Pakete, die zum Ausführen des Eingabeskripts oder Modells erforderlich sind

Diese Entitäten werden in einer Rückschlusskonfiguration gekapselt. Die Rückschlusskonfiguration verweist auf das Eingabeskript und andere Abhängigkeiten.

Wichtig

Beim Erstellen einer Rückschlusskonfiguration zur Verwendung mit Azure App Service müssen Sie ein Environment-Objekt verwenden. Beachten Sie, dass Sie beim Definieren einer benutzerdefinierten Umgebung azureml-defaults mit Version > = 1.0.45 als Pip-Abhängigkeit hinzufügen müssen. Dieses Paket enthält die erforderlichen Funktionen zum Hosten des Modells als Webdienst. Im folgenden Beispiel wird veranschaulicht, wie ein Environment-Objekt erstellt und mit einer Rückschlusskonfiguration verwendet wird:

from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies
from azureml.core.model import InferenceConfig

# Create an environment and add conda dependencies to it
myenv = Environment(name="myenv")
# Enable Docker based environment
myenv.docker.enabled = True
# Build conda dependencies
myenv.python.conda_dependencies = CondaDependencies.create(conda_packages=['scikit-learn'],
                                                           pip_packages=['azureml-defaults'])
inference_config = InferenceConfig(entry_script="score.py", environment=myenv)

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

Weitere Informationen zur Rückschlusskonfiguration finden Sie unter Bereitstellen von Modellen mit Azure Machine Learning.

Wichtig

Bei der Bereitstellung in Azure App Service müssen Sie keine Bereitstellungskonfiguration erstellen.

Erstellen des Images

Verwenden Sie Model.package, um das Docker-Image zu erstellen, das in Azure App Service bereitgestellt wird. Der folgende Codeausschnitt veranschaulicht, wie ein neues Image aus dem Modell und der Rückschlusskonfiguration erstellt wird:

Hinweis

Im Codeausschnitt wird davon ausgegangen, dass model ein registriertes Modell und inference_config die Konfiguration für die Rückschlussumgebung enthält. Weitere Informationen finden Sie unter Bereitstellen von Modellen mit Azure Machine Learning.

from azureml.core import Model

package = Model.package(ws, [model], inference_config)
package.wait_for_creation(show_output=True)
# Display the package location/ACR path
print(package.location)

Bei show_output=True wird die Ausgabe des Docker-Buildprozesses angezeigt. Nach Abschluss des Prozesses wurde das Image in der Azure Container Registry-Instanz für Ihren Arbeitsbereich erstellt. Nachdem das Image erstellt wurde, wird der Speicherort in Ihrer Instanz von Azure Container Registry angezeigt. Der zurückgegebene Speicherort weist das Format <acrinstance>.azurecr.io/package@sha256:<imagename> auf. Beispiel: myml08024f78fd10.azurecr.io/package@sha256:20190827151241.

Wichtig

Speichern Sie die Speicherortinformationen, da sie beim Bereitstellen des Images verwendet werden.

Bereitstellen eines Images als Web-App

  1. Verwenden Sie den folgenden Befehl, um die Anmeldeinformationen für die Azure Container Registry-Instanz zu erhalten, die das Image enthält. Ersetzen Sie <acrinstance> durch den zuvor von package.location zurückgegebenen Wert:

    az acr credential show --name <myacr>
    

    Die Ausgabe dieses Befehls ähnelt dem folgenden JSON-Dokument:

    {
    "passwords": [
        {
        "name": "password",
        "value": "Iv0lRZQ9762LUJrFiffo3P4sWgk4q+nW"
        },
        {
        "name": "password2",
        "value": "=pKCxHatX96jeoYBWZLsPR6opszr==mg"
        }
    ],
    "username": "myml08024f78fd10"
    }
    

    Speichern Sie die Werte für Benutzername und eines der Kennwörter.

  2. Wenn Sie noch nicht über eine Ressourcengruppe oder einen App Service-Plan für die Bereitstellung des Diensts verfügen, veranschaulichen die folgenden Befehle das Erstellen dieser beiden Elemente:

    az group create --name myresourcegroup --location "West Europe"
    az appservice plan create --name myplanname --resource-group myresourcegroup --sku B1 --is-linux
    

    In diesem Beispiel wird der Basic-Tarif (--sku B1) verwendet.

    Wichtig

    Die von Azure Machine Learning erstellten Images verwenden Linux, daher müssen Sie den Parameter --is-linux verwenden.

  3. Verwenden Sie den folgenden Befehl, um die neue Web-App zu erstellen. Ersetzen Sie <app-name> durch den Namen, den Sie verwenden möchten. Ersetzen Sie <acrinstance> und <imagename> durch die zuvor von package.location zurückgegebenen Werte:

    az webapp create --resource-group myresourcegroup --plan myplanname --name <app-name> --deployment-container-image-name <acrinstance>.azurecr.io/package@sha256:<imagename>
    

    Dieser Befehl gibt Informationen ähnlich dem folgenden JSON-Dokument zurück:

    {
    "adminSiteName": null,
    "appServicePlanName": "myplanname",
    "geoRegion": "West Europe",
    "hostingEnvironmentProfile": null,
    "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myplanname",
    "kind": "linux",
    "location": "West Europe",
    "maximumNumberOfWorkers": 1,
    "name": "myplanname",
    < JSON data removed for brevity. >
    "targetWorkerSizeId": 0,
    "type": "Microsoft.Web/serverfarms",
    "workerTierName": null
    }
    

    Wichtig

    An diesem Punkt wurde die Web-App erstellt. Da Sie keine Anmeldeinformationen für die Azure Container Registry-Instanz mit dem Image angegeben haben, ist die Web-App jedoch nicht aktiv. Im nächsten Schritt geben Sie die Authentifizierungsinformationen für die Containerregistrierung an.

  4. Verwenden Sie den folgenden Befehl, um die für den Zugriff auf die Containerregistrierung erforderlichen Anmeldeinformationen für die Web-App bereitzustellen. Ersetzen Sie <app-name> durch den Namen, den Sie verwenden möchten. Ersetzen Sie <acrinstance> und <imagename> durch die zuvor von package.location zurückgegebenen Werte. Ersetzen Sie <username> und <password> durch die zuvor abgerufenen ACR-Anmeldeinformationen:

    az webapp config container set --name <app-name> --resource-group myresourcegroup --docker-custom-image-name <acrinstance>.azurecr.io/package@sha256:<imagename> --docker-registry-server-url https://<acrinstance>.azurecr.io --docker-registry-server-user <username> --docker-registry-server-password <password>
    

    Dieser Befehl gibt Informationen ähnlich dem folgenden JSON-Dokument zurück:

    [
    {
        "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
        "slotSetting": false,
        "value": "false"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_URL",
        "slotSetting": false,
        "value": "https://myml08024f78fd10.azurecr.io"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_USERNAME",
        "slotSetting": false,
        "value": "myml08024f78fd10"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_PASSWORD",
        "slotSetting": false,
        "value": null
    },
    {
        "name": "DOCKER_CUSTOM_IMAGE_NAME",
        "value": "DOCKER|myml08024f78fd10.azurecr.io/package@sha256:20190827195524"
    }
    ]
    

Zu diesem Zeitpunkt beginnt die Web-App mit dem Laden des Images.

Wichtig

Es kann einige Minuten dauern, bis das Image geladen wurde. Sie können den Fortschritt mithilfe des folgenden Befehls überwachen:

az webapp log tail --name <app-name> --resource-group myresourcegroup

Nachdem das Image geladen wurde und die Website aktiv ist, wird im Protokoll die Meldung Container <container name> for site <app-name> initialized successfully and is ready to serve requests angezeigt.

Nachdem das Image bereitgestellt wurde, können Sie den Hostnamen mit dem folgenden Befehl ermitteln:

az webapp show --name <app-name> --resource-group myresourcegroup

Dieser Befehl gibt Informationen ähnlich dem folgenden Hostnamen zurück: <app-name>.azurewebsites.net. Verwenden Sie diesen Wert als Teil der Basis-URL für den Dienst.

Verwenden der Web-App

Der Webdienst, der Anforderungen an das Modell übergibt, befindet sich unter {baseurl}/score. Beispiel: https://<app-name>.azurewebsites.net/score. Der folgende Python-Code veranschaulicht, wie Sie Daten an die URL übermitteln und die Antwort anzeigen:

import requests
import json

scoring_uri = "https://mywebapp.azurewebsites.net/score"

headers = {'Content-Type':'application/json'}

test_sample = json.dumps({'data': [
    [1,2,3,4,5,6,7,8,9,10],
    [10,9,8,7,6,5,4,3,2,1]
]})

response = requests.post(scoring_uri, data=test_sample, headers=headers)
print(response.status_code)
print(response.elapsed)
print(response.json())

Nächste Schritte