Az Amazon SageMaker valós idejű következtetési végpontok terheléses tesztelésének bevált gyakorlatai

Az Amazon SageMaker valós idejű következtetési végpontok terheléses tesztelésének bevált gyakorlatai

Forrás csomópont: 1889926

Amazon SageMaker egy teljesen felügyelt gépi tanulási (ML) szolgáltatás. A SageMaker segítségével az adattudósok és fejlesztők gyorsan és egyszerűen építhetnek és taníthatnak ML-modelleket, majd közvetlenül telepíthetik azokat egy termelésre kész hosztolt környezetben. Integrált Jupyter szerzői jegyzetfüzet-példányt biztosít az adatforrásokhoz való könnyű hozzáféréshez feltárás és elemzés céljából, így nem kell szervereket kezelnie. Közösséget is biztosít ML algoritmusok amelyek úgy vannak optimalizálva, hogy hatékonyan fussanak rendkívül nagy adatokkal elosztott környezetben.

A SageMaker valós idejű következtetés ideális olyan munkaterhelésekhez, amelyek valós idejű, interaktív, alacsony késleltetésű követelményekkel rendelkeznek. A SageMaker valós idejű következtetéssel olyan REST-végpontokat telepíthet, amelyeket egy adott példánytípus támogat, bizonyos mennyiségű számítással és memóriával. A SageMaker valós idejű végpont telepítése sok ügyfél számára csak az első lépés a termelés felé vezető úton. Szeretnénk maximalizálni a végpont teljesítményét, hogy elérjük a másodpercenkénti tranzakciók (TPS) célértékét, miközben betartjuk a késleltetési követelményeket. A következtetések levonásához szükséges teljesítményoptimalizálás nagy része a megfelelő példánytípus kiválasztása és a végpont visszaszámlálása.

Ez a bejegyzés a SageMaker-végpont terhelési tesztelésének bevált gyakorlatait írja le, hogy megtalálja a megfelelő konfigurációt a példányok számához és méretéhez. Ez segíthet megértenünk a minimális kiépített példánykövetelményeket, hogy megfeleljünk késleltetési és TPS-követelményeinknek. Innentől kezdve belemerülünk abba, hogyan követheti nyomon és értheti meg a SageMaker végpont mérőszámait és teljesítményét a amazonfelhőóra mutatókat.

Először összehasonlítjuk modellünk teljesítményét egyetlen példányon, hogy azonosítsuk azt a TPS-t, amelyet elfogadható késleltetési követelményeink szerint kezelni tud. Ezután a megállapításokat extrapoláljuk, hogy eldöntsük, hány példányra van szükségünk a termelési forgalom kezeléséhez. Végül szimuláljuk a termelési szintű forgalmat, és terhelési teszteket állítunk be egy valós idejű SageMaker-végponthoz, hogy megbizonyosodjunk arról, hogy végpontunk képes kezelni a termelési szintű terhelést. A példa teljes kódkészlete az alábbiakban érhető el GitHub tárház.

A megoldás áttekintése

Ehhez a poszthoz egy előre kiképzett Átölelhető arc DistilBERT modell tól Átölelő Arc Hub. Ez a modell számos feladatot el tud végezni, de kifejezetten érzelemelemzésre és szövegosztályozásra küldünk egy hasznos terhet. Ezzel a minta hasznos teherrel 1000 TPS elérésére törekszünk.

Valós idejű végpont üzembe helyezése

Ez a bejegyzés feltételezi, hogy ismeri a modell üzembe helyezését. Hivatkozni Hozza létre a végpontot, és helyezze üzembe a modellt hogy megértsük a végpont hosztolása mögött rejlő belső dolgokat. Egyelőre gyorsan rámutathatunk erre a modellre a Hugging Face Hubban, és telepíthetünk egy valós idejű végpontot a következő kódrészlettel:

