Amazon SageMakeri reaalajas järelduste lõpp-punktide koormustestimise parimad tavad

Amazon SageMakeri reaalajas järelduste lõpp-punktide koormustestimise parimad tavad

Allikasõlm: 1889926

Amazon SageMaker on täielikult hallatav masinõppe (ML) teenus. SageMakeriga saavad andmeteadlased ja arendajad kiiresti ja lihtsalt luua ja koolitada ML-mudeleid ning seejärel juurutada need otse tootmisvalmis hostitud keskkonda. See pakub integreeritud Jupyteri loomismärkmiku eksemplari, mis võimaldab hõlpsalt juurdepääsu teie andmeallikatele uurimiseks ja analüüsimiseks, nii et te ei pea servereid haldama. See pakub ka ühist ML algoritmid mis on optimeeritud töötama tõhusalt jaotatud keskkonnas äärmiselt suurte andmetega.

SageMakeri reaalajas järeldus on ideaalne töökoormuste jaoks, millel on reaalajas, interaktiivsed ja madala latentsusajaga nõuded. SageMakeri reaalajas järelduse abil saate juurutada REST-i lõpp-punkte, mida toetab konkreetne eksemplaritüüp koos teatud arvutus- ja mälumahuga. SageMakeri reaalajas lõpp-punkti juurutamine on paljude klientide jaoks alles esimene samm teel tootmiseni. Soovime, et oleks võimalik maksimeerida lõpp-punkti jõudlust, et saavutada sihttehingute arv sekundis (TPS), järgides samas latentsusnõudeid. Suur osa jõudluse optimeerimisest järelduste tegemiseks seisneb selles, et valite õige eksemplari tüübi ja loendate lõpp-punkti tagasi.

See postitus kirjeldab SageMakeri lõpp-punkti koormustestimise parimaid tavasid, et leida eksemplaride arvu ja suuruse jaoks õige konfiguratsioon. See võib aidata meil mõista minimaalseid ette nähtud eksemplari nõudeid, et vastata meie latentsus- ja TPS-i nõuetele. Sealt uurime, kuidas saate jälgida ja mõista SageMakeri lõpp-punkti mõõdikuid ja jõudlust, kasutades Amazon CloudWatch mõõdikud.

Esmalt võrdleme oma mudeli toimivust ühel eksemplaril, et tuvastada TPS, mida see meie vastuvõetavate latentsusnõuete kohaselt suudab käsitleda. Seejärel ekstrapoleerime tulemused, et otsustada, mitu eksemplari vajame oma tootmisliikluse haldamiseks. Lõpuks simuleerime tootmistaseme liiklust ja seadistame reaalajas SageMakeri lõpp-punkti koormustestid, et kinnitada, et meie lõpp-punkt suudab tootmistaseme koormusega hakkama saada. Kogu näite koodikomplekt on saadaval järgmises GitHubi hoidla.

Ülevaade lahendusest

Selle postituse jaoks kasutame eelkoolitatud Kallistav nägu DistilBERT mudel alates Kallistamine Face Hub. See mudel suudab täita mitmeid ülesandeid, kuid saadame kasuliku koormuse spetsiaalselt sentimentide analüüsiks ja teksti klassifitseerimiseks. Selle proovi kasuliku koormusega püüame saavutada 1000 TPS-i.

Juurutage reaalajas lõpp-punkt

See postitus eeldab, et tunnete mudeli juurutamist. Viitama Looge oma lõpp-punkt ja juurutage oma mudel et mõista lõpp-punkti hostimise sisemisi tegureid. Praegu saame Hugging Face Hubis kiiresti sellele mudelile osutada ja järgmise koodilõigu abil juurutada reaalajas lõpp-punkti:

# 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
)

Testime oma lõpp-punkti kiiresti proovi kasuliku koormusega, mida tahame koormustestimiseks kasutada:


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

Pange tähele, et me toetame lõpp-punkti singli abil Amazon Elastic Compute Cloud (Amazon EC2) tüüpi ml.m5.12xlarge eksemplar, mis sisaldab 48 vCPU-d ja 192 GiB mälu. VCPU-de arv näitab hästi samaaegsust, mida eksemplar suudab käsitleda. Üldiselt on soovitatav testida erinevaid eksemplaritüüpe, veendumaks, et meil on eksemplar, mille ressursse kasutatakse õigesti. SageMakeri eksemplaride täieliku loendi ja nende vastava arvutusvõimsuse vaatamiseks reaalajas järelduste tegemiseks vaadake Amazon SageMakeri hinnakujundus.

