Dela via


Felsöka bedömningsskript med HTTP-server för Azure Machine Learning-slutsatsdragning

HTTP-servern för Azure Machine Learning-slutsatsdragning är ett Python-paket som exponerar din bedömningsfunktion som en HTTP-slutpunkt och omsluter Flask-serverkoden och beroendena i ett enda paket. Servern ingår i de fördefinierade Docker-avbildningarna för slutsatsdragning som används när du distribuerar en modell med Azure Machine Learning. Med enbart paketet kan du distribuera modellen lokalt för produktion och enkelt verifiera ditt bedömningsskript (post) i en lokal utvecklingsmiljö. Om det uppstår ett problem med bedömningsskriptet returnerar servern ett fel och platsen för felet.

Servern kan också användas för att skapa valideringsportar i en pipeline för kontinuerlig integrering och distribution. Du kan till exempel starta servern med kandidatskriptet och köra testpaketet mot den lokala slutpunkten.

Den här artikeln stöder utvecklare som vill använda slutsatsdragningsservern för att felsöka lokalt och beskriver hur man använder slutsatsdragningsservern med onlineslutpunkter i Windows.

Förutsättningar

Om du vill använda HTTP-servern för Azure Machine Learning-slutsatsdragning för lokal felsökning måste konfigurationen innehålla följande komponenter:

  • Python 3.8 eller senare
  • Anaconda

HTTP-servern för Azure Machine Learning-slutsatsdragning körs på Windows- och Linux-baserade operativsystem.

Utforska lokala felsökningsalternativ för onlineslutpunkter

Genom att felsöka slutpunkter lokalt innan du distribuerar till molnet kan du få fel i koden och konfigurationen tidigare. Om du vill felsöka slutpunkter lokalt har du flera alternativ, bland annat:

  • HTTP-servern för Azure Machine Learning-slutsatsdragning
  • En lokal slutpunkt

Den här artikeln beskriver hur du arbetar med HTTP-servern för Azure Machine Learning-slutsatsdragning i Windows.

Följande tabell innehåller en översikt över scenarier som hjälper dig att välja det bästa alternativet:

Scenario Slutsatsdragning av HTTP-server Lokal slutpunkt
Uppdatera den lokala Python-miljön utan återskapande av Docker-avbildning Ja Nej
Uppdateringsbedömningsskript Ja Ja
Uppdatera distributionskonfigurationer (distribution, miljö, kod, modell) Nej Ja
Integrera Felsökningsprogram för Microsoft Visual Studio Code (VS Code) Ja Ja

När du kör HTTP-inferensservern lokalt kan du fokusera på att felsöka ditt bedömningsskript utan att behöva använda konfigurationer av distributionscontainer.

Installera azureml-inference-server-http-package

Installera paketet genom azureml-inference-server-http att köra följande kommando:

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

Kommentar

För att undvika paketkonflikter installerar du slutsatsdragningen för HTTP-servern i en virtuell miljö. Du kan använda pip install virtualenv kommandot för att aktivera virtuella miljöer för din konfiguration.

Felsöka ditt bedömningsskript lokalt

Om du vill felsöka ditt bedömningsskript lokalt har du flera alternativ för att testa serverbeteendet:

Testa serverbeteende med dummy-bedömningsskript

  1. Skapa en katalog med namnet server_quickstart för att lagra dina filer:

    mkdir server_quickstart
    cd server_quickstart
    
  2. Undvik paketkonflikter genom att skapa en virtuell miljö, till exempel myenv, och aktivera den:

    python -m virtualenv myenv
    

    Kommentar

    I Linux kör du source myenv/bin/activate kommandot för att aktivera den virtuella miljön.

    När du har testat servern kan du köra deactivate kommandot för att inaktivera den virtuella Python-miljön.

  3. azureml-inference-server-http Installera paketet från pypi-feeden:

    python -m pip install azureml-inference-server-http
    
  4. Skapa ditt postskript. I följande exempel skapas ett grundläggande postskript och sparas i en fil med namnet score.py:

    echo -e "import time def init(): \n\t time.sleep(1) \n\n def run(input_data): \n\t return {"message":"Hello, World!"}" > score.py
    
  5. Starta servern med azmlinfsrv kommandot och ange score.py-filen som postskript:

    azmlinfsrv --entry_script score.py
    

    Kommentar

    Servern finns på 0.0.0.0, vilket innebär att den lyssnar på värddatorns alla IP-adresser.

  6. Skicka en bedömningsbegäran till servern med hjälp curl av verktyget:

    curl -p 127.0.0.1:5001/score
    

    Servern publicerar följande svar:

    {"message": "Hello, World!"}
    
  7. När du har testat väljer du Ctrl + C för att avsluta servern.

