Sdílet prostřednictvím


Ladění hodnoticích skriptů pomocí serveru HTTP odvozování služby Azure Machine Learning

Server HTTP odvozování služby Azure Machine Learning je balíček Pythonu, který zpřístupňuje funkci bodování jako koncový bod HTTP a zabalí kód serveru Flask a závislosti do jediného balíčku. Server je součástí předem připravených imagí Dockeru pro odvozování , které se používají při nasazování modelu se službou Azure Machine Learning. Pomocí samotného balíčku můžete model nasadit místně pro produkční prostředí a snadno ověřit bodovací (vstupní) skript v místním vývojovém prostředí. Pokud dojde k potížím s bodovacím skriptem, server vrátí chybu a umístění chyby.

Server lze také použít k vytvoření ověřovacích bran v kanálu kontinuální integrace a nasazení. Můžete například spustit server s kandidátským skriptem a spustit testovací sadu pro místní koncový bod.

Tento článek podporuje vývojáře, kteří chtějí použít odvozování serveru k místnímu ladění a popisuje, jak používat odvozování serveru s online koncovými body ve Windows.

Požadavky

Pokud chcete pro místní ladění použít server HTTP odvozování služby Azure Machine Learning, musí konfigurace obsahovat následující komponenty:

  • Python 3.8 nebo novější
  • Anaconda

Server HTTP odvozující službu Azure Machine Learning běží v operačních systémech s Windows a Linuxem.

Prozkoumání možností místního ladění pro online koncové body

Laděním koncových bodů místně před nasazením do cloudu můžete zachytit chyby v kódu a konfiguraci dříve. Pokud chcete ladit koncové body místně, máte několik možností, mezi které patří:

Tento článek popisuje, jak pracovat se serverem HTTP odvozováním služby Azure Machine Learning ve Windows.

Následující tabulka obsahuje přehled scénářů, které vám pomůžou zvolit nejlepší možnost:

Scénář Odvození serveru HTTP Místní koncový bod
Aktualizace místního prostředí Pythonu bez opětovného sestavení image Dockeru Yes No
Aktualizace hodnoticího skriptu Ano Yes
Aktualizace konfigurací nasazení (nasazení, prostředí, kód, model) No Ano
Integrace ladicího programu nástroje Microsoft Visual Studio Code (VS Code) Ano Yes

Když spustíte odvozovací server HTTP místně, můžete se zaměřit na ladění hodnoticí skript bez obav o konfigurace kontejneru nasazení.

Instalace balíčku azureml-inference-server-http

Balíček nainstalujete azureml-inference-server-http spuštěním následujícího příkazu:

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

Poznámka:

Abyste se vyhnuli konfliktům balíčků, nainstalujte server HTTP odvození ve virtuálním prostředí. Pomocí příkazu můžete pip install virtualenv pro konfiguraci povolit virtuální prostředí.

Místní ladění hodnoticího skriptu

Pokud chcete ladit bodovací skript místně, máte několik možností pro testování chování serveru:

Testování chování serveru pomocí fiktivního hodnoticího skriptu

  1. Vytvořte adresář s názvem server_quickstart pro uložení souborů:

    mkdir server_quickstart
    cd server_quickstart
    
  2. Pokud se chcete vyhnout konfliktům balíčků, vytvořte virtuální prostředí, například myenv, a aktivujte ho:

    python -m virtualenv myenv
    

    Poznámka:

    V Linuxu source myenv/bin/activate spusťte příkaz pro aktivaci virtuálního prostředí.

    Po otestování serveru můžete spuštěním deactivate příkazu deaktivovat virtuální prostředí Pythonu.

  3. azureml-inference-server-http Nainstalujte balíček z informačního kanálu pypi:

    python -m pip install azureml-inference-server-http
    
  4. Vytvořte vstupní skript. Následující příklad vytvoří základní vstupní skript a uloží ho do souboru s názvem 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. Spusťte server pomocí azmlinfsrv příkazu a nastavte soubor score.py jako vstupní skript:

    azmlinfsrv --entry_script score.py
    

    Poznámka:

    Server je hostovaný na adrese 0.0.0.0, což znamená, že naslouchá všem IP adresám hostitelského počítače.

  6. Pomocí nástroje odešlete na server curl žádost o bodování:

    curl -p 127.0.0.1:5001/score
    

    Server publikuje následující odpověď:

    {"message": "Hello, World!"}
    
  7. Po testování ukončete server stisknutím kombinace kláves Ctrl + C.

Teď můžete upravit soubor hodnoticího skriptu (score.py) a otestovat změny opětovným spuštěním serveru pomocí azmlinfsrv --entry_script score.py příkazu.

Integrace se sadou Visual Studio Code

