Freigeben über


Debuggen von Bewertungsskripts mithilfe des HTTP-Servers für Azure Machine Learning

Der HTTP-Rückschlussserver von Azure Machine Learning ist ein Python-Paket, das Ihre Bewertungsfunktion als HTTP-Endpunkt verfügbar macht und den Flask-Servercode und die Abhängigkeiten in ein einzelnes Paket packt. Der Ableitungsserver ist in den vordefinierten Docker-Images für die Ableitung enthalten, die verwendet werden, wenn Sie ein Modell in Azure Machine Learning bereitstellen. Wenn Sie das Paket allein verwenden, können Sie das Modell lokal für die Produktion bereitstellen. Sie können Ihr Bewertungsskript (Eintrag) auch einfach in einer lokalen Entwicklungsumgebung überprüfen. Wenn ein Problem mit dem Bewertungsskript vorliegt, gibt der Ableitungsserver einen Fehler und den Speicherort des Fehlers zurück.

Sie können auch den Rückschlussserver verwenden, um Validierungsgates in einer kontinuierlichen Integrations- und Bereitstellungspipeline zu erstellen. Sie können z. B. den Rückschlussserver mit dem Kandidatenskript starten und die Testsuite für den lokalen Endpunkt ausführen.

Dieser Artikel unterstützt Entwickler, die den Rückschlussserver zum lokalen Debuggen verwenden möchten. In diesem Artikel erfahren Sie, wie Sie den Rückschlussserver mit Onlineendpunkten verwenden.

Voraussetzungen

  • Python 3.8 oder höher
  • Anakonda

Der Ableitungsserver wird auf Windows- und Linux-basierten Betriebssystemen ausgeführt.

Erkunden lokaler Debuggingoptionen für Onlineendpunkte

Indem Sie Endpunkte lokal debuggen, bevor Sie sie in der Cloud bereitstellen, können Sie Fehler in Ihrem Code und ihrer Konfiguration frühzeitig abfangen. Um Endpunkte lokal zu debuggen, haben Sie mehrere Optionen, unter anderem:

In der folgenden Tabelle finden Sie eine Übersicht über die Unterstützung, die jede Option für verschiedene Debugszenarien bietet:

Szenario Ableitungsserver Lokaler Endpunkt
Aktualisieren der lokalen Python-Umgebung ohne Neuerstellung des Docker-Images Ja Nein
Aktualisieren des Bewertungsskripts Ja Ja
Aktualisieren von Bereitstellungskonfigurationen (Bereitstellung, Umgebung, Code, Modell) Nein Ja
Integrieren von Microsoft Visual Studio Code (VS Code)-Debugger Ja Ja

In diesem Artikel wird beschrieben, wie Sie den Rückschlussserver verwenden.

Wenn Sie den Rückschlussserver lokal ausführen, können Sie sich auf das Debuggen Ihres Bewertungsskripts konzentrieren, ohne dass es um Bereitstellungscontainerkonfigurationen geht.

Lokales Debuggen des Bewertungsskripts

Um Ihr Bewertungsskript lokal zu debuggen, haben Sie mehrere Optionen zum Testen des Ableitungsserververhaltens:

In den folgenden Abschnitten finden Sie Informationen zu den einzelnen Optionen.

