Behandeln von Problemen mit einer lokalen Modellimplementierung

Versuchen Sie es bei der Problembehandlung im Zusammenhang mit der Bereitstellung in Azure Container Instances (ACI) oder Azure Kubernetes Service (AKS) zunächst mit einer lokalen Modellimplementierung. Die Verwendung eines lokalen Webdiensts erleichtert die Erkennung und Behebung allgemeiner Fehler im Zusammenhang mit der Docker-Webdienstbereitstellung für Azure Machine Learning.

Voraussetzungen

  • Ein Azure-Abonnement. Probieren Sie die kostenlose oder kostenpflichtige Version von Azure Machine Learning aus.
  • Option A (empfohlen): lokales Debuggen in der Azure Machine Learning Compute-Instanz
    • Ein Azure Machine Learning-Arbeitsbereich mit einer ausgeführten Compute-Instanz
  • Option B: lokales Debuggen auf Ihrer Computeressource
  • Option C: Aktivieren des lokalen Debuggens mit einem HTTP-Rückschlussserver für Azure Machine Learning.
    • Der HTTP-Rückschlussserver von Azure Machine Learning ist ein Python-Paket, mit dem Sie Ihr Einstiegsskript (score.py) in einer lokalen Entwicklungsumgebung problemlos überprüfen können. Wenn ein Problem mit dem Bewertungsskript vorliegt, gibt der Server einen Fehler zurück. Außerdem wird die Position zurückgegeben, an der der Fehler aufgetreten ist.
    • Der Server kann auch verwendet werden, wenn Validierungsgates in einer Pipeline für Continuous Integration und Continuous Deployment erstellt werden. Starten Sie z. B. den Server mit dem Kandidatenskript, und führen Sie die Testsammlung für den lokalen Endpunkt aus.

HTTP-Rückschlussserver von Azure Machine Learning

Mit dem lokalen Rückschlussserver können Sie Ihr Eingabeskript (score.py) schnell debuggen. Falls das zugrunde liegende Bewertungsskript einen Fehler enthält, kann der Server das Modell nicht initialisieren oder bereitstellen. Stattdessen wird eine Ausnahme ausgelöst und der Ort angegeben, an dem die Probleme aufgetreten sind. Weitere Informationen zum HTTP-Rückschlussserver von Azure Machine Learning

  1. Installieren Sie das azureml-inference-server-http-Paket aus dem pypi-Feed:

    python -m pip install azureml-inference-server-http
    
  2. Starten Sie den Server, und legen Sie score.py als Einstiegsskript fest:

    azmlinfsrv --entry_script score.py
    
  3. Senden Sie eine Bewertungsanforderung mithilfe von curl an den Server:

    curl -p 127.0.0.1:5001/score
    

Hinweis

Erfahren Sie mehr über häufig gestellte Fragen zum Azure Machine Learning Inference HTTP Server.

Lokales Debuggen

Im Repository MachineLearningNotebooks finden Sie ein beispielhaftes lokales Bereitstellungsnotebook, das Sie erkunden können.

Warnung

Bereitstellungen lokaler Webdienste werden nicht für Produktionsszenarien unterstützt.

Ändern Sie zum lokalen Bereitstellen Ihren Code so, dass LocalWebservice.deploy_configuration() zum Erstellen einer Bereitstellungskonfiguration verwendet wird. Verwenden Sie dann Model.deploy(), um den Dienst bereitzustellen. Im folgenden Beispiel wird ein (in der Modellvariablen enthaltenes) Modell als lokaler Webdienst bereitgestellt:

GILT FÜR: Python SDK azureml v1

from azureml.core.environment import Environment
from azureml.core.model import InferenceConfig, Model
from azureml.core.webservice import LocalWebservice


# Create inference configuration based on the environment definition and the entry script
myenv = Environment.from_conda_specification(name="env", file_path="myenv.yml")
inference_config = InferenceConfig(entry_script="score.py", environment=myenv)
# Create a local deployment, using port 8890 for the web service endpoint
deployment_config = LocalWebservice.deploy_configuration(port=8890)
# Deploy the service
service = Model.deploy(
    ws, "mymodel", [model], inference_config, deployment_config)
# Wait for the deployment to complete
service.wait_for_deployment(True)
# Display the port that the web service is available on
print(service.port)

Wenn Sie Ihre eigene YAML-Datei für die Conda-Spezifikation definieren, listen Sie „azureml-defaults“ mit einer Version >= 1.0.45 als Pip-Abhängigkeit auf. Dieses Paket ist erforderlich, um das Modell als Webdienst zu hosten.

An diesem Punkt können Sie mit dem Dienst wie gewohnt arbeiten. Der folgende Code zeigt, wie Daten an den Dienst gesendet werden:

import 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]
]})

test_sample = bytes(test_sample, encoding='utf8')

prediction = service.run(input_data=test_sample)
print(prediction)

Weitere Informationen zur Anpassung Ihrer Python-Umgebung finden Sie unter Erstellen und Verwalten von Umgebungen für Training und Bereitstellung.

Aktualisieren des Diensts

Beim lokalen Testen müssen Sie möglicherweise die score.py-Datei aktualisieren, um die Protokollierung hinzuzufügen oder ggf. zu versuchen, alle Probleme zu behandeln, die Sie ermittelt haben. Zum erneuten Laden von Änderungen an der score.py-Datei verwenden Sie reload(). Der folgende Code lädt z.B. das Skript für den Dienst neu und sendet dann Daten an ihn. Die Daten werden mithilfe der aktualisierten score.py-Datei bewertet:

Wichtig

Die Methode reload ist nur für lokale Bereitstellungen verfügbar. Informationen zum Aktualisieren einer Bereitstellung auf ein anderes Computeziel finden Sie unter Aktualisieren von Webdiensten.

service.reload()
print(service.run(input_data=test_sample))

Hinweis

Das Skript wird aus dem Speicherort erneut geladen, der durch das vom Dienst verwendete InferenceConfig-Objekt angegeben wird.

Um das Modell, Conda-Abhängigkeiten oder eine Bereitstellungskonfiguration zu ändern, verwenden Sie update(). Das folgende Beispiel aktualisiert das vom Dienst verwendete Modell:

service.update([different_model], inference_config, deployment_config)

Löschen des Diensts

Verwenden Sie zum Löschen des Diensts delete().

Untersuchen des Docker-Protokolls

Das Dienstobjekt erlaubt die Ausgabe von detaillierten Protokollnachrichten der Docker-Engine. Sie können das Protokoll für ACI, AKS und lokale Bereitstellungen anzeigen. Die Ausgabe der Protokolle wird im folgenden Beispiel veranschaulicht.

# if you already have the service object handy
print(service.get_logs())

# if you only know the name of the service (note there might be multiple services with the same name but different version number)
print(ws.webservices['mysvc'].get_logs())

Wenn die Zeile Booting worker with pid: <pid> in den Protokollen mehrmals angezeigt wird, ist nicht ausreichend Arbeitsspeicher vorhanden, um den Worker zu starten. Sie können den Fehler beheben, indem Sie den Wert von memory_gb in deployment_config ändern.

Nächste Schritte

Weitere Informationen zur Bereitstellung finden Sie hier: