Nyelvi modellek üzembe helyezése kötegelt végpontokon
ÉRVÉNYES:Azure CLI ml-bővítmény v2 (aktuális)Python SDK azure-ai-ml v2 (aktuális)
A Batch-végpontok felhasználhatók drága modellek, például nyelvi modellek szöveges adatokon keresztüli üzembe helyezésére. Ebben az oktatóanyagban megtudhatja, hogyan helyezhet üzembe olyan modellt, amely képes a HuggingFace modell használatával a hosszú szövegsorozatok szöveges összegzésére. Azt is bemutatja, hogyan lehet következtetésoptimalizálást végezni a HuggingFace optimum
és accelerate
a tárak használatával.
A minta ismertetése
A modell, amellyel dolgozni fogunk, a HuggingFace népszerű könyvtárátalakítóival, valamint egy előre betanított Facebook-modellel és a BART architektúrával készült. A bart: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation című tanulmányban jelent meg. Ez a modell a következő korlátozásokkal rendelkezik, amelyeket fontos szem előtt tartani az üzembe helyezéshez:
- Akár 1024 jogkivonatot tartalmazó sorozatokkal is használható.
- A szöveg angol nyelvű összegzésére van betanítve.
- Torch-ot használjuk háttérrendszerként.
A cikkben szereplő példa az azureml-examples adattárban található kódmintákon alapul. Ha helyileg szeretné futtatni a parancsokat a YAML és más fájlok másolása/beillesztése nélkül, először klónozza az adattárat, majd módosítsa a könyvtárakat a mappára:
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
A példában szereplő fájlok a következők:
cd endpoints/batch/deploy-models/huggingface-text-summarization
Követés a Jupyter Notebooksban
Ezt a mintát követheti egy Jupyter Notebookban. A klónozott adattárban nyissa meg a következő jegyzetfüzetet: text-summarization-batch.ipynb.
Előfeltételek
Azure-előfizetés. Ha még nincs Azure-előfizetése, kezdés előtt hozzon létre egy ingyenes fiókot. Próbálja ki az Azure Machine Learning ingyenes vagy fizetős verzióját.
Egy Azure Machine Learning-munkaterület. Munkaterület létrehozásához lásd: Azure Machine Learning-munkaterületek kezelése.
Győződjön meg arról, hogy rendelkezik a következő engedélyekkel a Machine Learning-munkaterületen:
- Batch-végpontok és -üzemelő példányok létrehozása vagy kezelése: Használjon tulajdonosi, közreműködői vagy egyéni szerepkört, amely lehetővé teszi
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
. - Azure Resource Manager-üzemelő példányok létrehozása a munkaterület erőforráscsoportjában: Használjon tulajdonosi, közreműködői vagy egyéni szerepkört, amely lehetővé teszi
Microsoft.Resources/deployments/write
abban az erőforráscsoportban, amelyben a munkaterület telepítve van.
- Batch-végpontok és -üzemelő példányok létrehozása vagy kezelése: Használjon tulajdonosi, közreműködői vagy egyéni szerepkört, amely lehetővé teszi
Telepítse a következő szoftvert a Machine Learning használatához:
Futtassa a következő parancsot az Azure CLI és az
ml
Azure Machine Learning bővítményének telepítéséhez:az extension add -n ml
A Batch-végpontok folyamatösszetevő-üzembe helyezését az
ml
Azure CLI bővítményének 2.7-es verziójában vezetjük be.az extension update --name ml
A parancs használatával szerezze be a legújabb verziót.
Csatlakozás a munkaterülethez
A munkaterület a Machine Learning legfelső szintű erőforrása. Központosított helyet biztosít a Machine Learning használatakor létrehozott összes összetevővel való munkához. Ebben a szakaszban ahhoz a munkaterülethez csatlakozik, ahol végrehajtja az üzembe helyezési feladatokat.
A következő parancsban adja meg az előfizetés azonosítójának, munkaterületének, helyének és erőforráscsoportjának értékeit:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
A modell regisztrálása
A modell mérete miatt nem szerepel ebben az adattárban. Ehelyett letölthet egy másolatot a HuggingFace-modell központjából. Szüksége van a csomagokra transformers
, és torch
telepíteni kell a használt környezetben.
%pip install transformers torch
A következő kóddal töltse le a modellt egy mappába model
:
from transformers import pipeline
model = pipeline("summarization", model="facebook/bart-large-cnn")
model_local_path = 'model'
summarizer.save_pretrained(model_local_path)
Most már regisztrálhatjuk ezt a modellt az Azure Machine Learning regisztrációs adatbázisában:
MODEL_NAME='bart-text-summarization'
az ml model create --name $MODEL_NAME --path "model"
A végpont létrehozása
Létrehozunk egy kötegvégpontot, amely a HuggingFace-modell üzembe helyezésének helyét adja text-summarization-batch
meg a szövegösszesítés angol nyelvű szövegfájlokon való futtatásához.
Döntse el a végpont nevét. A végpont neve a végponthoz társított URI-ban végződik. Emiatt a kötegvégpontok nevének egyedinek kell lennie egy Azure-régióban. Például csak egy kötegvégpont lehet, amelyben a név
mybatchendpoint
szerepelwestus2
.A kötegvégpont konfigurálása
A következő YAML-fájl egy kötegvégpontot határoz meg:
endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json name: text-summarization-batch description: A batch endpoint for summarizing text using a HuggingFace transformer model. auth_mode: aad_token
Hozza létre a végpontot:
Az üzembe helyezés létrehozása
Hozzuk létre a modellt üzemeltető üzembe helyezést:
Létre kell hoznunk egy pontozószkriptet, amely képes beolvasni a kötegtelepítés által biztosított CSV-fájlokat, és visszaadni a modell pontszámait az összegzéssel. A következő szkript a következő műveleteket hajtja végre:
- Olyan függvényt
init
jelöl, amely észleli a hardverkonfigurációt (CPU és GPU), és ennek megfelelően tölti be a modellt. A modell és a tokenizer is globális változókba van betöltve. Nem használunk objektumotpipeline
a HuggingFace-ből, hogy figyelembe vesszük a jelenleg használt modell sorozatának korlátozását. - Figyelje meg, hogy modelloptimalizálásokat hajtunk végre a teljesítmény javítása érdekében a kódtárak és
accelerate
a kódtárak használatávaloptimum
. Ha a modell vagy a hardver nem támogatja, az üzembe helyezést ilyen optimalizálás nélkül futtatjuk. - Egy függvényt
run
jelöl, amelyet a batch üzembe helyezése által biztosított mini kötegekhez hajtanak végre. - A
run
függvény a teljes köteget beolvassa adatasets
kódtár használatával. Az összegezni kívánt szöveg az oszlopbantext
található. - A
run
metódus a szöveg minden során végigfuttat, és futtatja az előrejelzést. Mivel ez egy nagyon költséges modell, az előrejelzés teljes fájlokon való futtatása memóriakivételt eredményez. Figyelje meg, hogy a modell nem fut apipeline
következő objektummaltransformers
: . Ez a hosszú szöveges sorozatok és az 1024-jogkivonatok korlátozásának figyelembe vételével történik a használt alapul szolgáló modellben. - A megadott szöveg összegzését adja vissza.
kód/batch_driver.py
import os import time import torch import subprocess import mlflow from pprint import pprint from transformers import AutoTokenizer, BartForConditionalGeneration from optimum.bettertransformer import BetterTransformer from datasets import load_dataset def init(): global model global tokenizer global device cuda_available = torch.cuda.is_available() device = "cuda" if cuda_available else "cpu" if cuda_available: print(f"[INFO] CUDA version: {torch.version.cuda}") print(f"[INFO] ID of current CUDA device: {torch.cuda.current_device()}") print("[INFO] nvidia-smi output:") pprint( subprocess.run(["nvidia-smi"], stdout=subprocess.PIPE).stdout.decode( "utf-8" ) ) else: print( "[WARN] CUDA acceleration is not available. This model takes hours to run on medium size data." ) # AZUREML_MODEL_DIR is an environment variable created during deployment model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model") # load the tokenizer tokenizer = AutoTokenizer.from_pretrained( model_path, truncation=True, max_length=1024 ) # Load the model try: model = BartForConditionalGeneration.from_pretrained( model_path, device_map="auto" ) except Exception as e: print( f"[ERROR] Error happened when loading the model on GPU or the default device. Error: {e}" ) print("[INFO] Trying on CPU.") model = BartForConditionalGeneration.from_pretrained(model_path) device = "cpu" # Optimize the model if device != "cpu": try: model = BetterTransformer.transform(model, keep_original_model=False) print("[INFO] BetterTransformer loaded.") except Exception as e: print( f"[ERROR] Error when converting to BetterTransformer. An unoptimized version of the model will be used.\n\t> {e}" ) mlflow.log_param("device", device) mlflow.log_param("model", type(model).__name__) def run(mini_batch): resultList = [] print(f"[INFO] Reading new mini-batch of {len(mini_batch)} file(s).") ds = load_dataset("csv", data_files={"score": mini_batch}) start_time = time.perf_counter() for idx, text in enumerate(ds["score"]["text"]): # perform inference inputs = tokenizer.batch_encode_plus( [text], truncation=True, padding=True, max_length=1024, return_tensors="pt" ) input_ids = inputs["input_ids"].to(device) summary_ids = model.generate( input_ids, max_length=130, min_length=30, do_sample=False ) summaries = tokenizer.batch_decode( summary_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False ) # Get results: resultList.append(summaries[0]) rps = idx / (time.perf_counter() - start_time + 00000.1) print("Rows per second:", rps) mlflow.log_metric("rows_per_second", rps) return resultList
Tipp.
Bár a fájlokat az üzembe helyezés mini kötegekben biztosítja, ez a pontozó szkript egyszerre egy sort dolgoz fel. Ez egy gyakori minta drága modellek (például transzformátorok) kezelésekor, mivel a teljes köteg betöltése és a modellbe való egyidejű elküldése nagy memóriaterhelést okozhat a batch-végrehajtóra (OOM-példapéldák).
- Olyan függvényt
Meg kell jelölnünk, hogy melyik környezetben fogjuk futtatni az üzembe helyezést. A mi esetünkben a modell fut,
Torch
és a kódtárakratransformers
ésaccelerate
optimum
a HuggingFace-ből van szükség. Az Azure Machine Learning már rendelkezik torch- és GPU-támogatással rendelkező környezettel. Csak néhány függőséget fogunk hozzáadni egyconda.yaml
fájlhoz.environment/torch200-conda.yaml
name: huggingface-env channels: - conda-forge dependencies: - python=3.8.5 - pip - pip: - torch==2.0 - transformers - accelerate - optimum - datasets - mlflow - azureml-mlflow - azureml-core - azureml-dataset-runtime[fuse]
A korábban említett conda-fájlt az alábbiak szerint használhatjuk:
A környezetdefiníció szerepel az üzembehelyezési fájlban.
deployment.yml
compute: azureml:gpu-cluster environment: name: torch200-transformers-gpu image: mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.8-cudnn8-ubuntu22.04:latest
Fontos
A létrehozott környezethez
torch200-transformers-gpu
egy CUDA 11.8-kompatibilis hardvereszközre van szükség a Torch 2.0 és az Ubuntu 20.04 futtatásához. Ha a GPU-eszköz nem támogatja a CUDA ezen verzióját, ellenőrizheti az alternatívtorch113-conda.yaml
conda környezetet (amely szintén elérhető az adattárban), amely a Torch 1.3-at futtatja az Ubuntu 18.04-es verzióján keresztül a CUDA 10.1-es verziójával. Ebben a konfigurációban azonban a gyorsítás ésaccelerate
aoptimum
kódtárak használata nem támogatott.Minden üzembe helyezés számítási fürtökön fut. Az Azure Machine Learning Compute-fürtöket (AmlCompute) és a Kubernetes-fürtöket egyaránt támogatják. Ebben a példában a modellünk profitálhat a GPU-gyorsításból, ezért használunk GPU-fürtöt.
az ml compute create -n gpu-cluster --type amlcompute --size STANDARD_NV6 --min-instances 0 --max-instances 2
Feljegyzés
A számításért ezen a ponton nem számítunk fel díjat, mivel a fürt 0 csomóponton marad, amíg meg nem hívja a batch végpontot, és el nem küld egy kötegpontozási feladatot. További információ az AmlCompute költségeinek kezeléséről és optimalizálásáról.
Most hozzuk létre az üzembe helyezést.
Ha új üzembe helyezést szeretne létrehozni a létrehozott végpont alatt, hozzon létre egy konfigurációt
YAML
az alábbihoz hasonlóan. További tulajdonságokat a teljes kötegelt végpont YAML-sémája is ellenőrizhet.deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json endpoint_name: text-summarization-batch name: text-summarization-optimum description: A text summarization deployment implemented with HuggingFace and BART architecture with GPU optimization using Optimum. type: model model: azureml:bart-text-summarization@latest compute: azureml:gpu-cluster environment: name: torch200-transformers-gpu image: mcr.microsoft.com/azureml/openmpi4.1.0-cuda11.8-cudnn8-ubuntu22.04:latest conda_file: environment/torch200-conda.yaml code_configuration: code: code scoring_script: batch_driver.py resources: instance_count: 2 settings: max_concurrency_per_instance: 1 mini_batch_size: 1 output_action: append_row output_file_name: predictions.csv retry_settings: max_retries: 1 timeout: 3000 error_threshold: -1 logging_level: info
Ezután hozza létre az üzembe helyezést a következő paranccsal:
az ml batch-deployment create --file deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
Fontos
Ebben az üzembe helyezésben nagy értéket fog látni a paraméterben
timeout
retry_settings
. Ennek oka a futó modell természete. Ez egy nagyon költséges modell, és egy sor következtetése akár 60 másodpercet is igénybe vehet. Atimeout
paraméterek azt határozzák meg, hogy mennyi ideig kell várnia a Batch üzembe helyezésének, amíg a pontozási szkript befejezi az egyes mini kötegek feldolgozását. Mivel a modell sorról sorra futtat előrejelzéseket, egy hosszú fájl feldolgozása időigényes lehet. Azt is megfigyelheti, hogy a kötegenkénti fájlok száma 1 (mini_batch_size=1
). Ez ismét kapcsolódik az általunk végzett munka természetéhez. A kötegenként egyszerre egy fájl feldolgozása elég költséges ahhoz, hogy igazolja azt. Ezt az NLP-feldolgozás mintájaként fogja látni.Bár meghívhat egy adott üzembe helyezést egy végponton belül, általában magát a végpontot szeretné meghívni, és hagyja, hogy a végpont döntse el, melyik üzembe helyezést használja. Az ilyen üzembe helyezés neve "alapértelmezett" üzemelő példány. Ez lehetővé teszi az alapértelmezett üzembe helyezés megváltoztatását, és ezáltal az üzembe helyezést kiszolgáló modell módosítását anélkül, hogy módosítaná a végpontot megvevő felhasználóval kötött szerződést. Az alapértelmezett üzembe helyezés frissítéséhez használja az alábbi utasításokat:
Ezen a ponton a kötegvégpont készen áll a használatra.
Az üzembe helyezés tesztelése
A végpont teszteléséhez a BillSum: A Corpus for Automatic Summarization of US Legislation adatkészletet fogjuk használni. Ez a minta szerepel a mappában data
lévő adattárban. Figyelje meg, hogy az adatok formátuma CSV, és az összegzendő tartalom az oszlop text
alatt található, a modell által elvárt módon.
Hívjuk meg a végpontot:
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input data --input-type uri_folder --query name -o tsv)
Tipp.
Figyelje meg, hogy a helyi elérési út bemenetként való megjelölésével az adatok feltölthetők az Alapértelmezett Azure Machine Learning-tárfiókba.
A parancs visszatérése után azonnal elindul egy kötegelt feladat. A feladat állapotát a befejezésig figyelheti:
Az üzembe helyezés befejezése után letöltheti az előrejelzéseket:
Szövegeket feldolgozó modellek üzembe helyezésekor megfontolandó szempontok
Ahogy az oktatóanyag néhány megjegyzésében is említettük, a szöveg feldolgozása bizonyos sajátosságokkal rendelkezhet, amelyek a kötegelt üzembe helyezéshez speciális konfigurációt igényelnek. A kötegtelepítés tervezésekor vegye figyelembe az alábbi szempontokat:
- Egyes NLP-modellek memória és számítási idő szempontjából nagyon költségesek lehetnek. Ha ez a helyzet, fontolja meg az egyes mini kötegeken található fájlok számának csökkentését. A fenti példában a számot kötegenként legalább 1 fájlra vettük fel. Bár lehet, hogy ez nem az Ön esete, vegye figyelembe, hogy a modell hány fájlt képes pontszámot adni minden alkalommal. Ne feledje, hogy a bemenet mérete és a modell memóriaigénye közötti kapcsolat nem feltétlenül lineáris a mélytanulási modellek esetében.
- Ha a modell nem is tud egyszerre egy fájlt kezelni (például ebben a példában), érdemes lehet sorba/adattömbbe beolvasni a bemeneti adatokat. Ha nagyobb átviteli sebességet vagy hardverkihasználtságot szeretne elérni, akkor a sorok szintjén implementálhatja a kötegelést.
- Állítsa be az
timeout
üzembe helyezés értékét a modell költségének és a várhatóan feldolgozandó adatok számának megfelelően. Ne feledje, hogy atimeout
köteg üzembe helyezési ideje azt jelzi, hogy a pontozószkript mikor fut egy adott kötegre. Ha a köteg számos fájllal vagy fájllal rendelkezik, amely sok sort tartalmaz, ez hatással van ennek a paraméternek a megfelelő értékére.
A szöveget feldolgozó MLflow-modellek szempontjai
A fent említett szempontok az MLflow-modellekre is érvényesek. Mivel azonban nem kell pontozószkriptet megadnia az MLflow-modell üzembe helyezéséhez, az említett javaslatok némelyike más megközelítést igényelhet.
- A Batch-végpontok MLflow-modelljei támogatják a táblázatos adatok bemeneti adatokként való olvasását, amelyek hosszú szöveges sorozatokat tartalmazhatnak. A támogatott fájltípusokról további információt a Fájltípusok támogatása című témakörben talál.
- A Batch-üzemelő példányok meghívják az MLflow-modell előrejelzési függvényét egy teljes fájl tartalmával Pandas-adatkeretként. Ha a bemeneti adatok sok sort tartalmaznak, valószínű, hogy egy összetett modell futtatása (például az oktatóanyagban bemutatott) memóriakivételt eredményez. Ha ez a helyzet, megfontolhatja a következő szempontokat:
- Testre szabhatja, hogyan futtatja a modell az előrejelzéseket, és implementálhatja a kötegelést. Az MLflow-modell következtetésének testreszabásáról az egyéni modellek naplózása című témakörben olvashat.
- Hozzon létre egy pontozószkriptet, és töltse be a modellt a használatával
mlflow.<flavor>.load_model()
. Részletekért lásd: MLflow-modellek használata pontozószkripttel .