Verwenden eines Dummy-Bewertungsskripts zum Testen des Ableitungsserververhaltens

  1. Erstellen Sie ein Verzeichnis mit dem Namen server_quickstart, um Ihre Dateien zu speichern:

    mkdir server_quickstart
    cd server_quickstart
    
  2. Um Paketkonflikte zu vermeiden, erstellen Sie eine virtuelle Umgebung, wie myenv, und aktivieren Sie sie:

    python -m virtualenv myenv
    

    Hinweis

    Führen Sie unter Linux den Befehl source myenv/bin/activate aus, um die virtuelle Umgebung zu aktivieren.

    Nachdem Sie den Rückschlussserver getestet haben, können Sie den deactivate Befehl ausführen, um die virtuelle Python-Umgebung zu deaktivieren.

  3. Installieren Sie das azureml-inference-server-http Paket aus dem Python Package Index (PyPI) -Feed:

    python -m pip install azureml-inference-server-http
    
  4. Erstellen Sie Ihr Einstiegsskript. Im folgenden Beispiel wird ein grundlegendes Eintragsskript erstellt und in einer Datei namens score.py gespeichert:

    echo -e 'import time\ndef init(): \n\ttime.sleep(1) \n\ndef run(input_data): \n\treturn {"message":"Hello, World!"}' > score.py
    
  5. Verwenden Sie den azmlinfsrv Befehl, um den Rückschlussserver zu starten und die score.py Datei als Eintragsskript festzulegen:

    azmlinfsrv --entry_script score.py
    

    Hinweis

    Der Rückschlussserver wird auf 0.0.0.0.0 gehostet, was bedeutet, dass er alle IP-Adressen des Hostingcomputers überwacht.

  6. Verwenden Sie das curl Hilfsprogramm, um eine Bewertungsanforderung an den Ableitungsserver zu senden:

    curl -p 127.0.0.1:5001/score
    

    Der Rückschlussserver sendet die folgende Antwort:

    {"message": "Hello, World!"}
    
  7. Wenn Sie den Test abgeschlossen haben, wählen Sie STRG+C aus, um den Rückschlussserver zu beenden.

Sie können die score.py Bewertungsskriptdatei ändern. Anschließend können Sie Ihre Änderungen testen, indem Sie den azmlinfsrv --entry_script score.py Befehl verwenden, um den Rückschlussserver erneut auszuführen.

Integrieren mit VS Code

In VS Code können Sie die Python-Erweiterung zum Debuggen mit dem azureml-inference-server-http-Paket verwenden. VS Code bietet zwei Modi zum Debuggen: Starten und Anfügen.

Bevor Sie einen der beiden Modus verwenden, installieren Sie das azureml-inference-server-http Paket, indem Sie den folgenden Befehl ausführen:

python -m pip install azureml-inference-server-http

Hinweis

Um Paketkonflikte zu vermeiden, installieren Sie den Rückschlussserver in einer virtuellen Umgebung. Sie können den pip install virtualenv Befehl verwenden, um virtuelle Umgebungen für Ihre Konfiguration zu aktivieren.

Startmodus

Führen Sie für den Startmodus die folgenden Schritte aus, um die VS Code-konfigurationsdatei launch.json einzurichten und den Rückschlussserver in VS Code zu starten:

  1. Starten Sie VS Code, und öffnen Sie den Ordner, der das skript score.py enthält.

  2. Fügen Sie für diesen Arbeitsbereich in VS Code der launch.json Datei die folgende Konfiguration hinzu:

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Debug score.py",
                "type": "debugpy",
                "request": "launch",
                "module": "azureml_inference_server_http.amlserver",
                "args": [
                    "--entry_script",
                    "score.py"
                ]
            }
        ]
      }
    
  3. Starten Sie die Debugsitzung in VS Code, indem Sie "Debuggen starten"> oder "F5" auswählen.

Anfügemodus

Führen Sie für den Anfügungsmodus die folgenden Schritte aus, um VS Code mit der Python-Erweiterung zum Anfügen an den Ableitungsserverprozess zu verwenden:

Hinweis