Pokud chcete použít VS Code a rozšíření Pythonu k ladění pomocí balíčku azureml-inference-server-http, můžete použít režimy Spuštění a připojení.

  • V režimu spuštění nastavte soubor launch.json ve VS Code a spusťte server HTTP pro odvozování služby Azure Machine Learning v editoru VS Code:

    1. Spusťte VS Code a otevřete složku obsahující skript (score.py).

    2. Do souboru launch.json pro tento pracovní prostor ve VS Code přidejte následující konfiguraci:

      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. Spusťte relaci ladění ve VS Code tak, že vyberete Spustit>ladění nebo použijete klávesovou zkratku F5.

  • V případě režimu připojení spusťte v příkazovém okně server HTTP odvozování služby Azure Machine Learning a připojte se k procesu pomocí nástroje VS Code s rozšířením Pythonu:

    Poznámka:

    Pro Linux nejprve nainstalujte gdb balíček spuštěním sudo apt-get install -y gdb příkazu.

    1. Do souboru launch.json pro tento pracovní prostor ve VS Code přidejte následující konfiguraci:

      launch.json

      {
          "version": "0.2.0",
          "configurations": [
              {
                  "name": "Python: Attach using Process Id",
                  "type": "python",
                  "request": "attach",
                  "processId": "${command:pickProcess}",
                  "justMyCode": true
              }
          ]
        }
      
    2. V příkazovém okně spusťte odvozený server HTTP pomocí azmlinfsrv --entry_script score.py příkazu.

    3. Spusťte ladicí relaci ve VS Code:

      1. Vyberte Spustit spuštění>ladění nebo použijte klávesovou zkratku F5.

      2. V příkazovém okně zobrazte protokoly ze serveru odvozování a vyhledejte ID azmlinfsrv procesu příkazu (nikoli gunicorn):

        Snímek obrazovky znázorňující příkazové okno zobrazující protokoly ze serveru HTTP odvozování a ID procesu příkazu azmlinfsrv zvýrazněné

      3. V ladicím programu VS Code zadejte ID azmlinfsrv procesu příkazu.

        Pokud nástroj pro výběr procesu VS Code nevidíte, můžete ID procesu zadat ručně do processId pole souboru launch.json pro daný pracovní prostor.

V obou režimech můžete nastavit zarážky a ladit skript krok za krokem.

Použití kompletního příkladu

Následující postup spustí server místně s ukázkovými soubory (bodovací skript, soubor modelu a prostředí) z ukázkového úložiště služby Azure Machine Learning. Další příklady použití těchto ukázkových souborů najdete v tématu Nasazení a určení skóre modelu strojového učení pomocí online koncového bodu.

  1. Naklonujte ukázkové úložiště:

    git clone --depth 1 https://github.com/Azure/azureml-examples
    cd azureml-examples/cli/endpoints/online/model-1/
    
  2. Vytvoření a aktivace virtuálního prostředí pomocí conda:

    V tomto příkladu azureml-inference-server-http se balíček nainstaluje automaticky. Balíček je součástí závislé knihovny azureml-defaults balíčku v souboru conda.yml :

    # 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. Zkontrolujte svůj bodovací skript:

    online bodování/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. Spusťte odvozovací server HTTP zadáním hodnoticího skriptu a souboru modelu:

    Adresář modelu zadaný v parametru model_dir je definován pomocí AZUREML_MODEL_DIR proměnné a načtený ve skriptu bodování.

    V tomto případě zadáte aktuální adresář ./ , protože podadresář je zadaný ve skriptu bodování jako model/sklearn_regression_model.pkl.

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

    Když se server spustí a úspěšně vyvolá bodovací skript, otevře se ukázkový spouštěcí protokol . V opačném případě se v protokolu zobrazují chybové zprávy.

  5. Otestujte bodovací skript s ukázkovými daty:

    Otevřete jiné příkazové okno a přejděte do stejného pracovního adresáře, ve kterém příkaz spustíte.

    curl Pomocí nástroje odešlete na server ukázkový požadavek a obdržíte výsledek vyhodnocování:

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

    Pokud ve skriptu bodování nedojde k žádným problémům, skript vrátí výsledek bodování. Pokud dojde k problémům, můžete se pokusit aktualizovat bodovací skript a spustit server znovu a otestovat aktualizovaný skript.

Kontrola tras serveru

Odvozování serveru HTTP ve výchozím nastavení naslouchá na portu 5001 následujícími trasami:

Název Postup
Sonda živé aktivity 127.0.0.1:5001/
Skóre 127.0.0.1:5001/score
OpenAPI (swagger) 127.0.0.1:5001/swagger.json

Kontrola parametrů serveru

Odvození serveru HTTP přijímá následující parametry:

Parametr Požaduje se Výchozí Description
entry_script True Identifikuje relativní nebo absolutní cestu ke skriptu bodování.
model_dir False Identifikuje relativní nebo absolutní cestu k adresáři, který obsahuje model použitý k odvozování.
port False 5001 Určuje obslužný port serveru.
worker_count False 0 Poskytuje počet pracovních vláken pro zpracování souběžných požadavků.
appinsights_instrumentation_key False Poskytuje instrumentační klíč pro Application Insights, kde se protokoly publikují.
access_control_allow_origins False Povolí CORS pro zadané původy, kde je více původů odděleno čárkou (,), například microsoft.com, bing.com.

Prozkoumání zpracování požadavků na server

Následující kroky ukazují, jak azure Machine Learning odvozuje server HTTP (azmlinfsrv) příchozí požadavky:

  1. Obálka rozhraní příkazového řádku Pythonu se nachází kolem zásobníku sítě serveru a slouží ke spuštění serveru.

  2. Klient odešle požadavek na server.

  3. Server odešle požadavek prostřednictvím serveru WSGI (Web Server Gateway Interface), který odešle požadavek do pracovní aplikace Flask:

  4. Aplikace pracovního procesu Flask zpracovává požadavek, který zahrnuje načtení vstupního skriptu a všech závislostí.

  5. Vstupní skript obdrží požadavek. Vstupní skript provede volání odvozování načteného modelu a vrátí odpověď:

Diagram znázorňující, jak odvozující server HTTP zpracovává příchozí požadavky

Prozkoumání protokolů serveru

Existují dva způsoby, jak získat data protokolu pro test odvozování serveru HTTP:

  • azureml-inference-server-http Spusťte balíček místně a zobrazte výstup protokolů.
  • Použijte online koncové body a prohlédněte si protokoly kontejneru. Protokol pro server odvozování má název Verze serveru <>HTTP pro odvozování ve službě Azure Machine Learning.

Poznámka:

Formát protokolování se od verze 0.8.0 změnil. Pokud váš protokol používá jiný styl, než se čekalo, aktualizujte azureml-inference-server-http balíček na nejnovější verzi.

Zobrazení spouštěcích protokolů

Po spuštění serveru se v protokolech zobrazí počáteční nastavení serveru následujícím způsobem:

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>

Když například spustíte server podle kompletního příkladu, protokol se zobrazí takto:

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.

Principy formátu dat protokolu

Všechny protokoly z odvozovacího serveru HTTP s výjimkou spouštěcího skriptu obsahují data v následujícím formátu:

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

Položka se skládá z následujících součástí:

  • <UTC Time>: Čas, kdy byla položka zadána do protokolu.
  • <pid>: ID procesu přidruženého k položce.
  • <level>: První znak úrovně protokolování pro položku, například E pro CHYBU, I informace a tak dále.
  • <logger name>: Název prostředku přidruženého k položce protokolu.
  • <message>: Obsah zprávy protokolu.

V Pythonu je šest úrovní protokolování s přiřazenými číselnými hodnotami podle závažnosti:

Úroveň protokolování Číselná hodnota
KRITICKÝ 50
CHYBA 40
VAROVÁNÍ 30
INFORMACE 20
LADICÍ 10
NOTSET 0

Řešení potíží se serverem

Následující části obsahují základní tipy pro řešení potíží pro server HTTP odvozování služby Azure Machine Learning. Informace o řešení potíží s online koncovými body najdete v tématu Řešení potíží s nasazením online koncových bodů.

Kontrola nainstalovaných balíčků

Při řešení problémů s nainstalovanými balíčky postupujte podle těchto kroků.

  1. Shromážděte informace o nainstalovaných balíčcích a verzích pro vaše prostředí Pythonu.

  2. Ověřte, že azureml-inference-server-http verze balíčku Pythonu zadaná v souboru prostředí odpovídá verzi serveru HTTP pro odvozování služby Azure Machine Learning zobrazenou v spouštěcím protokolu.

    V některých případech nástroj pro překladače závislostí pip nainstaluje neočekávané verze balíčků. Možná budete muset spustit pip , abyste opravovali nainstalované balíčky a verze.

  3. Pokud zadáte Flask nebo jeho závislosti ve vašem prostředí, odeberte tyto položky.

    • Závislé balíčky zahrnují flask, , itsdangerousjinja2, werkzeug, markupsafe, a click.
    • flask je uveden jako závislost v balíčku serveru. Nejlepším přístupem je umožnit serveru flask odvozovat balíček.
    • Pokud je server odvozování nakonfigurovaný tak, aby podporoval nové verze Flasku, server automaticky obdrží aktualizace balíčku, jakmile budou k dispozici.

Kontrola verze serveru

Balíček azureml-inference-server-http serveru se publikuje do PyPI. Stránka PyPI obsahuje protokol změn a všechny předchozí verze.