# Hub Model configuration. https://huggingface.co/models
hub = { 'HF_MODEL_ID':'distilbert-base-uncased', 'HF_TASK':'text-classification'
} # create Hugging Face Model Class
huggingface_model = HuggingFaceModel(
transformers_version='4.17.0',
pytorch_version='1.10.2',
py_version='py38',
env=hub,
role=role,
) # deploy model to SageMaker Inference
predictor = huggingface_model.deploy(
initial_instance_count=1, # number of instances
instance_type='ml.m5.12xlarge' # ec2 instance type
)

Teszteljük gyorsan végpontunkat a terhelési teszteléshez használni kívánt hasznos tehermintával:


import boto3
import json
client = boto3.client('sagemaker-runtime')
content_type = "application/json"
request_body = {'inputs': "I am super happy right now."}
data = json.loads(json.dumps(request_body))
payload = json.dumps(data)
response = client.invoke_endpoint(
EndpointName=predictor.endpoint_name,
ContentType=content_type,
Body=payload)
result = response['Body'].read()
result

Vegye figyelembe, hogy a végpontot singgel támogatjuk Amazon rugalmas számítási felhő (Amazon EC2) ml.m5.12xlarge típusú példány, amely 48 vCPU-t és 192 GiB memóriát tartalmaz. A vCPU-k száma jól jelzi a példány által kezelhető párhuzamosságot. Általában ajánlott a különböző példánytípusok tesztelése, hogy megbizonyosodjunk arról, hogy van olyan példányunk, amely megfelelően kihasznált erőforrásokkal rendelkezik. A SageMaker-példányok teljes listájának és a valós idejű következtetéshez tartozó számítási teljesítményüknek megtekintéséhez lásd: Amazon SageMaker árképzés.

Követendő mutatók

Mielőtt belevágnánk a terhelési tesztelésbe, elengedhetetlen annak megértése, hogy milyen mutatókat kell követni, hogy megértsük a SageMaker végpont teljesítménybeli lebontását. A CloudWatch az elsődleges naplózó eszköz, amelyet a SageMaker használ a végpont teljesítményét leíró különböző mutatók megértéséhez. Használhatja a CloudWatch naplóit a végpont-hívások hibakereséséhez; a következtetési kódban található összes naplózási és nyomtatási utasítás itt rögzítésre kerül. További információkért lásd: Hogyan működik az Amazon CloudWatch.

A CloudWatch két különböző típusú metrikát fed le a SageMaker számára: példányszintű és hívási metrikák.

Példányszintű mérőszámok

Az első figyelembe veendő paraméterkészlet a példányszintű metrikák: CPUUtilization és a MemoryUtilization (GPU-alapú példányok esetén GPUUtilization). mert CPUUtilization, először 100% feletti százalékokat láthat a CloudWatch-ben. Fontos, hogy felismerjük CPUUtilization, az összes CPU mag összege jelenik meg. Például, ha a végpont mögötti példány 4 vCPU-t tartalmaz, ez azt jelenti, hogy a kihasználtság 400%-ig terjed. MemoryUtilization, másrészt a 0-100% tartományba esik.

Konkrétan használhatod CPUUtilization hogy mélyebben megértse, elegendő vagy akár túl sok hardverrel rendelkezik. Ha van egy alulkihasznált példánya (kevesebb mint 30%), akkor csökkentheti a példány típusát. Ezzel szemben, ha a kihasználtság körülbelül 80–90%, akkor előnyös lenne egy nagyobb számítási/memóriájú példányt választani. Tesztjeink alapján a hardver körülbelül 60-70%-os kihasználtságát javasoljuk.

Meghívási mérőszámok

Ahogy a név is sugallja, a hívási metrikák azok, amelyekben nyomon követhetjük a végponthoz érkezett bármely hívás végpontok közötti késését. A hívási metrikák segítségével rögzítheti a hibaszámot, és rögzítheti, hogy a végpontja milyen típusú hibákat (5xx, 4xx és így tovább) tapasztalhat. Ennél is fontosabb, hogy megértheti a végponthívások késleltetési bontását. Ezzel sok mindent meg lehet fogni ModelLatency és a OverheadLatency mérőszámokat, amint azt a következő diagram mutatja.

