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:
- Prova ett dummy-bedömningsskript.
- Använd Visual Studio Code för att felsöka med azureml-inference-server-http-paketet .
- Kör ett faktiskt bedömningsskript, en modellfil och en miljöfil från vår lagringsplats för exempel.
Testa serverbeteende med dummy-bedömningsskript
Skapa en katalog med namnet server_quickstart för att lagra dina filer:
mkdir server_quickstart cd server_quickstart
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.azureml-inference-server-http
Installera paketet från pypi-feeden:python -m pip install azureml-inference-server-http
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
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.
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!"}
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:
Starta VS Code och öppna mappen som innehåller skriptet (score.py).
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" ] } ] }
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 attsudo apt-get install -y gdb
köra kommandot .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 } ] }
I ett kommandofönster startar du HTTP-inferensservern med hjälp
azmlinfsrv --entry_script score.py
av kommandot .Starta felsökningssessionen i VS Code:
Välj Kör>starta felsökning eller använd kortkommandot F5.
I kommandofönstret visar du loggarna från slutsatsdragningsservern och letar upp process-ID:t för
azmlinfsrv
kommandot (integunicorn
):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.
Klona exempellagringsplatsen:
git clone --depth 1 https://github.com/Azure/azureml-examples cd azureml-examples/cli/endpoints/online/model-1/
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örazureml-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
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()
Kör slutsatsdragningens HTTP-server genom att ange bedömningsskriptet och modellfilen:
Modellkatalogen som anges i parametern
model_dir
definieras med hjälp av variabelnAZUREML_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.
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:
En Python CLI-omslutning finns runt serverns nätverksstack och används för att starta servern.
En klient skickar en begäran till servern.
Servern skickar begäran via WSGI-servern (Web Server Gateway Interface), som skickar begäran till ett Flask-arbetsprogram:
Flask-arbetsappen hanterar begäran, vilket inkluderar inläsning av inmatningsskriptet och eventuella beroenden.
Ditt postskript tar emot begäran. Inmatningsskriptet gör ett slutsatsdragningsanrop till den inlästa modellen och returnerar ett svar:
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 exempelE
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.
Samla in information om installerade paket och versioner för din Python-miljö.
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.Om du anger Flask eller dess beroenden i din miljö tar du bort dessa objekt.
- Beroende paket inkluderar
flask
,jinja2
,itsdangerous
,werkzeug
,markupsafe
ochclick
. flask
anges som ett beroende i serverpaketet. Det bästa sättet är att låta slutsatsdragningsservern installeraflask
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.
- Beroende paket inkluderar
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.0
azureml-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 ellerazureml-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 är20220708
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 Loggar på sidan 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
, markupsafe
eller 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.