Mõõdikud, mida jälgida

Enne koormustesti alustamist on oluline mõista, milliseid mõõdikuid jälgida, et mõista SageMakeri lõpp-punkti jõudluse jaotust. CloudWatch on peamine logimistööriist, mida SageMaker kasutab, et aidata teil mõista erinevaid mõõdikuid, mis kirjeldavad teie lõpp-punkti jõudlust. Saate kasutada CloudWatchi logisid lõpp-punkti kutsete silumiseks; siin on salvestatud kõik logimis- ja printimisväited, mis teie järelduskoodis on. Lisateabe saamiseks vaadake Kuidas Amazon CloudWatch töötab.

CloudWatch hõlmab SageMakeri jaoks kahte erinevat tüüpi mõõdikuid: eksemplaritaseme ja kutsumismõõdikud.

Eksemplaritaseme mõõdikud

Esimene parameetrite komplekt, mida tuleb arvesse võtta, on eksemplaritaseme mõõdikud. CPUUtilization ja MemoryUtilization (GPU-põhiste eksemplaride puhul GPUUtilization). Sest CPUUtilization, võite alguses CloudWatchis näha protsente üle 100%. Oluline on teadvustada CPUUtilization, kuvatakse kõigi CPU tuumade summa. Näiteks kui teie lõpp-punkti taga olev eksemplar sisaldab 4 vCPU-d, tähendab see, et kasutusvahemik on kuni 400%. MemoryUtilizationseevastu jääb vahemikku 0–100%.

Täpsemalt saate kasutada CPUUtilization et saada sügavamalt aru, kas teil on piisavalt või isegi liiga palju riistvara. Kui teil on vähekasutatud eksemplar (alla 30%), võite oma eksemplari tüüpi vähendada. Ja vastupidi, kui teie kasutusaste on umbes 80–90%, oleks kasulik valida suurema arvutus-/mälumahuga eksemplar. Meie testide põhjal soovitame teie riistvara kasutada umbes 60–70%.

Kutsumismõõdikud

Nagu nimigi viitab, on kutsumõõdikud koht, kus saame jälgida teie lõpp-punkti kõigi väljakutsete latentsusaega. Saate kasutada kutsumismõõdikuid, et jäädvustada vigade arv ja seda, millist tüüpi tõrkeid (5xx, 4xx jne), mida teie lõpp-punkt võib kogeda. Veelgi olulisem on see, et saate aru lõpp-punkti kõnede latentsusaja jaotusest. Palju sellest saab jäädvustada ModelLatency ja OverheadLatency mõõdikud, nagu on näidatud järgmisel diagrammil.

Hilinemised

. ModelLatency mõõdik kajastab aega, mis kulub järelduste tegemiseks SageMakeri lõpp-punkti taga olevas mudelikonteineris. Pange tähele, et mudelikonteiner sisaldab ka kõiki kohandatud järelduskoode või skripte, mille olete järelduste tegemiseks edastanud. Seda ühikut jäädvustatakse kutsumismõõdikuna mikrosekundites ja üldiselt saate CloudWatchi (p99, lk 90 ja nii edasi) protsentiili joonistada, et näha, kas saavutate sihtlatentsuse. Pange tähele, et mudeli ja konteineri latentsusaega võivad mõjutada mitmed tegurid, näiteks järgmised.

  • Kohandatud järeldusskript – Olenemata sellest, kas olete juurutanud oma konteineri või kasutanud SageMakeri-põhist konteinerit koos kohandatud järelduste töötlejatega, on parim tava skripti profiili koostamine, et püüda kinni kõik toimingud, mis lisavad teie latentsusele palju aega.
  • Sideprotokoll – Kaaluge REST vs. gRPC ühendusi mudeliserveriga mudeli konteineris.
  • Mudeli raamistiku optimeerimine – See on raamistikuspetsiifiline, näiteks koos TensorFlow, saate häälestada mitmeid keskkonnamuutujaid, mis on TF-i teenindamise spetsiifilised. Kontrollige kindlasti, millist konteinerit te kasutate ja kas skripti või keskkonnamuutujatena saate konteinerisse sisestada raamistikupõhiseid optimeerimisi.

