Pontozószkript hibakeresése az Azure Machine Tanulás következtetési HTTP-kiszolgálóval
Az Azure Machine Tanulás következtetési HTTP-kiszolgáló egy Python-csomag, amely a pontozási függvényt HTTP-végpontként teszi elérhetővé, és a Flask-kiszolgáló kódját és függőségeit egy egyedi csomagba csomagolja. Ez szerepel az előre összeállított Docker-rendszerképekben a modell Azure Machine-Tanulás való üzembe helyezésekor használt következtetés érdekében. Ha egyedül használja a csomagot, helyileg üzembe helyezheti a modellt éles környezetben, és a pontozási (belépési) szkriptet is egyszerűen érvényesítheti egy helyi fejlesztési környezetben. Ha probléma van a pontozási szkripttel, a kiszolgáló hibát ad vissza, és azt a helyet, ahol a hiba történt.
A kiszolgáló használható érvényesítési kapuk létrehozására is egy folyamatos integrációs és üzembehelyezési folyamatban. Elindíthatja például a kiszolgálót a jelölt szkripttel, és futtathatja a tesztcsomagot a helyi végponton.
Ez a cikk elsősorban azokat a felhasználókat célozza meg, akik a következtetési kiszolgálót szeretnék helyi hibakeresésre használni, de segít megérteni, hogyan használhatja a következtetési kiszolgálót online végpontokkal.
Online végpont helyi hibakeresése
A végpontok helyi hibakeresése a felhőben való üzembe helyezés előtt segíthet a kódban és a konfigurációban korábban felmerülő hibák elhárításában. A végpontok helyi hibakereséséhez a következőket használhatja:
- az Azure Machine Tanulás következtetési HTTP-kiszolgáló
- helyi végpont
Ez a cikk az Azure Machine Tanulás következtetési HTTP-kiszolgálóval foglalkozik.
Az alábbi táblázat áttekintést nyújt azokról a forgatókönyvekről, amelyek segítenek kiválasztani, hogy mi működik a legjobban az Ön számára.
Eset | Következtetés HTTP-kiszolgáló | Helyi végpont |
---|---|---|
Helyi Python-környezet frissítése Docker-rendszerkép újraépítése nélkül | Igen | Nem |
Pontozási szkript frissítése | Igen | Igen |
Üzembehelyezési konfigurációk frissítése (üzembe helyezés, környezet, kód, modell) | Nem | Igen |
VS Code Debugger integrálása | Igen | Igen |
A következtetési HTTP-kiszolgáló helyi futtatásával a pontozószkript hibakeresésére összpontosíthat anélkül, hogy az üzembe helyezési tároló konfigurációi befolyásolják.
Előfeltételek
- Szükséges: Python >=3.8
- Anaconda
Tipp.
Az Azure Machine Tanulás következtetési HTTP-kiszolgáló Windows- és Linux-alapú operációs rendszereken fut.
Telepítés
Feljegyzés
A csomagütközések elkerülése érdekében telepítse a kiszolgálót egy virtuális környezetben.
A azureml-inference-server-http package
telepítéshez futtassa a következő parancsot a parancsmagban/terminálban:
python -m pip install azureml-inference-server-http
A pontozási szkript helyi hibakeresése
A pontozási szkript helyi hibakereséséhez tesztelheti, hogy a kiszolgáló hogyan viselkedik egy hamis pontozási szkripttel, a VS Code használatával hibakeresést végezhet az azureml-inference-server-http csomaggal, vagy tesztelheti a kiszolgálót egy tényleges pontozási szkripttel, modellfájllal és környezeti fájllal a példánk adattárából.
A kiszolgáló viselkedésének tesztelése hamis pontozási szkripttel
Hozzon létre egy könyvtárat a fájlok tárolásához:
mkdir server_quickstart cd server_quickstart
A csomagütközések elkerülése érdekében hozzon létre egy virtuális környezetet, és aktiválja azt:
python -m venv myenv source myenv/bin/activate
Tipp.
A tesztelés után futtassa
deactivate
a Python virtuális környezet inaktiválásához.Telepítse a csomagot a
azureml-inference-server-http
pypi-hírcsatornából :python -m pip install azureml-inference-server-http
Hozza létre a belépési szkriptet (
score.py
). Az alábbi példa egy alapszintű bejegyzésszkriptet hoz létre:echo ' import time def init(): time.sleep(1) def run(input_data): return {"message":"Hello, World!"} ' > score.py
Indítsa el a kiszolgálót (azmlinfsrv), és állítsa be
score.py
belépési szkriptként:azmlinfsrv --entry_script score.py
Feljegyzés
A kiszolgáló a 0.0.0.0-s rendszeren üzemel, ami azt jelenti, hogy az üzemeltető gép összes IP-címét figyeli.
Pontozási kérés küldése a kiszolgálónak a következő használatával
curl
:curl -p 127.0.0.1:5001/score
A kiszolgálónak így kell válaszolnia.
{"message": "Hello, World!"}
A tesztelés után leállíthatja Ctrl + C
a kiszolgálót.
Most módosíthatja a pontozási szkriptet (score.py
), és tesztelheti a módosításokat a kiszolgáló újra futtatásával (azmlinfsrv --entry_script score.py
).
Integrálás a Visual Studio Code-tal
A Visual Studio Code (VS Code) és a Python-bővítmény használatával kétféleképpen lehet hibakeresést végezni az azureml-inference-server-http csomaggal (Indítási és csatolási módok).
Indítási mód: állítsa be a VS Code-ban,
launch.json
és indítsa el az Azure Machine Tanulás következtetési HTTP-kiszolgálót a VS Code-ban.Indítsa el a VS Code-ot, és nyissa meg a szkriptet (
score.py
) tartalmazó mappát.Adja hozzá a következő konfigurációt
launch.json
az adott munkaterülethez a VS Code-ban: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" ] } ] }
Kezdje el a hibakeresési munkamenetet a VS Code-ban. Válassza a "Futtatás" –> "Hibakeresés indítása" (vagy
F5
) lehetőséget.
Csatolási mód: indítsa el az Azure Machine Tanulás következtetési HTTP-kiszolgálót egy parancssorban, és a VS Code + Python-bővítmény használatával csatolja a folyamatot.
Feljegyzés
Linux-környezet használata esetén először telepítse a csomagot a
gdb
futtatássalsudo apt-get install -y gdb
.Adja hozzá a következő konfigurációt
launch.json
az adott munkaterülethez a VS Code-ban:launch.json
{ "version": "0.2.0", "configurations": [ { "name": "Python: Attach using Process Id", "type": "python", "request": "attach", "processId": "${command:pickProcess}", "justMyCode": true }, ] }
Indítsa el a következtetési kiszolgálót a parancssori felülettel (
azmlinfsrv --entry_script score.py
).Kezdje el a hibakeresési munkamenetet a VS Code-ban.
- A VS Code-ban válassza a "Futtatás" –> "Hibakeresés indítása" (vagy
F5
) lehetőséget. - Adja meg a parancssori
azmlinfsrv
felületen megjelenített naplók (nem agunicorn
) folyamatazonosítóját.
Feljegyzés
Ha a folyamatválasztó nem jelenik meg, manuálisan adja meg a folyamatazonosítót a
processId
launch.json
mező mezőjében.- A VS Code-ban válassza a "Futtatás" –> "Hibakeresés indítása" (vagy
Mindkét módon lépésről lépésre beállíthatja a töréspontot és a hibakeresést.
Végpontok közötti példa
Ebben a szakaszban helyileg futtatjuk a kiszolgálót mintafájlokkal (pontozási szkript, modellfájl és környezet) a példaadattárban. A mintafájlokat a gépi tanulási modell online végpont használatával történő üzembe helyezéséhez és pontozásához is használjuk
Klónozza a mintaadattárat.
git clone --depth 1 https://github.com/Azure/azureml-examples cd azureml-examples/cli/endpoints/online/model-1/
Virtuális környezet létrehozása és aktiválása a Condával. Ebben a példában
conda.yml
aazureml-inference-server-http
csomag automatikusan telepítve van, mert az a csomag függő kódtáraként szerepel azazureml-defaults
alábbiak szerint.# 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
Tekintse át a pontozási szkriptet.
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()
Futtassa a következtetési kiszolgálót a pontozószkript és a modellfájl megadásával. A megadott modellkönyvtár (
model_dir
paraméter) változókéntAZUREML_MODEL_DIR
lesz definiálva, és lekéri a pontozási szkriptben. Ebben az esetben az aktuális könyvtárat (./
) adhatja meg, mivel az alkönyvtár a pontozó szkriptben a következőkéntmodel/sklearn_regression_model.pkl
van megadva: .azmlinfsrv --entry_script ./onlinescoring/score.py --model_dir ./
A példa indítási naplója akkor jelenik meg, ha a kiszolgáló sikeresen elindult, és a pontozási szkript sikeresen meg van hívva. Ellenkező esetben hibaüzenetek jelennek meg a naplóban.
Tesztelje a pontozási szkriptet mintaadatokkal. Nyisson meg egy másik terminált, és lépjen ugyanarra a munkakönyvtárra a parancs futtatásához.
curl
A parancs használatával küldjön egy példakérést a kiszolgálónak, és kap egy pontozási eredményt.curl --request POST "127.0.0.1:5001/score" --header "Content-Type:application/json" --data @sample-request.json
A pontozási eredmény akkor lesz visszaadva, ha nincs probléma a pontozószkriptben. Ha hibát talál, megpróbálhatja frissíteni a pontozási szkriptet, és újra elindíthatja a kiszolgálót a frissített szkript teszteléséhez.
Kiszolgálói útvonalak
A kiszolgáló az 5001-es portot figyeli (alapértelmezés szerint) ezeken az útvonalakon.
Név | Útvonal |
---|---|
Élőség-mintavétel | 127.0.0.1:5001/ |
Pontszám | 127.0.0.1:5001/score |
OpenAPI (swagger) | 127.0.0.1:5001/swagger.json |
Kiszolgálóparaméterek
Az alábbi táblázat a kiszolgáló által elfogadott paramétereket tartalmazza:
Paraméter | Kötelező | Alapértelmezett | Leírás |
---|---|---|---|
entry_script | Igaz | n/a | A pontozó szkript relatív vagy abszolút elérési útja. |
model_dir | Hamis | n/a | A következtetéshez használt modellt tartalmazó könyvtár relatív vagy abszolút elérési útja. |
kikötő | Hamis | 5001 | A kiszolgáló kiszolgálói portja. |
worker_count | Hamis | 0 | Az egyidejű kéréseket feldolgozó munkaszálak száma. |
appinsights_instrumentation_key | Hamis | n/a | Az alkalmazáselemzések eszközkulcsa, ahol a naplók közzé lesznek téve. |
access_control_allow_origins | Hamis | n/a | Engedélyezze a CORS-t a megadott forrásokhoz. Több forrás elkülönítése a "," betűvel. Példa: "microsoft.com, bing.com" |
Kérelemfolyamat
Az alábbi lépések bemutatják, hogyan kezeli az Azure Machine Tanulás következtetési HTTP-kiszolgáló (azmlinfsrv) a bejövő kéréseket:
- A Python CLI-burkoló a kiszolgáló hálózati veremén helyezkedik el, és a kiszolgáló elindítására szolgál.
- Az ügyfél kérést küld a kiszolgálónak.
- Amikor egy kérés érkezik, az áthalad a WSGI-kiszolgálón , majd elküldi az egyik feldolgozónak.
- A Gunicorn Linuxon használható.
- A pincérnőt Windows rendszeren használják.
- A kéréseket ezután egy Flask-alkalmazás kezeli, amely betölti a bejegyzésszkriptet és a függőségeket.
- Végül a rendszer elküldi a kérést a belépési szkriptnek. A belépési szkript ezután következtetési hívást indít a betöltött modellre, és választ ad vissza.
A naplók ismertetése
Itt az Azure Machine Tanulás következtetési HTTP-kiszolgáló naplóit ismertetjük. A naplót lekérheti a helyi futtatáskor, vagy lekérheti a azureml-inference-server-http
tárolónaplókat, ha online végpontokat használ.
Feljegyzés
A naplózási formátum a 0.8.0-s verzió óta megváltozott. Ha eltérő stílusban találja a naplót, frissítse a csomagot a azureml-inference-server-http
legújabb verzióra.
Tipp.
Ha online végpontokat használ, a következtetési kiszolgáló naplója a következővel Azure Machine Learning Inferencing HTTP server <version>
kezdődik: .
Indítási naplók
A kiszolgáló indításakor a naplók először a következő módon jelenítik meg a kiszolgáló beállításait:
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>
A kiszolgáló indításakor például a végpontok közötti példát követve:
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.
Naplóformátum
A következtetési kiszolgáló naplói a következő formátumban jönnek létre, kivéve a indítószkripteket, mivel nem részei a Python-csomagnak:
<UTC Time> | <level> [<pid>] <logger name> - <message>
Itt <pid>
van a folyamat azonosítója, és <level>
a naplózási szint első karaktere – E for ERROR, I for INFO stb.
A Pythonban hat szint van naplózásra, a súlyossághoz kapcsolódó számokkal:
Naplózási szint | Számérték |
---|---|
KRITIKUS | 50 |
Hiba | 40 |
FIGYELMEZTETÉS | 30 |
INFO | 20 |
HIBAKERESÉS | 10 |
NEM Standard kiadás T | 0 |
Hibaelhárítási útmutató
Ebben a szakaszban alapvető hibaelhárítási tippeket adunk az Azure Machine Tanulás következtetési HTTP-kiszolgálóhoz. Ha online végpontok hibaelhárítását szeretné elvégezni, tekintse meg az online végpontok üzembe helyezésének hibaelhárítását is
Alapszintű lépések
A hibaelhárítás alapvető lépései a következők:
- Verzióinformációk gyűjtése a Python-környezethez.
- Győződjön meg arról, hogy a környezeti fájlban megadott azureml-inference-server-http python csomagverzió megegyezik az indítási naplóban megjelenített AzureML-következtetési HTTP-kiszolgáló verziójával. Előfordulhat, hogy a Pip függőségfeloldója a telepített csomagok váratlan verzióihoz vezet.
- Ha a Flaskot (és annak függőségeit) adja meg a környezetében, távolítsa el őket. A függőségek közé tartoznak a
Flask
következők: ,Jinja2
,itsdangerous
,Werkzeug
MarkupSafe
, ésclick
. A Flask függőségként szerepel a kiszolgálócsomagban, és a legjobb, ha engedélyezi a kiszolgáló telepítését. Így amikor a kiszolgáló támogatja a Flask új verzióit, automatikusan megkapja őket.
Kiszolgáló verziója
A kiszolgálócsomag azureml-inference-server-http
közzé van téve a PyPI-ban. A változásnaplót és az összes korábbi verziót a PyPI oldalán találja. Frissítsen a legújabb verzióra, ha korábbi verziót használ.
- 0.4.x: A betanítási képekben ≤
20220601
és aazureml-defaults>=1.34,<=1.43
.0.4.13
az utolsó stabil verzió. Ha a kiszolgálót a verzió0.4.11
előtt használja, előfordulhat, hogy a Flask függőségi problémái nem tudnak nevetMarkup
importálni.jinja2
Ha lehetséges, javasoljuk, hogy frissítsen0.4.13
a legújabb verzióra vagy0.8.x
(a legújabb verzióra). - 0.6.x: Az előre telepített verzió, amely a képek következtetésére ≤ 20220516. A legújabb stabil verzió a
0.6.1
. - 0.7.x: Az első verzió, amely támogatja a Flask 2-t. A legújabb stabil verzió a
0.7.7
. - 0.8.x: A naplóformátum megváltozott, és a Python 3.6 támogatása csökkent.
Csomagfüggőségek
A kiszolgáló azureml-inference-server-http
legfontosabb csomagjai a következő csomagok:
- Lombikot
- opencensus-ext-azure
- következtetési séma
Ha a Python-környezetben adta meg azureml-defaults
, a azureml-inference-server-http
csomag attól függ, és a rendszer automatikusan telepíti.
Tipp.
Ha Python SDK v1-et használ, és nem adja meg azureml-defaults
explicit módon a Python-környezetben, az SDK hozzáadhatja Önnek a csomagot. Azonban zárolja az SDK azon verziójára, amelyen az SDK be van kapcsolva. Ha például az SDK-verzió, 1.38.0
az hozzáadódik azureml-defaults==1.38.0
a környezet pipkövetelményeihez.
Gyakori kérdések
1. A kiszolgáló indításakor a következő hibát tapasztaltam:
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
A Flask 2 telepítve van a Python-környezetben, de olyan verziót azureml-inference-server-http
futtat, amely nem támogatja a Flask 2-t. A Flask 2 támogatása a következőben azureml-inference-server-http>=0.7.0
azureml-defaults>=1.44
található:
Ha ezt a csomagot nem AzureML docker-rendszerképben használja, használja a legújabb verziót
azureml-inference-server-http
vagyazureml-defaults
.Ha ezt a csomagot Egy AzureML docker-lemezképpel használja, győződjön meg arról, hogy 2022 júliusában vagy azt követően létrehozott rendszerképet használ. A rendszerkép verziója elérhető a tárolónaplókban. A következőhöz hasonló naplót kell találnia:
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, Materializaton Build:20220708.v2 2022-08-22T17:05:02,188930082+00:00 | gunicorn/run | 2022-08-22T17:05:02,190557998+00:00 | gunicorn/run |
A rendszerkép buildelési dátuma a "Materialization Build" után jelenik meg, amely a fenti példában
20220708
2022. július 8. Ez a kép kompatibilis a Flask 2-vel. Ha nem jelenik meg ilyen szalagcím a tárolónaplóban, a rendszerkép elavult, ezért frissítenie kell. Ha CUDA-lemezképet használ, és nem talál újabb rendszerképet, ellenőrizze, hogy a rendszerkép elavult-e az AzureML-Containersben. Ha így van, akkor képesnek kell lennie a cserére.Ha a kiszolgálót online végponttal használja, a naplókat az Azure Machine Tanulás Studio online végpontlapjának "Üzembe helyezési naplók" területén is megtalálhatja. Ha az SDK 1-es verziójával telepít, és nem ad meg explicit módon lemezképet az üzembe helyezési konfigurációban, akkor alapértelmezés szerint a helyi SDK-eszközkészletnek megfelelő verziót
openmpi4.1.0-ubuntu20.04
kell használnia, amely lehet, hogy nem a rendszerkép legújabb verziója. Az SDK 1.43 alapértelmezés szerintopenmpi4.1.0-ubuntu20.04:20220616
nem kompatibilis. Győződjön meg arról, hogy a legújabb SDK-t használja az üzembe helyezéshez.Ha valamilyen okból nem tudja frissíteni a lemezképet, ideiglenesen elkerülheti a problémát a rögzítéssel
azureml-defaults==1.43
, vagyazureml-inference-server-http~=0.4.13
, amely a régebbi verziókiszolgálótFlask 1.0.x
telepíti.
2. A következő üzenethez hasonlóan egy modulban vagy modulban, MarkupSafe
jinja2
vagy click
indításkor találkoztam ImportError
ModuleNotFoundError
:opencensus
ImportError: cannot import name 'Markup' from 'jinja2'
A kiszolgáló régebbi verziói (<= 0.4.10) nem rögzítette a Flask függőségét a kompatibilis verziókhoz. Ezt a problémát a kiszolgáló legújabb verziójában kijavítottuk.
Következő lépések
- A belépési szkriptek létrehozásával és a modellek üzembe helyezésével kapcsolatos további információkért lásd: Modell üzembe helyezése az Azure Machine Tanulás használatával.
- További információ az előre összeállított docker-rendszerképekről a következtetéshez