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ří:
- Odvozovací server HTTP služby Azure Machine Learning
- Místní koncový bod
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:
- Zkuste fiktivní bodovací skript.
- Visual Studio Code použijte k ladění pomocí balíčku azureml-inference-server-http .
- Z našeho úložiště příkladů spusťte skutečný bodovací skript, soubor modelu a soubor prostředí.
Testování chování serveru pomocí fiktivního hodnoticího skriptu
Vytvořte adresář s názvem server_quickstart pro uložení souborů:
mkdir server_quickstart cd server_quickstart
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.azureml-inference-server-http
Nainstalujte balíček z informačního kanálu pypi:python -m pip install azureml-inference-server-http
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
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.
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!"}
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:
Spusťte VS Code a otevřete složku obsahující skript (score.py).
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" ] } ] }
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ímsudo apt-get install -y gdb
příkazu.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 } ] }
V příkazovém okně spusťte odvozený server HTTP pomocí
azmlinfsrv --entry_script score.py
příkazu.Spusťte ladicí relaci ve VS Code:
Vyberte Spustit spuštění>ladění nebo použijte klávesovou zkratku F5.
V příkazovém okně zobrazte protokoly ze serveru odvozování a vyhledejte ID
azmlinfsrv
procesu příkazu (nikoligunicorn
):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.
Naklonujte ukázkové úložiště:
git clone --depth 1 https://github.com/Azure/azureml-examples cd azureml-examples/cli/endpoints/online/model-1/
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é knihovnyazureml-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
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()
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.
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:
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.
Klient odešle požadavek na server.
Server odešle požadavek prostřednictvím serveru WSGI (Web Server Gateway Interface), který odešle požadavek do pracovní aplikace Flask:
Aplikace pracovního procesu Flask zpracovává požadavek, který zahrnuje načtení vstupního skriptu a všech závislostí.
Vstupní skript obdrží požadavek. Vstupní skript provede volání odvozování načteného modelu a vrátí odpověď:
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říkladE
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ů.
Shromážděte informace o nainstalovaných balíčcích a verzích pro vaše prostředí Pythonu.
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.Pokud zadáte Flask nebo jeho závislosti ve vašem prostředí, odeberte tyto položky.
- Závislé balíčky zahrnují
flask
, ,itsdangerous
jinja2
,werkzeug
,markupsafe
, aclick
. flask
je uveden jako závislost v balíčku serveru. Nejlepším přístupem je umožnit serveruflask
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.
- Závislé balíčky zahrnují
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.0
napří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 neboazureml-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 je20220708
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
, markupsafe
nebo 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.