OverheadLatency mõõdetakse ajast, mil SageMaker päringu saab, kuni kliendile vastuse tagastamiseni, millest on maha arvatud mudeli latentsusaeg. See osa on suures osas väljaspool teie kontrolli ja jääb SageMakeri üldkulude alla.

Otsast lõpuni latentsusaeg tervikuna sõltub paljudest teguritest ja ei pruugi olla nende summa ModelLatency pluss OverheadLatency. Näiteks kui teie klient teeb InvokeEndpoint API-kõne Interneti kaudu, kliendi vaatenurgast oleks lõpp-otsani latentsusaeg internet + ModelLatency + OverheadLatency. Seetõttu on lõpp-punkti koormustestimisel soovitatav lõpp-punkti enda täpseks võrdlusuuringuks keskenduda lõpp-punkti mõõdikutele (ModelLatency, OverheadLatencyja InvocationsPerInstance), et SageMakeri lõpp-punkti täpselt võrrelda. Seejärel saab kõik otsast lõpuni latentsusega seotud probleemid eraldi eraldada.

Mõned küsimused, mida tuleks täieliku latentsusaja jaoks kaaluda.

  • Kus on klient, kes kasutab teie lõpp-punkti?
  • Kas teie kliendi ja SageMakeri käitusaja vahel on vahekihte?

Automaatne skaleerimine

Me ei käsitle selles postituses konkreetselt automaatset skaleerimist, kuid see on oluline kaalutlus, et varustada töökoormuse põhjal õige arv eksemplare. Sõltuvalt teie liiklusmustrist saate lisada automaatse skaleerimise poliitika teie SageMakeri lõpp-punkti. Skaleerimise võimalusi on erinevaid, nt TargetTrackingScaling, SimpleScalingja StepScaling. See võimaldab teie lõpp-punktil teie liiklusmustri alusel automaatselt sisse ja välja skaleerida.

Levinud valik on sihtmärgi jälgimine, kus saate määrata CloudWatchi mõõdiku või kohandatud mõõdiku, mille olete määratlenud ja selle alusel skaleerida. Automaatse skaleerimise sage kasutamine on jälgimine InvocationsPerInstance meetriline. Kui olete teatud TPS-is kitsaskoha tuvastanud, saate seda sageli kasutada mõõdikuna, et skaleerida suuremale arvule eksemplaridele, et tulla toime liikluse tippkoormusega. Automaatse skaleerimise SageMakeri lõpp-punktide põhjalikuma jaotuse saamiseks vaadake Automaatse skaleerimise järelduste lõpp-punktide konfigureerimine rakenduses Amazon SageMaker.

Koormustestimine

Kuigi me kasutame Locusti, et kuvada, kuidas saame testi mastaapselt laadida, kui proovite oma lõpp-punkti taga olevat eksemplari õiget suurust määrata, SageMakeri järelduste soovitus on tõhusam variant. Kolmanda osapoole koormuse testimise tööriistadega peate lõpp-punktid erinevates eksemplarides käsitsi juurutama. Inference Recommenderiga saate lihtsalt edastada massiivi eksemplaritüüpidest, mille vastu soovite laadida testi, ja SageMaker hakkab tööle töökohti iga sellise juhtumi puhul.

rändrohutirts

Selle näite puhul kasutame rändrohutirts, avatud lähtekoodiga koormuse testimise tööriist, mida saate Pythoni abil rakendada. Locust on sarnane paljude teiste avatud lähtekoodiga koormuse testimise tööriistadega, kuid sellel on mõned konkreetsed eelised.

  • Lihtne üles seada – Nagu selles postituses demonstreerime, anname edasi lihtsa Pythoni skripti, mida saab hõlpsasti teie konkreetse lõpp-punkti ja kasuliku koormuse jaoks ümber kujundada.
  • Hajutatud ja skaleeritav - Locust on sündmustepõhine ja kasutab gevent kapoti all. See on väga kasulik väga samaaegsete töökoormuste testimiseks ja tuhandete samaaegsete kasutajate simuleerimiseks. Kõrge TPS-i saate saavutada ühe Locusti käivitava protsessiga, kuid sellel on ka a hajutatud koormuse genereerimine funktsioon, mis võimaldab teil skaleerida mitmele protsessile ja kliendi masinale, nagu me selles postituses uurime.
  • Jaanileivapuu mõõdikud ja kasutajaliides – Locust jäädvustab mõõdikuna ka otsast lõpuni latentsust. See võib aidata teie CloudWatchi mõõdikuid täiendada, et luua teie testidest täielik pilt. See kõik on jäädvustatud Locusti kasutajaliidesesse, kus saate jälgida samaaegseid kasutajaid, töötajaid ja palju muud.