Nu kan du ändra bedömningsskriptfilen (score.py) och testa ändringarna genom att köra servern igen med azmlinfsrv --entry_script score.py kommandot .

Integrera med Visual Studio Code

Om du vill använda VS Code och Python-tillägget för felsökning med azureml-inference-server-http-paketet kan du använda lägena Starta och koppla.

  • För Startläge konfigurerar du filen launch.json i VS Code och startar HTTP-servern för Azure Machine Learning-slutsatsdragning i VS Code:

    1. Starta VS Code och öppna mappen som innehåller skriptet (score.py).

    2. Lägg till följande konfiguration i launch.json-filen för arbetsytan i VS Code:

      launch.json

      {
          "version": "0.2.0",
          "configurations": [
              {
                  "name": "Debug score.py",
                  "type": "python",
                  "request": "launch",
                  "module": "azureml_inference_server_http.amlserver",
                  "args": [
                      "--entry_script",
                      "score.py"
                  ]
              }
          ]
        }
      
    3. Starta felsökningssessionen i VS Code genom att välja Kör>starta felsökning eller använd kortkommandot F5.

  • För Anslutningsläge startar du HTTP-servern för Azure Machine Learning-slutsatsdragning i ett kommandofönster och använder VS Code med Python-tillägget för att ansluta till processen:

    Kommentar

    För Linux installerar gdb du först paketet genom att sudo apt-get install -y gdb köra kommandot .

    1. Lägg till följande konfiguration i launch.json-filen för arbetsytan i VS Code:

      launch.json

      {
          "version": "0.2.0",
          "configurations": [
              {
                  "name": "Python: Attach using Process Id",
                  "type": "python",
                  "request": "attach",
                  "processId": "${command:pickProcess}",
                  "justMyCode": true
              }
          ]
        }
      
    2. I ett kommandofönster startar du HTTP-inferensservern med hjälp azmlinfsrv --entry_script score.py av kommandot .

    3. Starta felsökningssessionen i VS Code:

      1. Välj Kör>starta felsökning eller använd kortkommandot F5.

      2. I kommandofönstret visar du loggarna från slutsatsdragningsservern och letar upp process-ID:t för azmlinfsrv kommandot (inte gunicorn):

        Skärmbild som visar ett kommandofönster som visar loggar från slutsatsdragningens HTTP-server och process-ID:t för kommandot azmlinfsrv markerat.

      3. I VS Code-felsökningsprogrammet anger du process-ID för azmlinfsrv kommandot.

        Om du inte ser VS Code-processväljaren kan du manuellt ange process-ID:t i fältet för processId launch.json-filen för arbetsytan.

För båda lägena kan du ange brytpunkter och felsöka skriptet steg för steg.

Använda ett exempel från slutpunkt till slutpunkt