késések

A ModelLatency A metrika azt az időt rögzíti, amely a SageMaker-végpont mögötti modelltárolón belül eltelik a következtetést. Vegye figyelembe, hogy a modelltároló minden egyéni következtetési kódot vagy szkripteket is tartalmaz, amelyeket a következtetéshez adott. Ezt az egységet a rendszer mikroszekundumokban rögzíti hívási mérőszámként, és általában a CloudWatch (p99, p90 és így tovább) százalékos értékét ábrázolja, hogy megtudja, eléri-e a megcélzott késleltetést. Vegye figyelembe, hogy számos tényező befolyásolhatja a modell és a tároló késését, például a következők:

  • Egyéni következtetési szkript – Függetlenül attól, hogy saját tárolót implementált, vagy SageMaker-alapú tárolót használt egyéni következtetéskezelőkkel, a legjobb gyakorlat a szkript profilozása, hogy elkapja azokat a műveleteket, amelyek kifejezetten megnövelik a várakozási időt.
  • Kommunikációs protokoll – Fontolja meg a REST vs. gRPC kapcsolatokat a modellkiszolgálóval a modelltárolón belül.
  • Modell keretrendszer optimalizálása – Ez keretspecifikus, pl TensorFlow, számos olyan környezeti változót hangolhat, amelyek TF-szolgáltatásspecifikusak. Ügyeljen arra, hogy ellenőrizze, milyen tárolót használ, és van-e olyan keretspecifikus optimalizálás, amelyet hozzáadhat a szkripten belül vagy környezeti változóként a tárolóba.

OverheadLatency a mérés attól az időponttól kezdődik, amikor a SageMaker megkapja a kérést, amíg az választ nem ad vissza az ügyfélnek, levonva a modell késleltetését. Ez a rész nagyrészt az Ön ellenőrzésén kívül esik, és a SageMaker rezsiköltségeinek ideje alá esik.

A végpontok közötti késleltetés egésze számos tényezőtől függ, és nem feltétlenül ezek összege ModelLatency plusz OverheadLatency. Például, ha az Ön ügyfele a InvokeEndpoint API-hívás az interneten keresztül, az ügyfél szemszögéből a végpontok közötti késleltetés internet + lenne ModelLatency + OverheadLatency. Ezért a végpont terheléses tesztelésekor magának a végpontnak a pontos összehasonlítása érdekében ajánlatos a végponti mérőszámokra összpontosítani (ModelLatency, OverheadLatencyés InvocationsPerInstance) a SageMaker végpont pontos összehasonlításához. A végpontok közötti késleltetéssel kapcsolatos problémák ezután külön elkülöníthetők.

Néhány megfontolandó kérdés a végpontok közötti késleltetéshez:

  • Hol van a végpontját hívó ügyfél?
  • Vannak közvetítő rétegek az ügyfél és a SageMaker futási környezet között?

Automatikus méretezés

Ebben a bejegyzésben nem foglalkozunk kifejezetten az automatikus méretezéssel, de ez fontos szempont a munkaterhelés alapján megfelelő számú példány biztosítása érdekében. A forgalmi mintáktól függően csatolhat egy automatikus méretezési szabályzat a SageMaker végpontjához. Különféle méretezési lehetőségek vannak, mint pl TargetTrackingScaling, SimpleScalingés StepScaling. Ez lehetővé teszi, hogy a végpont automatikusan be- és kicsinyítse a forgalmi mintázat alapján.

Gyakori lehetőség a célkövetés, ahol megadhat egy CloudWatch-mutatót vagy egyéni mérőszámot, amelyet definiált, és ez alapján méretezhet. Az automatikus méretezés gyakori használata követi a InvocationsPerInstance metrikus. Miután azonosított egy szűk keresztmetszetet egy bizonyos TPS-nél, gyakran használhatja ezt mérőszámként, hogy nagyobb számú példányra skálázzon, hogy képes legyen kezelni a forgalom csúcsterhelését. Az automatikus skálázás SageMaker végpontjainak részletesebb lebontásához tekintse meg a következőt: Automatikus skálázási következtetési végpontok konfigurálása az Amazon SageMakerben.