Installieren Sie unter Linux zunächst das Paket gdb, indem Sie den Befehl sudo apt-get install -y gdb ausführen.

  1. Starten Sie VS Code, und öffnen Sie den Ordner, der das skript score.py enthält.

  2. Fügen Sie für diesen Arbeitsbereich in VS Code der launch.json Datei die folgende Konfiguration hinzu:

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Python: Attach using Process ID",
                "type": "debugpy",
                "request": "attach",
                "processId": "${command:pickProcess}",
                "justMyCode": true
            }
        ]
      }
    
  3. Starten Sie in einem Befehlsfenster den Ableitungsserver, indem Sie den azmlinfsrv --entry_script score.py Befehl ausführen.

  4. Führen Sie die folgenden Schritte aus, um die Debugsitzung in VS Code zu starten:

    1. Wählen Sie "Debuggen starten"> aus, oder wählen Sie "F5" aus.

    2. Durchsuchen Sie im Befehlsfenster die Protokolle vom Ableitungsserver, um die Prozess-ID des azmlinfsrv Prozesses zu suchen:

      Screenshot eines Befehlsfensters mit Ableitungsserverprotokollen. In einer Log-Anweisung wird die Prozess-ID des Befehls azmlinfsrv hervorgehoben.

      Suchen Sie unbedingt die ID des azmlinfsrv Prozesses, nicht den gunicorn Prozess.

    3. Geben Sie im VS Code-Debugger die ID des azmlinfsrv Prozesses ein.

      Wenn die VS Code-Prozessauswahl nicht angezeigt wird, geben Sie die Prozess-ID manuell in das Feld processId der Datei „launch.json“ für diesen Arbeitsbereich ein.

Zum Starten und Anfügen von Modi können Sie Haltepunkte festlegen und das Skript schrittweise debuggen.

Verwenden eines End-to-End-Beispiels

Im folgenden Verfahren wird der Ableitungsserver lokal mit Beispieldateien aus dem Azure Machine Learning-Beispiel-Repository ausgeführt. Die Beispieldateien umfassen ein Bewertungsskript, eine Modelldatei und eine Umgebungsdatei. Weitere Beispiele zur Verwendung dieser Beispieldateien finden Sie unter Bereitstellen und Bewerten eines Machine Learning-Modells mithilfe eines Onlineendpunkts.

  1. Klonen Sie das Beispielrepository, und wechseln Sie zu dem Ordner, der die relevanten Beispieldateien enthält:

    git clone --depth 1 https://github.com/Azure/azureml-examples
    cd azureml-examples/cli/endpoints/online/model-1/
    
  2. Verwenden Sie Conda zum Erstellen und Aktivieren einer virtuellen Umgebung:

    In diesem Beispiel wird das Paket azureml-inference-server-http automatisch installiert. Das Paket ist als abhängige Bibliothek des azureml-defaults Pakets enthalten, das in der Datei "conda.yaml" aufgeführt ist.

    # Create the environment from the YAML file.
    conda env create --name model-env -f ./environment/conda.yaml
    # Activate the new environment.
    conda activate model-env
    
  3. Überprüfen Sie das Bewertungsskript, onlinescoring/score.py:

    import os
    import logging
    import json
    import numpy
    import joblib
    
    
    def init():
        """
        This function is called when the container is initialized/started, typically after create/update of the deployment.
        You can write the logic here to perform init operations like caching the model in memory
        """
        global model
        # AZUREML_MODEL_DIR is an environment variable created during deployment.
        # It is the path to the model folder (./azureml-models/$MODEL_NAME/$VERSION)
        # Please provide your model's folder name if there is one
        model_path = os.path.join(
            os.getenv("AZUREML_MODEL_DIR"), "model/sklearn_regression_model.pkl"
        )
        # deserialize the model file back into a sklearn model
        model = joblib.load(model_path)
        logging.info("Init complete")
    
    
    def run(raw_data):
        """
        This function is called for every invocation of the endpoint to perform the actual scoring/prediction.
        In the example we extract the data from the json input and call the scikit-learn model's predict()
        method and return the result back
        """
        logging.info("model 1: request received")
        data = json.loads(raw_data)["data"]
        data = numpy.array(data)
        result = model.predict(data)
        logging.info("Request processed")
        return result.tolist()
    
  4. Führen Sie den Rückschlussserver aus, indem Sie das Bewertungsskript und den Pfad zum Modellordner angeben.

    Während der Bereitstellung wird die AZUREML_MODEL_DIR Variable definiert, um den Pfad zum Modellordner zu speichern. Sie geben diesen Wert im model_dir Parameter an. Wenn das Bewertungsskript ausgeführt wird, ruft es den Wert aus der AZUREML_MODEL_DIR Variablen ab.

    Verwenden Sie in diesem Fall das aktuelle Verzeichnis ./ als model_dir-Wert, da das Bewertungsskript das Unterverzeichnis als model/sklearn_regression_model.pkl angibt.

    azmlinfsrv --entry_script ./onlinescoring/score.py --model_dir ./
    

    Wenn der Rückschlussserver gestartet und erfolgreich das Bewertungsskript aufruft, wird das Beispielstartprotokoll geöffnet. Andernfalls zeigt das Protokoll Fehlermeldungen an.

  5. Testen Sie das Bewertungsskript mit Beispieldaten, indem Sie die folgenden Schritte ausführen:

    1. Öffnen Sie ein weiteres Befehlsfenster, und wechseln Sie zum gleichen Arbeitsverzeichnis, in dem Sie den azmlinfsrv Befehl ausgeführt haben.

    2. Verwenden Sie das folgende curl Hilfsprogramm, um eine Beispielanforderung an den Ableitungsserver zu senden und ein Bewertungsergebnis zu erhalten:

      curl --request POST "127.0.0.1:5001/score" --header "Content-Type:application/json" --data @sample-request.json
      

      Wenn in Ihrem Bewertungsskript keine Probleme bestehen, gibt das Skript das Bewertungsergebnis zurück. Wenn Probleme auftreten, können Sie das Bewertungsskript aktualisieren und dann den Rückschlussserver erneut starten, um das aktualisierte Skript zu testen.