Pokud používáte starší verzi balíčku, aktualizujte konfiguraci na nejnovější verzi. Následující tabulka shrnuje stabilní verze, běžné problémy a doporučené úpravy:

Verze balíčku Popis Problém Rozlišení
0.4.x Zabalené v trénovacích obrázcích datovaných 20220601 nebo starších verzích a azureml-defaults verzích .1.34 balíčků prostřednictvím 1.43. Nejnovější stabilní verze je 0.4.13. U serverových verzí starších než 0.4.11 může docházet k problémům se závislostmi Flasku, například "can't import name Markup from jinja2". Pokud je to možné, upgradujte na verzi 0.4.13 nebo 0.8.x.
0.6.x Předinstalováno při odvozování imagí datovaných 20220516 a dřívějších verzí. Nejnovější stabilní verze je 0.6.1. N/A
0.7.x Podporuje Flask 2. Nejnovější stabilní verze je 0.7.7. N/A
0.8.x Změnil se formát protokolu. Podpora Pythonu 3.6 skončila. N/A

Kontrola závislostí balíčků

Mezi nejdůležitější závislé balíčky pro azureml-inference-server-http balíček serveru patří:

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

Pokud jste balíček zadali azureml-defaults ve svém prostředí Pythonu, azureml-inference-server-http je balíček závislým balíčkem. Závislost se nainstaluje automaticky.

Tip

Pokud používáte sadu Python SDK v1 a explicitně nezadáte azureml-defaults balíček v prostředí Pythonu, může sada SDK balíček automaticky přidat. Verze packageru je však uzamčená vzhledem k verzi sady SDK. Pokud je 1.38.0například verze sady SDK , položka azureml-defaults==1.38.0 se přidá do požadavků pip prostředí.

TypeError při spuštění serveru

Při spuštění serveru se může zobrazit následující TypeError :

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

K této chybě dochází v případě, že máte ve svém prostředí Pythonu nainstalovaný Flask 2, ale azureml-inference-server-http verze balíčku flask 2 nepodporuje. Podpora flask 2 je k dispozici v azureml-inference-server-http balíčku verze 0.7.0 a novější a azureml-defaults balíček verze 1.44 a novější.

  • Pokud balíček Flask 2 nepoužíváte v imagi Dockeru služby Azure Machine Learning, použijte nejnovější verzi azureml-inference-server-http balíčku nebo azureml-defaults balíčku.

  • Pokud v imagi Dockeru služby Azure Machine Learning použijete balíček Flask 2, ověřte, že verze sestavení image je 2022 nebo novější.

    Verzi image najdete v protokolech kontejneru. Příklad:

    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 | 
    

    Datum sestavení obrázku se zobrazí po zápisu Materialization Build . V předchozím příkladu je 20220708 verze image 8. července 2022. Obrázek v tomto příkladu je kompatibilní s Flaskem 2.

    Pokud v protokolu kontejneru nevidíte podobnou zprávu, vaše image je za aktuální a měla by se aktualizovat. Pokud používáte image CUDA (Compute Unified Device Architecture) a nemůžete najít novější image, zkontrolujte, jestli je vaše image v kontejnerech AzureML zastaralá. Určené nahrazení zastaralých imagí najdete.

    Pokud používáte server s online koncovým bodem, najdete protokoly také na stránce Protokoly na stránce Koncové body v studio Azure Machine Learning.

Pokud nasadíte pomocí sady SDK v1 a explicitně nezadáte image v konfiguraci nasazení, server použije openmpi4.1.0-ubuntu20.04 balíček s verzí, která odpovídá vaší místní sadě nástrojů sady SDK. Nainstalovaná verze ale nemusí být nejnovější dostupnou verzí image.

Pro sadu SDK verze 1.43 server ve výchozím nastavení nainstaluje openmpi4.1.0-ubuntu20.04:20220616 verzi balíčku, ale tato verze balíčku není kompatibilní se sadou SDK 1.43. Ujistěte se, že pro nasazení používáte nejnovější sadu SDK.

Pokud image nemůžete aktualizovat, můžete se dočasně vyhnout tomuto problému tak, že připnete azureml-defaults==1.43 položky nebo azureml-inference-server-http~=0.4.13 položky v souboru prostředí. Tyto položky směrují server k instalaci starší verze s flask 1.0.x.

ImportError nebo ModuleNotFoundError během spouštění serveru

Během spouštění serveru se můžete setkat s ImportError ModuleNotFoundError určitými moduly, například opencensus, jinja2, markupsafenebo click. Následující příklad ukazuje chybovou zprávu:

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

K chybám importu a modulu dochází při použití verze 0.4.10 nebo starších verzí serveru, které nepřipnou závislost Flask na kompatibilní verzi. Pokud chcete tomuto problému zabránit, nainstalujte novější verzi serveru.