Locusti paremaks mõistmiseks vaadake neid dokumentatsioon.

Amazon EC2 seadistamine

Saate Locusti seadistada mis tahes teie jaoks sobivas keskkonnas. Selle postituse jaoks seadistasime EC2 eksemplari ja installime sinna oma testide läbiviimiseks Locusti. Kasutame c5.18xlarge EC2 eksemplari. Arvestada tuleb ka kliendipoolse arvutusvõimsusega. Mõnikord, kui kliendi poolel saab arvutusvõimsus otsa, seda sageli ei salvestata ja seda peetakse ekslikult SageMakeri lõpp-punkti veaks. Oluline on paigutada klient piisava arvutusvõimsusega kohta, mis suudab taluda testitavat koormust. Meie EC2 eksemplari puhul kasutame Ubuntu Deep Learning AMI-d, kuid võite kasutada mis tahes AMI-d, kui suudate Locusti masinas õigesti seadistada. EC2 eksemplari käivitamise ja sellega ühenduse loomise mõistmiseks vaadake õpetust Alustage Amazon EC2 Linuxi eksemplaridega.

Locusti kasutajaliidesele pääseb juurde pordi 8089 kaudu. Saame selle avada, kohandades EC2 eksemplari sissetuleva turvarühma reegleid. Avame ka pordi 22, et saaksime SSH-i EC2 eksemplari. Kaaluge allika ulatust kuni konkreetse IP-aadressini, millelt EC2 eksemplarile juurde pääsete.

Turvarühmad

Pärast ühenduse loomist oma EC2 eksemplariga seadistame Pythoni virtuaalse keskkonna ja installime avatud lähtekoodiga Locust API CLI kaudu:

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

Oleme nüüd valmis Locustiga meie lõpp-punkti koormustestimiseks koostööd tegema.

Jaanileiva testimine

Kõik Locusti koormustestid viiakse läbi a Jaanileiva fail mida pakute. See Locusti fail määratleb koormustesti ülesande; siin määratleme oma Boto3 invoke_endpoint API kutse. Vaadake järgmist koodi:

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

Eelmises koodis kohandage oma väljakutse lõpp-punkti kõne parameetreid, et need sobiksid teie konkreetse mudeli kutsumisega. Me kasutame InvokeEndpoint API, mis kasutab Locusti failis järgmist koodijuppi; see on meie koormustesti tööpunkt. Locusti fail, mida me kasutame, on 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()

Nüüd, kui meil on Locusti skript valmis, tahame käitada hajutatud Locusti teste, et testida meie üksikut eksemplari, et teada saada, kui suure liiklusega meie eksemplar hakkama saab.

Locust'i hajutatud režiim on pisut nüansirikkam kui ühe protsessiga Locust test. Hajutatud režiimis on meil üks peamine ja mitu töötajat. Peamine töötaja juhendab töötajaid päringu saatvate samaaegsete kasutajate loomise ja kontrollimise kohta. Meie levitatud.sh skripti, näeme vaikimisi, et 240 kasutajat jaotatakse 60 töötaja vahel. Pange tähele, et --headless lipp Locusti CLI-s eemaldab Locusti kasutajaliidese funktsiooni.

#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

Esmalt käivitame hajutatud testi ühel eksemplaril, mis toetab lõpp-punkti. Siin on mõte, et tahame täielikult maksimeerida ühte eksemplari, et mõista eksemplaride arvu, mida vajame oma siht-TPS-i saavutamiseks, jäädes samas latentsusnõuete piiresse. Pange tähele, et kui soovite kasutajaliidesele juurde pääseda, muutke Locust_UI keskkonnamuutuja väärtuseks Tõene ja määrake oma EC2 eksemplari avalik IP ja seostage port 8089 URL-iga.