Terhelési tesztelés

Noha a Locust használjuk annak megjelenítésére, hogyan tölthetjük be a tesztet nagyarányúan, ha a végpont mögötti példányt próbálja megfelelő méretre állítani, SageMaker Inference Recommender hatékonyabb lehetőség. Harmadik féltől származó terhelési tesztelő eszközökkel manuálisan kell telepítenie a végpontokat a különböző példányokon. Az Inference Recommender segítségével egyszerűen átadhatja azoknak a példánytípusoknak a tömbjét, amelyekkel szemben tesztet szeretne betölteni, és a SageMaker felpörög. munkahelyek ezen esetek mindegyikére.

Sáska

Ebben a példában használjuk Sáska, egy nyílt forráskódú terheléstesztelő eszköz, amelyet a Python használatával valósíthat meg. A Locust hasonló sok más nyílt forráskódú terheléstesztelő eszközhöz, de van néhány konkrét előnye:

  • Egyszerű beállítás – Amint azt ebben a bejegyzésben bemutatjuk, egy egyszerű Python-szkriptet adunk át, amely könnyen átstrukturálható az adott végponthoz és hasznos terheléshez.
  • Elosztott és méretezhető – A Locust eseményalapú és hasznosítható gevent a motorháztető alatt. Ez nagyon hasznos nagyon egyidejű munkaterhelések teszteléséhez és több ezer párhuzamos felhasználó szimulálásához. Magas TPS-t érhet el egyetlen Locust futtató folyamattal, de rendelkezik a elosztott terhelés generálása Ez a funkció lehetővé teszi, hogy több folyamatra és ügyfélgépre skálázható, amint azt ebben a bejegyzésben megvizsgáljuk.
  • Sáska-metrikák és felhasználói felület – A Locust a végpontok közötti késést is rögzíti mérőszámként. Ez segíthet a CloudWatch-mutatók kiegészítésében, hogy teljes képet festhessen a tesztekről. Mindezt a Locust UI rögzíti, ahol nyomon követheti az egyidejű felhasználókat, dolgozókat és egyebeket.

A Locust további megértéséhez nézze meg őket dokumentáció.

Amazon EC2 beállítás

A Locust bármilyen kompatibilis környezetben beállíthatja. Ehhez a bejegyzéshez beállítunk egy EC2-példányt, és telepítjük oda a Locust a tesztek elvégzéséhez. C5.18xlarge EC2 példányt használunk. Az ügyféloldali számítási teljesítményt is figyelembe kell venni. Időnként, amikor elfogy a számítási teljesítmény az ügyféloldalon, ez gyakran nem kerül rögzítésre, és összetéveszthető SageMaker végponti hibának. Fontos, hogy az ügyfél megfelelő számítási teljesítményű helyre kerüljön, amely képes kezelni a tesztelt terhelést. EC2-példányunkhoz Ubuntu Deep Learning AMI-t használunk, de bármilyen AMI-t használhatunk, amennyiben megfelelően be tudja állítani a Locustot a gépen. Az EC2-példány elindításának és csatlakozásának megértéséhez tekintse meg az oktatóanyagot Kezdje el az Amazon EC2 Linux példányait.

A Locust UI a 8089-es porton keresztül érhető el. Ezt úgy nyithatjuk meg, hogy módosítjuk a bejövő biztonsági csoport szabályait az EC2 példányhoz. Megnyitjuk a 22-es portot is, hogy SSH-t tudjunk bevinni az EC2 példányba. Fontolja meg a forrás hatókörét arra az IP-címre, amelyről az EC2-példányt eléri.

Biztonsági csoportok