Überprüfung der Inferenz-Serverpfade

Der Rückschlussserver lauscht standardmäßig auf Port 5001 an den folgenden Routen:

Name Route
Livetest 127.0.0.1:5001/
Ergebnis 127.0.0.1:5001/score
OpenAPI (Swagger) 127.0.0.1:5001/swagger.json

Überprüfen von Ableitungsserverparametern

Der Rückschlussserver akzeptiert die folgenden Parameter:

Parameter Erforderlich Standard Beschreibung
entry_script Richtig N/V Gibt den relativen oder absoluten Pfad zum Bewertungsskript an.
model_dir Falsch N/V Gibt den relativen oder absoluten Pfad zum Verzeichnis an, das das modell enthält, das für die Ableitung verwendet wird.
port Falsch 5001 Gibt den Dienstport des Ableitungsservers an.
worker_count Falsch 1 Gibt die Anzahl von Workerthreads an, die gleichzeitige Anforderungen verarbeiten
appinsights_instrumentation_key Falsch N/V Stellt den Instrumentierungsschlüssel für die Instanz von Application Insights bereit, in der die Protokolle veröffentlicht werden.
access_control_allow_origins Falsch N/V Aktiviert die CORS für die angegebenen Quellen, wobei mehrere Quellen durch ein Komma (,) getrennt werden, wie z. B. microsoft.com, bing.com.

Erforschen der Anfrageverarbeitung bei Inferenzservern

Die folgenden Schritte veranschaulichen, azmlinfsrvwie der Ableitungsserver eingehende Anforderungen verarbeitet:

  1. Ein Python CLI-Wrapper befindet sich um den Netzwerkstapel des Inference-Servers und wird verwendet, um den Rückschlussserver zu starten.

  2. Ein Client sendet eine Anforderung an den Rückschlussserver.

  3. Der Rückschlussserver sendet die Anforderung über den WSGI-Server (Web Server Gateway Interface ), der die Anforderung an eine der folgenden Flask-Workeranwendungen sendet:

  4. Die Flask-Workeranwendung verarbeitet die Anforderung, einschließlich des Ladens des Einstiegsskripts und aller Abhängigkeiten.

  5. Ihr Einstiegsskript empfängt die Anforderung. Das Eingabeskript führt einen Rückschluss auf das geladene Modell und gibt eine Antwort zurück.

