Megosztás a következőn keresztül:


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 packagetelepí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

  1. Hozzon létre egy könyvtárat a fájlok tárolásához:

    mkdir server_quickstart
    cd server_quickstart
    
  2. 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.

  3. Telepítse a csomagot a azureml-inference-server-httppypi-hírcsatornából :

    python -m pip install azureml-inference-server-http
    
  4. 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
    
  5. 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.

  6. 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.

    1. Indítsa el a VS Code-ot, és nyissa meg a szkriptet (score.py) tartalmazó mappát.

    2. 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"
                  ]
              }
          ]
      }
      
    3. 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ással sudo apt-get install -y gdb.

    1. 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
              },
          ]
      }
      
    2. Indítsa el a következtetési kiszolgálót a parancssori felülettel (azmlinfsrv --entry_script score.py).

    3. Kezdje el a hibakeresési munkamenetet a VS Code-ban.

      1. A VS Code-ban válassza a "Futtatás" –> "Hibakeresés indítása" (vagy F5) lehetőséget.
      2. Adja meg a parancssori azmlinfsrv felületen megjelenített naplók (nem a gunicorn) folyamatazonosítóját. Képernyőkép a parancssori felületről, amelyen a kiszolgáló folyamatazonosítója látható.

      Feljegyzés

      Ha a folyamatválasztó nem jelenik meg, manuálisan adja meg a folyamatazonosítót a processIdlaunch.jsonmező mezőjében.

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

  1. Klónozza a mintaadattárat.

    git clone --depth 1 https://github.com/Azure/azureml-examples
    cd azureml-examples/cli/endpoints/online/model-1/
    
  2. Virtuális környezet létrehozása és aktiválása a Condával. Ebben a példában conda.yml a azureml-inference-server-http csomag automatikusan telepítve van, mert az a csomag függő kódtáraként szerepel az azureml-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
    
  3. 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()
    
  4. 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ént AZUREML_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ént model/sklearn_regression_model.pklvan 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.

  5. 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:

  1. A Python CLI-burkoló a kiszolgáló hálózati veremén helyezkedik el, és a kiszolgáló elindítására szolgál.
  2. Az ügyfél kérést küld a kiszolgálónak.
  3. Amikor egy kérés érkezik, az áthalad a WSGI-kiszolgálón , majd elküldi az egyik feldolgozónak.
  4. A kéréseket ezután egy Flask-alkalmazás kezeli, amely betölti a bejegyzésszkriptet és a függőségeket.
  5. 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 HTTP-kiszolgáló folyamatának diagramja.

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:

  1. Verzióinformációk gyűjtése a Python-környezethez.
  2. 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.
  3. 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 Flaskkövetkezők: , Jinja2, itsdangerous, WerkzeugMarkupSafe, és click. 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 a azureml-defaults>=1.34,<=1.43. 0.4.13 az utolsó stabil verzió. Ha a kiszolgálót a verzió 0.4.11előtt használja, előfordulhat, hogy a Flask függőségi problémái nem tudnak nevet Markup importálni.jinja2 Ha lehetséges, javasoljuk, hogy frissítsen 0.4.13 a legújabb verzióra vagy 0.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.0az 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.0azureml-defaults>=1.44található:

  • Ha ezt a csomagot nem AzureML docker-rendszerképben használja, használja a legújabb verziót azureml-inference-server-http vagy azureml-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 202207082022. 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 szerint openmpi4.1.0-ubuntu20.04:20220616nem 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 , vagy azureml-inference-server-http~=0.4.13, amely a régebbi verziókiszolgálót Flask 1.0.xtelepíti.

2. A következő üzenethez hasonlóan egy modulban vagy modulban, MarkupSafejinja2vagy click indításkor találkoztam ImportErrorModuleNotFoundError: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