Miután csatlakozott az EC2 példányához, beállítunk egy Python virtuális környezetet, és telepítjük a nyílt forráskódú Locust API-t a CLI-n keresztül:

virtualenv venv #venv is the virtual environment name, you can change as you desire
source venv/bin/activate #activate virtual environment
pip install locust

Most már készen állunk arra, hogy együttműködjünk a Locusttal a végpontunk terhelési tesztelésében.

Sáska vizsgálat

Az összes Locust terhelési tesztet az a Sáska fájl hogy biztosítod. Ez a Locust fájl meghatároz egy feladatot a terhelési teszthez; itt határozzuk meg a Boto3-unkat invoke_endpoint API hívás. Lásd a következő kódot:

config = Config(
retries = { 'max_attempts': 0, 'mode': 'standard'
}
) self.sagemaker_client = boto3.client('sagemaker-runtime',config=config)
self.endpoint_name = host.split('/')[-1]
self.region = region
self.content_type = content_type
self.payload = payload

Az előző kódban állítsa be a meghívási végpont hívás paramétereit az adott modellhívásnak megfelelően. Használjuk a InvokeEndpoint API a következő kódrészletet használja a Locust fájlban; ez a terhelési tesztfutási pontunk. Az általunk használt Locust fájl locust_script.py.

def send(self): request_meta = { "request_type": "InvokeEndpoint", "name": "SageMaker", "start_time": time.time(), "response_length": 0, "response": None, "context": {}, "exception": None,
}
start_perf_counter = time.perf_counter() try:
response = self.sagemaker_client.invoke_endpoint(
EndpointName=self.endpoint_name,
Body=self.payload,
ContentType=self.content_type
)
response_body = response["Body"].read()

Most, hogy készen áll a Locust-szkriptünk, elosztott Locust-teszteket akarunk futtatni, hogy stressz-teszttel tesztelhessük egyetlen példányunkat, hogy megtudjuk, mekkora forgalmat képes kezelni példányunk.

A Locust elosztott mód egy kicsit árnyaltabb, mint az egyfolyamatos Locust teszt. Elosztott módban egy elsődleges és több dolgozónk van. Az elsődleges dolgozó utasítja a dolgozókat a kérést küldő egyidejű felhasználók létrehozására és vezérlésére. Miénkben terjesztett.sh script, alapértelmezés szerint azt látjuk, hogy 240 felhasználó lesz elosztva a 60 dolgozó között. Vegye figyelembe, hogy a --headless jelző a Locust CLI-ben eltávolítja a Locust felhasználói felület funkcióját.

#replace with your endpoint name in format https://<<endpoint-name>>
export ENDPOINT_NAME=https://$1 export REGION=us-east-1
export CONTENT_TYPE=application/json
export PAYLOAD='{"inputs": "I am super happy right now."}'
export USERS=240
export WORKERS=60
export RUN_TIME=1m
export LOCUST_UI=false # Use Locust UI .
.
. locust -f $SCRIPT -H $ENDPOINT_NAME --master --expect-workers $WORKERS -u $USERS -t $RUN_TIME --csv results &
.
.
. for (( c=1; c<=$WORKERS; c++ ))
do
locust -f $SCRIPT -H $ENDPOINT_NAME --worker --master-host=localhost &
done

./distributed.sh huggingface-pytorch-inference-2022-10-04-02-46-44-677 #to execute Distributed Locust test

Először futtatjuk az elosztott tesztet a végpontot támogató egyetlen példányon. Az ötlet az, hogy teljes mértékben maximalizálni akarunk egyetlen példányt, hogy megértsük a cél TPS eléréséhez szükséges példányszámot, miközben a késleltetési követelményeinken belül maradunk. Vegye figyelembe, hogy ha hozzá szeretne férni a felhasználói felülethez, módosítsa a Locust_UI környezeti változó True értékre, és vegye át az EC2-példány nyilvános IP-címét, és rendelje hozzá a 8089-es portot az URL-hez.