Diagramm, das zeigt, wie der Ableitungsserver gestartet wird und wie eine Anforderung zu einer Flask-Worker-App und dann zum Benutzercode fließt.

Erkunden von Rückschlussserverprotokollen

Es gibt zwei Möglichkeiten zum Abrufen von Protokolldaten für den Ableitungsservertest:

  • Führen Sie das azureml-inference-server-http Paket lokal aus, und zeigen Sie die Protokollausgabe an.
  • Verwenden Sie Onlineendpunkte, und zeigen Sie die Containerprotokolle an. Das Protokoll für den Rückschlussserver hat den Namen HTTP-Rückschlussserver für Azure Machine Learning <Version>.

Hinweis

Das Protokollierungsformat wurde seit Version 0.8.0 geändert. Wenn Ihr Protokoll einen anderen als den erwarteten Stil aufweist, aktualisieren Sie das Paket azureml-inference-server-http auf die neueste Version.

Anzeigen der Startprotokolle

Wenn der Ableitungsserver gestartet wird, werden in den Protokollen die folgenden anfänglichen Servereinstellungen angezeigt:

Azure ML Inferencing HTTP server <version>


Server Settings
---------------
Entry Script Name: <entry-script>
Model Directory: <model-directory>
Config File: <configuration-file>
Worker Count: <worker-count>
Worker Timeout (seconds): None
Server Port: <port>
Health Port: <port>
Application Insights Enabled: false
Application Insights Key: <Application-Insights-instrumentation-key>
Inferencing HTTP server version: azmlinfsrv/<version>
CORS for the specified origins: <access-control-allow-origins>
Create dedicated endpoint for health: <health-check-endpoint>


Server Routes
---------------
Liveness Probe: GET   127.0.0.1:<port>/
Score:          POST  127.0.0.1:<port>/score

<logs>

Wenn Sie beispielsweise den Ableitungsserver ausführen, indem Sie die End-to-End-Beispielschritte ausführen, enthalten die Protokolle die folgenden Informationen:

Azure ML Inferencing HTTP server v1.2.2


Server Settings
---------------
Entry Script Name: /home/user-name/azureml-examples/cli/endpoints/online/model-1/onlinescoring/score.py
Model Directory: ./
Config File: None
Worker Count: 1
Worker Timeout (seconds): None
Server Port: 5001
Health Port: 5001
Application Insights Enabled: false
Application Insights Key: None
Inferencing HTTP server version: azmlinfsrv/1.2.2
CORS for the specified origins: None
Create dedicated endpoint for health: None

Server Routes
---------------
Liveness Probe: GET   127.0.0.1:5001/
Score:          POST  127.0.0.1:5001/score

2022-12-24 07:37:53,318 I [32726] gunicorn.error - Starting gunicorn 20.1.0
2022-12-24 07:37:53,319 I [32726] gunicorn.error - Listening at: http://0.0.0.0:5001 (32726)
2022-12-24 07:37:53,319 I [32726] gunicorn.error - Using worker: sync
2022-12-24 07:37:53,322 I [32756] gunicorn.error - Booting worker with pid: 32756
Initializing logger
2022-12-24 07:37:53,779 I [32756] azmlinfsrv - Starting up app insights client
2022-12-24 07:37:54,518 I [32756] azmlinfsrv.user_script - Found user script at /home/user-name/azureml-examples/cli/endpoints/online/model-1/onlinescoring/score.py
2022-12-24 07:37:54,518 I [32756] azmlinfsrv.user_script - run() is not decorated. Server will invoke it with the input in JSON string.
2022-12-24 07:37:54,518 I [32756] azmlinfsrv.user_script - Invoking user's init function
2022-12-24 07:37:55,974 I [32756] azmlinfsrv.user_script - Users's init has completed successfully
2022-12-24 07:37:55,976 I [32756] azmlinfsrv.swagger - Swaggers are prepared for the following versions: [2, 3, 3.1].
2022-12-24 07:37:55,976 I [32756] azmlinfsrv - Scoring timeout is set to 3600000
2022-12-24 07:37:55,976 I [32756] azmlinfsrv - Worker with pid 32756 ready for serving traffic