Följande procedur kör servern lokalt med exempelfiler (bedömningsskript, modellfil och miljö) från Azure Machine Learning-exempellagringsplatsen. Fler exempel på hur du använder dessa exempelfiler finns i Distribuera och poängsätta en maskininlärningsmodell med hjälp av en onlineslutpunkt.

  1. Klona exempellagringsplatsen:

    git clone --depth 1 https://github.com/Azure/azureml-examples
    cd azureml-examples/cli/endpoints/online/model-1/
    
  2. Skapa och aktivera en virtuell miljö med conda:

    I det här exemplet azureml-inference-server-http installeras paketet automatiskt. Paketet ingår som ett beroende bibliotek för azureml-defaults paketet i conda.yml-filen:

    # Create the environment from the YAML file
    conda env create --name model-env -f ./environment/conda.yml
    # Activate the new environment
    conda activate model-env
    
  3. Granska bedömningsskriptet:

    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. Kör slutsatsdragningens HTTP-server genom att ange bedömningsskriptet och modellfilen:

    Modellkatalogen som anges i parametern model_dir definieras med hjälp av variabeln AZUREML_MODEL_DIR och hämtas i bedömningsskriptet.

    I det här fallet anger du den aktuella katalogen ./ eftersom underkatalogen anges i bedömningsskriptet som modell/sklearn_regression_model.pkl.

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

    När servern startar och anropar bedömningsskriptet öppnas exempelstartloggen. Annars visas felmeddelanden i loggen.

  5. Testa bedömningsskriptet med exempeldata:

    Öppna ett annat kommandofönster och ändra till samma arbetskatalog där du kör kommandot.

    Använd verktyget curl för att skicka en exempelbegäran till servern och få ett bedömningsresultat:

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

    När det inte finns några problem i ditt bedömningsskript returnerar skriptet poängresultatet. Om det uppstår problem kan du försöka uppdatera bedömningsskriptet och starta servern igen för att testa det uppdaterade skriptet.

Granska servervägar

Slutsatsdragningen http-servern lyssnar på port 5001 som standard på följande vägar:

Name Flöde
Liveness-avsökning 127.0.0.1:5001/
Poäng 127.0.0.1:5001/score
OpenAPI (swagger) 127.0.0.1:5001/swagger.json

Granska serverparametrar

Http-inferensservern accepterar följande parametrar:

Parameter Obligatoriskt Standardvärde Description
entry_script Sant Ej tillämpligt Identifierar den relativa eller absoluta sökvägen till bedömningsskriptet.
model_dir Falsk Ej tillämpligt Identifierar den relativa eller absoluta sökvägen till katalogen som innehåller modellen som används för slutsatsdragning.
port Falsk 5001 Anger serverns serverport.
worker_count Falsk 1 Innehåller antalet arbetstrådar för att bearbeta samtidiga begäranden.
appinsights_instrumentation_key Falsk Ej tillämpligt Tillhandahåller instrumentationsnyckeln till application insights där loggarna publiceras.
access_control_allow_origins Falsk Ej tillämpligt Aktiverar CORS för angivna ursprung, där flera ursprung avgränsas med ett kommatecken (,), till exempel microsoft.com, bing.com.

Utforska bearbetning av serverbegäran

Följande steg visar hur Http-servern för Azure Machine Learning-slutsatsdragning (azmlinfsrv) hanterar inkommande begäranden:

  1. En Python CLI-omslutning finns runt serverns nätverksstack och används för att starta servern.

  2. En klient skickar en begäran till servern.

  3. Servern skickar begäran via WSGI-servern (Web Server Gateway Interface), som skickar begäran till ett Flask-arbetsprogram:

  4. Flask-arbetsappen hanterar begäran, vilket inkluderar inläsning av inmatningsskriptet och eventuella beroenden.

  5. Ditt postskript tar emot begäran. Inmatningsskriptet gör ett slutsatsdragningsanrop till den inlästa modellen och returnerar ett svar:

Diagram som visar hur INFERENS HTTP-servern bearbetar inkommande begäranden.

Utforska serverloggar

Det finns två sätt att hämta loggdata för http-servertestet för slutsatsdragning:

  • azureml-inference-server-http Kör paketet lokalt och visa loggarnas utdata.
  • Använd onlineslutpunkter och visa containerloggarna. Loggen för slutsatsdragningsservern heter Azure Machine Learning Inferencing HTTP-serverversion><.

Kommentar

Loggningsformatet har ändrats sedan version 0.8.0. Om loggen använder ett annat format än förväntat uppdaterar du azureml-inference-server-http paketet till den senaste versionen.

Visa startloggar

När servern startar visar loggarna de inledande serverinställningarna enligt följande:

Azure Machine Learning Inferencing HTTP server <version>

Server Settings
---------------
Entry Script Name: <entry_script>
Model Directory: <model_dir>
Worker Count: <worker_count>
Worker Timeout (seconds): None
Server Port: <port>
Application Insights Enabled: false
Application Insights Key: <appinsights_instrumentation_key>
Inferencing HTTP server version: azmlinfsrv/<version>
CORS for the specified origins: <access_control_allow_origins>

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

<logs>

När du till exempel startar servern genom att följa exemplet från slutpunkt till slutpunkt visas loggen på följande sätt:

Azure Machine Learning Inferencing HTTP server v0.8.0

Server Settings
---------------
Entry Script Name: /home/user-name/azureml-examples/cli/endpoints/online/model-1/onlinescoring/score.py
Model Directory: ./
Worker Count: 1
Worker Timeout (seconds): None
Server Port: 5001
Application Insights Enabled: false
Application Insights Key: None
Inferencing HTTP server version: azmlinfsrv/0.8.0
CORS for the specified origins: 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,977 I [32756] azmlinfsrv - AML_FLASK_ONE_COMPATIBILITY is set, but patching is not necessary.

Förstå loggdataformat

Alla loggar från HTTP-inferensservern, förutom startskriptet, visar data i följande format:

<UTC Time> | <level> [<pid>] <logger name> - <message>

Posten består av följande komponenter:

  • <UTC Time>: Tidpunkt då posten angavs i loggen.
  • <pid>: ID för processen som är associerad med posten.
  • <level>: Första tecknet på loggningsnivån för posten, till exempel E för ERROR, I för INFO och så vidare.
  • <logger name>: Namnet på resursen som är associerad med loggposten.
  • <message>: Innehållet i loggmeddelandet.

Det finns sex nivåer av loggning i Python med tilldelade numeriska värden enligt allvarlighetsgrad:

Loggningsnivå Numeriskt värde
KRITISK 50
FEL 40
VARNING 30
INFORMATION 20
FELSÖKA 10
NOTSET 0

Felsöka serverproblem

Följande avsnitt innehåller grundläggande felsökningstips för HTTP-server för Azure Machine Learning-slutsatsdragning. Information om hur du felsöker onlineslutpunkter finns i Felsöka distribution av onlineslutpunkter.

Kontrollera installerade paket

Följ de här stegen för att åtgärda problem med installerade paket.

  1. Samla in information om installerade paket och versioner för din Python-miljö.

  2. Bekräfta att Python-paketversionen azureml-inference-server-http som anges i miljöfilen matchar DEN HTTP-serverversion för Azure Machine Learning-slutsatsdragning som visas i startloggen.

    I vissa fall installerar pip-beroendelösaren oväntade paketversioner. Du kan behöva köra pip för att korrigera installerade paket och versioner.

  3. Om du anger Flask eller dess beroenden i din miljö tar du bort dessa objekt.

    • Beroende paket inkluderar flask, jinja2, itsdangerous, werkzeug, markupsafeoch click.
    • flask anges som ett beroende i serverpaketet. Det bästa sättet är att låta slutsatsdragningsservern installera flask paketet.
    • När slutsatsdragningsservern har konfigurerats för att stödja nya versioner av Flask tar servern automatiskt emot paketuppdateringarna när de blir tillgängliga.

Kontrollera serverversionen

Serverpaketet azureml-inference-server-http publiceras till PyPI. På Sidan PyPI visas ändringsloggen och alla tidigare versioner.

Om du använder en tidigare paketversion uppdaterar du konfigurationen till den senaste versionen. I följande tabell sammanfattas stabila versioner, vanliga problem och rekommenderade justeringar:

Paketversion beskrivning Problem Åtgärd
0.4.x Paketerade i träningsbilder daterade 20220601 eller tidigare och azureml-defaults paketversioner .1.34 via 1.43. Den senaste stabila versionen är 0.4.13. För serverversioner som är tidigare än 0.4.11 kan du stöta på Flask-beroendeproblem, till exempel "can't import name Markup from jinja2". Uppgradera till version 0.4.13 eller 0.8.x, den senaste versionen, om möjligt.
0.6.x Förinstallerad i slutsatsdragning av avbildningar daterade 20220516 och tidigare. Den senaste stabila versionen är 0.6.1. Saknas Saknas
0.7.x Stöder Flask 2. Den senaste stabila versionen är 0.7.7. Saknas Saknas
0.8.x Loggformatet har ändrats. Python 3.6-supporten har upphört. Saknas Saknas

Kontrollera paketberoenden

De mest relevanta beroende paketen azureml-inference-server-http för serverpaketet är:

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

Om du har angett azureml-defaults paketet i Python-miljön azureml-inference-server-http är paketet ett beroende paket. Beroendet installeras automatiskt.

Dricks

Om du använder Python SDK v1 och inte uttryckligen azureml-defaults anger paketet i Python-miljön kan SDK:t automatiskt lägga till paketet. Paketeringsversionen är dock låst i förhållande till SDK-versionen. Om SDK-versionen till exempel är 1.38.0azureml-defaults==1.38.0 läggs posten till i miljöns pip-krav.

TypeError under serverstart

Du kan stöta på följande TypeError under serverstarten:

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

Det här felet uppstår när du har Flask 2 installerat i Python-miljön, men paketversionen azureml-inference-server-http stöder inte Flask 2. Stöd för Flask 2 finns i azureml-inference-server-http paketversion 0.7.0 och senare samt azureml-defaults paketversion 1.44 och senare.

  • Om du inte använder Flask 2-paketet i en Azure Machine Learning Docker-avbildning använder du den senaste versionen av azureml-inference-server-http paketet eller azureml-defaults .

  • Om du använder Flask 2-paketet i en Azure Machine Learning Docker-avbildning kontrollerar du att avbildningsversionen är juli 2022 eller senare.

    Du hittar avbildningsversionen i containerloggarna. Till exempel:

    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 | 
    

    Kompileringsdatumet för avbildningen visas efter notationen Materialization Build . I föregående exempel är 20220708 avbildningsversionen eller 8 juli 2022. Bilden i det här exemplet är kompatibel med Flask 2.

    Om du inte ser något liknande meddelande i containerloggen är avbildningen inaktuell och bör uppdateras. Om du använder en CUDA-avbildning (Compute Unified Device Architecture) och du inte hittar en nyare avbildning kontrollerar du om avbildningen är inaktuell i AzureML-Containers. Du hittar avsedda ersättningar för inaktuella bilder.

    Om du använder servern med en onlineslutpunkt kan du även hitta loggarna på sidan Loggarsidan Slutpunkter i Azure Machine Learning-studio.

Om du distribuerar med SDK v1 och inte uttryckligen anger en avbildning i distributionskonfigurationen openmpi4.1.0-ubuntu20.04 tillämpar servern paketet med en version som matchar din lokala SDK-verktygsuppsättning. Den installerade versionen kanske dock inte är den senaste tillgängliga versionen av avbildningen.

För SDK version 1.43 installerar openmpi4.1.0-ubuntu20.04:20220616 servern paketversionen som standard, men den här paketversionen är inte kompatibel med SDK 1.43. Se till att du använder den senaste SDK:t för distributionen.

Om du inte kan uppdatera avbildningen kan du tillfälligt undvika problemet genom att fästa posterna azureml-defaults==1.43 eller azureml-inference-server-http~=0.4.13 i miljöfilen. Dessa poster instruerar servern att installera den äldre versionen med flask 1.0.x.

ImportError eller ModuleNotFoundError under serverstart

Du kan stöta på en ImportError eller ModuleNotFoundError flera specifika moduler, till exempel opencensus, jinja2, markupsafeeller click, under serverstarten. I följande exempel visas felmeddelandet:

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

Import- och modulfelen uppstår när du använder version 0.4.10 eller tidigare versioner av servern som inte fäster Flask-beroendet på en kompatibel version. Du kan förhindra problemet genom att installera en senare version av servern.