A következő képernyőkép a CloudWatch mérőszámainkat mutatja.

CloudWatch Metrics

Végül észrevesszük, hogy bár kezdetben 200-as TPS-t értünk el, 5xx hibákat kezdünk észrevenni az EC2 kliensoldali naplóinkban, amint az a következő képernyőképen látható.

Ezt úgy is ellenőrizhetjük, ha megnézzük a példányszintű mérőszámainkat CPUUtilization.

CloudWatch MetricsItt vesszük észre CPUUtilization közel 4,800%-on. Az ml.m5.12x.large példányunk 48 vCPU-val rendelkezik (48 * 100 = 4800 ~). Ez telíti az egész példányt, ami szintén segít megmagyarázni az 5xx hibáinkat. Növekedést is látunk ModelLatency.

Úgy tűnik, hogy egyetlen példányunk felborul, és nincs meg a számítási módja, hogy elviselje a megfigyelt 200 TPS feletti terhelést. A cél TPS-ünk 1000, ezért próbáljuk meg 5-re növelni a példányszámunkat. Éles környezetben ennek még többnek kell lennie, mert egy bizonyos pont után 200 TPS-nél észleltünk hibákat.

Végpont beállítások

Mind a Locust UI, mind a CloudWatch naplóiban azt látjuk, hogy közel 1000-es TPS-ünk van, és öt példány támogatja a végpontot.

Sáska

CloudWatch MetricsHa még ezzel a hardverbeállítással is hibákat tapasztal, ügyeljen a figyelésre CPUUtilization hogy megértse a végpont-tárhely mögötti teljes képet. Alapvető fontosságú, hogy megértse a hardverhasználatot, hogy megtudja, fel kell-e léptetnie vagy akár le is kell lépnie. Néha a tárolószintű problémák 5xx hibákhoz vezetnek, de ha CPUUtilization alacsony, ez azt jelzi, hogy nem a hardver, hanem valami a tároló vagy a modell szintjén okozhatja ezeket a problémákat (például nincs beállítva megfelelő környezeti változó a dolgozók számára). Másrészt, ha azt észleli, hogy a példánya teljesen telítődik, ez annak a jele, hogy vagy növelnie kell az aktuális példányflottát, vagy ki kell próbálnia egy nagyobb példányt egy kisebb flottával.

Bár a példányszámot 5-re növeltük a 100 TPS kezeléséhez, láthatjuk, hogy a ModelLatency a mérőszám még mindig magas. Ennek oka az esetek telítettsége. Általában azt javasoljuk, hogy a példány erőforrásait 60-70% között használja ki.

Tisztítsuk meg

A terhelési tesztelés után győződjön meg arról, hogy a SageMaker konzolon vagy a delete_endpoint Boto3 API hívás. Ezenkívül ügyeljen arra, hogy leállítsa az EC2-példányt vagy bármilyen más kliens beállítását, hogy ne számítson fel további költségeket.

Összegzésként

Ebben a bejegyzésben leírtuk, hogyan töltheti be a SageMaker valós idejű végpontját. Azt is megbeszéltük, hogy milyen mutatókat kell értékelnie a végpont terhelési tesztelésekor, hogy megértse a teljesítmény lebontását. Mindenképpen nézd meg SageMaker Inference Recommender hogy jobban megértsük a példányok megfelelő méretezését és több teljesítményoptimalizálási technikát.


A szerzőkről

Marc Karp ML építész a SageMaker Service csapatánál. Arra összpontosít, hogy segítse az ügyfeleket az ML-munkaterhelések nagyszabású tervezésében, telepítésében és kezelésében. Szabadidejében szívesen utazik és új helyeket fedez fel.

Ram Vegiraju ML építész a SageMaker Service csapatánál. Arra összpontosít, hogy segítse ügyfeleit AI/ML megoldásaik kiépítésében és optimalizálásában az Amazon SageMakeren. Szabadidejében szeret utazni és írni.

Időbélyeg:

Még több AWS gépi tanulás