Verstehen des Protokolldatenformats

Alle Protokolle vom Ableitungsserver, mit Ausnahme des Startprogrammskripts, präsentieren Daten im folgenden Format:

<UTC-time> <level> [<process-ID>] <logger-name> - <message>

Jeder Eintrag besteht aus den folgenden Komponenten:

  • <UTC-time>: Der Zeitpunkt, zu dem der Eintrag in das Protokoll eingegeben wird
  • <level>: Das erste Zeichen der Protokollierungsebene für den Eintrag, z. B. E für FEHLER, I für INFO usw.
  • <process-ID>: Die ID des Prozesses, der dem Eintrag zugeordnet ist
  • <logger-name>: Der Name der Ressource, die dem Protokolleintrag zugeordnet ist
  • <message>: Der Inhalt der Protokollnachricht

Es gibt sechs Protokollierungsebenen in Python. Jede Ebene weist entsprechend ihrem Schweregrad einen zugewiesenen numerischen Wert auf:

Protokolliergrad Numerischer Wert
KRITISCH 50
40
WARNUNG 30
INFORMATIONEN 20
DEBUG 10
NOTSET 0

Problembehandlung beim Rückschlussserver

In den folgenden Abschnitten finden Sie grundlegende Tipps zur Problembehandlung für den Rückschlussserver. Informationen zur Problembehandlung bei Onlineendpunkten finden Sie unter "Problembehandlung bei der Bereitstellung und Bewertung von Onlineendpunkten".

Installierte Pakete prüfen

Führen Sie die folgenden Schritte aus, um Probleme mit installierten Paketen zu beheben:

  1. Sammeln Sie Informationen zu installierten Paketen und Versionen für Ihre Python-Umgebung.

  2. Überprüfen Sie in Ihrer Umgebungsdatei die Version des azureml-inference-server-http python-Pakets, das angegeben ist. Überprüfen Sie in den Startprotokollen des Azure Machine Learning-Servers die Version des angezeigten Ableitungsservers. Vergewissern Sie sich, dass die beiden Versionen übereinstimmen.

    In einigen Fällen installiert der PIP-Abhängigkeitskonfliktlöser unerwartete Paketversionen. Möglicherweise müssen Sie pip ausführen, um installierte Pakete und Versionen zu korrigieren.

  3. Wenn Sie Flask oder dessen Abhängigkeiten in Ihrer Umgebung angeben, entfernen Sie diese Elemente.

    • Zu den abhängigen Paketen zählen flask, jinja2, itsdangerous, werkzeug, markupsafe und click.
    • Das flask Paket wird als Abhängigkeit im Ableitungsserverpaket aufgeführt. Der beste Ansatz besteht darin, dem Rückschlussserver die Installation des Pakets flask zu ermöglichen.
    • Wenn der Rückschlussserver für die Unterstützung neuer Versionen von Flask konfiguriert ist, empfängt der Ableitungsserver automatisch die Paketupdates, sobald sie verfügbar sind.

Überprüfen der Ableitungsserverversion

Das Serverpaket azureml-inference-server-http wird in PyPI veröffentlicht. Auf der Seite "PyPI " werden der Änderungsprotokoll und alle Versionen des Pakets aufgelistet.

Wenn Sie eine frühe Paketversion verwenden, aktualisieren Sie Ihre Konfiguration auf die neueste Version. In der folgenden Tabelle sind stabile Versionen, häufige Probleme und empfohlene Anpassungen zusammengefasst:

Paketversion Beschreibung Problem Lösung
0.4.x Gebündelt in Trainingsimages mit dem Datum 20220601 oder früher und azureml-defaults-Paketversionen 0.1.34 bis 1.43. Die neueste stabile Version ist 0.4.13. Bei Serverversionen vor 0.4.11 können Abhängigkeitsprobleme, wie ein Problem mit Flask, auftreten can't import name Markup from jinja2. Aktualisieren Sie nach Möglichkeit auf Version 0.4.13 oder 1.4.x, die neueste Version.
0.6.x Vorinstalliert in Rückschlussimages bis 20220516. Die neueste stabile Version ist 0.6.1. N/V N/V
0.7.x Unterstützt Flask 2. Die neueste stabile Version ist 0.7.7. N/V N/V
0.8.x Verwendet ein aktualisiertes Protokollformat. Endet die Unterstützung für Python 3.6. N/V N/V
1.0.x Endet die Unterstützung für Python 3.7. N/V N/V
1.1.x Migriert zu pydantic 2.0. N/V N/V
1.2.x Fügt Unterstützung für Python 3.11 hinzu. Aktualisiert gunicorn auf Version 22.0.0. Aktualisiert werkzeug auf Version 3.0.3 und spätere Versionen. N/V N/V
1.3.x Fügt Unterstützung für Python 3.12 hinzu. Führt ein Upgrade von certifi auf Version 2024.7.4 durch. Führt ein Upgrade von flask-cors auf Version 5.0.0 durch. Aktualisiert die gunicorn- und pydantic-Pakete. N/V N/V
1.4.x Führt ein Upgrade von waitress auf Version 3.0.1 durch. Endet die Unterstützung für Python 3.8. Entfernt die Kompatibilitätsschicht, die verhindert, dass das Flask 2.0-Upgrade den Anforderungsobjektcode aufbricht. Wenn Sie von der Kompatibilitätsebene abhängen, funktioniert der Anforderungsobjektcode möglicherweise nicht. Migrieren Sie Ihr Bewertungsskript zu Flask 2.

Überprüfen der Paketabhängigkeiten

Die wichtigsten abhängigen Pakete für das Serverpaket azureml-inference-server-http sind:

  • flask
  • opencensus-ext-azure
  • inference-schema

Wenn Sie das azureml-defaults Paket in Ihrer Python-Umgebung angeben, ist das azureml-inference-server-http Paket ein abhängiges Paket. Die Abhängigkeit wird automatisch installiert.

Tipp

Wenn Sie das Azure Machine Learning SDK für Python v1 verwenden und das azureml-defaults Paket nicht explizit in Ihrer Python-Umgebung angeben, fügt das SDK das Paket möglicherweise automatisch hinzu. Die Paketversion ist jedoch relativ zur SDK-Version gesperrt. Wenn die SDK-Version beispielsweise 1.38.0 ist, wird der azureml-defaults==1.38.0 Eintrag den Pip-Anforderungen der Umgebung hinzugefügt.

TypeError beim Starten des Inference-Servers

Möglicherweise tritt beim Rückschlussserverstart der folgende TypeError auf:

TypeError: register() takes 3 positional arguments but 4 were given

  File "/var/azureml-server/aml_blueprint.py", line 251, in register

    super(AMLBlueprint, self).register(app, options, first_registration)

TypeError: register() takes 3 positional arguments but 4 were given