Järgmine ekraanipilt näitab meie CloudWatchi mõõdikuid.

CloudWatchi mõõdikud

Lõpuks märkame, et kuigi algselt saavutame TPS-i 200, hakkame oma EC5 kliendipoolsetes logides märkama 2xx vigu, nagu on näidatud järgmisel ekraanipildil.

Samuti saame seda kontrollida, vaadates konkreetselt meie eksemplari tasemel mõõdikuid CPUUtilization.

CloudWatchi mõõdikudSiin me märkame CPUUtilization peaaegu 4,800%. Meie eksemplaris ml.m5.12x.large on 48 vCPU-d (48 * 100 = 4800~). See küllastab kogu eksemplari, mis aitab selgitada ka meie 5xx vigu. Samuti näeme kasvu ModelLatency.

Näib, et meie üksik eksemplar kukub ümber ja tal pole arvutusi, et taluda koormust, mis ületab 200 TPS-i, mida jälgime. Meie siht-TPS on 1000, nii et proovime oma eksemplaride arvu suurendada 5-ni. Tootmisseades võib see olla veelgi suurem, sest pärast teatud punkti jälgisime 200 TPS-i juures vigu.

Lõpp-punkti seaded

Nii Locusti kasutajaliidese kui ka CloudWatchi logides näeme, et meie TPS on peaaegu 1000 ja lõpp-punkti toetab viis eksemplari.

rändrohutirts

CloudWatchi mõõdikudKui teil hakkab isegi selle riistvaraseadistuse korral vigu ilmnema, jälgige kindlasti CPUUtilization et mõista oma lõpp-punkti hostimise taga olevat täielikku pilti. Väga oluline on mõista oma riistvara kasutust, et näha, kas teil on vaja suurendada või isegi vähendada. Mõnikord põhjustavad konteineritaseme probleemid 5xx-vigu, kuid kui CPUUtilization on madal, näitab see, et need probleemid võib põhjustada mitte teie riistvara, vaid miski konteineri või mudeli tasemel (näiteks õige keskkonnamuutuja töötajate arvu jaoks pole määratud). Teisest küljest, kui märkate, et teie eksemplar hakkab täielikult täis saama, on see märk sellest, et peate kas suurendama praegust eksemplariparki või proovima suuremat eksemplari väiksema pargiga.

Kuigi suurendasime 5 TPS-i käsitlemiseks eksemplaride arvu 100-ni, näeme, et ModelLatency mõõdik on endiselt kõrge. Selle põhjuseks on eksemplaride küllastumine. Üldiselt soovitame kasutada eksemplari ressursse 60–70%.

Koristage

Pärast koormustestimist puhastage kindlasti kõik ressursid, mida te ei kasuta SageMakeri konsooli või delete_endpoint Boto3 API kõne. Lisaks peatage kindlasti oma EC2 eksemplar või mis tahes kliendi seadistus, et teil ei tekiks ka seal täiendavaid tasusid.

kokkuvõte

Selles postituses kirjeldasime, kuidas saate oma SageMakeri reaalajas lõpp-punkti laadida. Arutasime ka, milliseid mõõdikuid peaksite oma lõpp-punkti koormustestimisel hindama, et jõudluse jaotust mõista. Kontrollige kindlasti SageMakeri järelduste soovitus eksemplari õige suuruse määramise ja jõudluse optimeerimise tehnikate paremaks mõistmiseks.


Autoritest

Marc Karp on SageMaker Service meeskonnaga ML arhitekt. Ta keskendub klientide abistamisele ML-töökoormuste ulatuslikul kavandamisel, juurutamisel ja haldamisel. Vabal ajal meeldib talle reisida ja avastada uusi kohti.

Ram Vegiraju on SageMaker Service meeskonnaga ML arhitekt. Ta keskendub sellele, et aidata klientidel luua ja optimeerida oma AI/ML-lahendusi Amazon SageMakeris. Vabal ajal armastab ta reisimist ja kirjutamist.

Ajatempel:

Veel alates AWS-i masinõpe