Dieser Fehler tritt auf, wenn Flask 2 in Ihrer Python-Umgebung installiert ist, aber Ihre Version des Pakets azureml-inference-server-http Flask 2 nicht unterstützt. Die Unterstützung für Flask 2 ist im azureml-inference-server-http Paket 0.7.0 und höher sowie im azureml-defaults 1.44-Paket und höheren Versionen verfügbar.

  • Wenn Sie das Flask 2-Paket nicht in einem Azure Machine Learning-Docker-Image verwenden, verwenden Sie die aktuelle Version des Pakets azureml-inference-server-http oder azureml-defaults.

  • Wenn Sie das Flask 2-Paket in einem Azure Machine Learning Docker-Image verwenden, vergewissern Sie sich, dass die Build-Version des Images July 2022 oder höher ist.

    Sie können die Imageversion in den Containerprotokollen finden. Sehen Sie sich beispielsweise die folgenden Protokollanweisungen an:

    2022-08-22T17:05:02,147738763+00:00 | gunicorn/run | AzureML Container Runtime Information
    2022-08-22T17:05:02,161963207+00:00 | gunicorn/run | ###############################################
    2022-08-22T17:05:02,168970479+00:00 | gunicorn/run | 
    2022-08-22T17:05:02,174364834+00:00 | gunicorn/run | 
    2022-08-22T17:05:02,187280665+00:00 | gunicorn/run | AzureML image information: openmpi4.1.0-ubuntu20.04, Materialization Build:20220708.v2
    2022-08-22T17:05:02,188930082+00:00 | gunicorn/run | 
    2022-08-22T17:05:02,190557998+00:00 | gunicorn/run | 
    

    Das Builddatum des Images wird nach der Notation Materialization Build angezeigt. Im vorherigen Beispiel lautet die Bildversion 20220708 oder der 8. Juli 2022. Das Image in diesem Beispiel ist mit Flask 2 kompatibel.

    Wenn in Ihrem Containerprotokoll keine Meldung dieser Art angezeigt wird, ist Ihr Image veraltet und sollte aktualisiert werden. Wenn Sie ein Compute Unified Device Architecture (CUDA)-Image verwenden und kein neueres Image finden können, überprüfen Sie das AzureML-Containers-Repository , um festzustellen, ob Ihr Image veraltet ist. Dort finden Sie designierte Ersatzimages für veraltete Images.

    Wenn Sie den Rückschlussserver mit einem Onlineendpunkt verwenden, finden Sie auch die Protokolle im Azure Machine Learning Studio. Wählen Sie auf der Seite für Ihren Endpunkt die Registerkarte "Protokolle " aus.

Wenn Sie mit dem SDK v1 bereitstellen und kein Image in Ihrer Bereitstellungskonfiguration explizit angeben, wendet der Ableitungsserver das openmpi4.1.0-ubuntu20.04 Paket mit einer Version an, die Ihrem lokalen SDK-Toolset entspricht. Die installierte Version ist jedoch möglicherweise nicht die neueste verfügbare Version des Images.

Für SDK Version 1.43 installiert der Ableitungsserver standardmäßig die openmpi4.1.0-ubuntu20.04:20220616 Paketversion, diese Paketversion ist jedoch nicht mit SDK 1.43 kompatibel. Stellen Sie sicher, dass Sie das neueste SDK für Ihre Bereitstellung verwenden.

Wenn Sie das Image nicht aktualisieren können, können Sie das Problem vorübergehend umgehen, indem Sie die Einträge azureml-defaults==1.43 oder azureml-inference-server-http~=0.4.13 in Ihrer Umgebungsdatei anheften. Diese Einträge weisen den Inferenzserver an, die ältere Version mit flask 1.0.x zu installieren.

ImportError oder ModuleNotFoundError beim Starten des Rückschlussservers

Sie könnten auf ein ImportError oder ModuleNotFoundError in bestimmten Modulen wie opencensus, jinja2, markupsafe oder click stoßen, während der Inferenz-Server startet. Das folgende Beispiel zeigt die Fehlermeldung:

ImportError: cannot import name 'Markup' from 'jinja2'

Die Import- und Modulfehler treten auf, wenn Sie Version 0.4.10 oder frühere Versionen des Rückschlussservers verwenden, die die Flask-Abhängigkeit nicht an eine kompatible Version anheften. Um das Problem zu verhindern, installieren Sie eine höhere Version des Rückschlussservers.