Optimaliser slutningsjobbene dine ved å bruke dynamisk batchslutning med TorchServe på Amazon SageMaker

Kilde node: 1884601

I dyp læring refererer batchbehandling til å mate flere innganger inn i en modell. Selv om det er viktig under trening, kan det være svært nyttig å administrere kostnadene og optimalisere gjennomstrømmingen også under slutningstid. Maskinvareakseleratorer er optimalisert for parallellitet, og batching bidrar til å mette datakapasiteten og fører ofte til høyere gjennomstrømning.

Batching kan være nyttig i flere scenarier under modelldistribusjon i produksjon. Her kategoriserer vi dem grovt i to brukstilfeller:

  • Sanntidsapplikasjoner der flere slutningsforespørsler mottas fra forskjellige klienter og blir dynamisk batchet og matet til serveringsmodellen. Latens er vanligvis viktig i disse brukstilfellene.
  • Offline applikasjoner hvor flere innganger eller forespørsler blir gruppert på klientsiden og sendt til serveringsmodellen. Høyere gjennomstrømning er ofte målet for disse brukstilfellene, noe som bidrar til å styre kostnadene. Eksempler på bruk inkluderer videoanalyse og modellevaluering.

Amazon SageMaker gir to populære alternativer for slutningsjobbene dine. For sanntidsapplikasjoner bruker SageMaker Hosting TorchServe som backend-serverbiblioteket som håndterer dynamisk batching av mottatte forespørsler. For offline-applikasjoner kan du bruke SageMaker batch-transformeringsjobber. I dette innlegget går vi gjennom et eksempel på hvert alternativ for å hjelpe deg i gang.

Fordi TorchServe er innfødt integrert med SageMaker via SageMaker PyTorch inferensverktøysett, kan du enkelt distribuere en PyTorch-modell på TorchServe ved å bruke SageMaker Hosting. Det kan også være tider når du trenger å tilpasse miljøet ytterligere ved å bruke tilpassede Docker-bilder. I dette innlegget viser vi først hvordan du distribuerer et sanntidsendepunkt ved å bruke det opprinnelige SageMaker PyTorch-inferensverktøysettet og konfigurerer batchstørrelsen for å optimalisere gjennomstrømningen. I det andre eksemplet viser vi hvordan du bruker et tilpasset Docker-bilde for å konfigurere avanserte TorchServe-konfigurasjoner som ikke er tilgjengelige som en miljøvariabel for å optimalisere batch-inferensjobben din.

Beste praksis for batch-inferens

Batchbehandling kan øke gjennomstrømmingen og optimere ressursene dine fordi den hjelper til med å fullføre et større antall slutninger på en viss tid på bekostning av latens. For å optimalisere modelldistribusjon for høyere gjennomstrømning, er den generelle retningslinjen å øke batchstørrelsen til gjennomstrømningen avtar. Dette passer oftest offline-applikasjoner, der flere innganger er gruppert (som videorammer, bilder eller tekst) for å få prediksjonsutganger.

For sanntidsapplikasjoner er ventetid ofte et hovedproblem. Det er en avveining mellom høyere gjennomstrømning og økt batchstørrelse og latens; Det kan hende du må justere etter behov for å oppfylle SLAen for ventetid. Når det gjelder beste praksis på skyen, er kostnaden per et visst antall slutninger en nyttig retningslinje for å ta en informert beslutning som oppfyller forretningsbehovene dine. En medvirkende årsak til å styre kostnadene er å velge riktig akselerator. For mer informasjon, se Velg den beste AI -akseleratoren og modellsamlingen for slutning på datasyn med Amazon SageMaker.

TorchServe dynamisk batching på SageMaker

TorchServe er det opprinnelige PyTorch-biblioteket for å betjene modeller i produksjon i stor skala. Det er en felles utvikling fra Facebook og AWS. TorchServe lar deg overvåke, legge til egendefinerte beregninger, støtte flere modeller, skalere opp og ned antall arbeidere gjennom sikre administrasjons-APIer, og gi sluttpunkter og forklaringer.

For å støtte batchbehandling tilbyr TorchServe en dynamisk batchfunksjon. Den aggregerer de mottatte forespørslene innenfor en spesifisert tidsramme, grupperer dem sammen og sender gruppen for slutning. De mottatte forespørslene behandles gjennom håndterere i TorchServe. TorchServe har flere standardbehandlere, og du er velkommen til å skrive en tilpasset behandler hvis brukstilfellet ditt ikke er dekket. Når du bruker en tilpasset behandler, sørg for at batch-inferenslogikken er implementert i behandleren. Et eksempel på en tilpasset behandler med batch-slutningsstøtte er tilgjengelig på GitHub.

Du kan konfigurere dynamisk batching ved å bruke to innstillinger, batch_size og max_batch_delay, enten gjennom miljøvariabler i SageMaker eller gjennom config.properties fil i TorchServe (hvis du bruker en tilpasset beholder). TorchServe bruker alle innstillingene som kommer først, enten den maksimale batchstørrelsen (batch_size) eller et spesifisert tidsvindu for å vente på bunken med forespørsler max_batch_delay.

Med TorchServe-integrasjoner med SageMaker kan du nå distribuere PyTorch-modeller på SageMaker, hvor du kan definere en SageMaker PyTorch-modell. Du kan legge til tilpasset modellinnlasting, inferens og forbehandling og etterbehandlingslogikk i et skript som sendes som et inngangspunkt til SageMaker PyTorch (se følgende eksempelkode). Alternativt kan du bruke en tilpasset beholder for å distribuere modellene dine. For mer informasjon, se SageMaker PyTorch Model Server.

Du kan angi batchstørrelsen for PyTorch-modeller på SageMaker gjennom miljøvariabler. Hvis du velger å bruke en egendefinert beholder, kan du pakke innstillinger in config.properties med modellen din når du pakker modellen i TorchServe. Følgende kodebit viser et eksempel på hvordan du angir batchstørrelsen ved hjelp av miljøvariabler og hvordan du distribuerer en PyTorch-modell på SageMaker:

from SageMaker.pytorch.model import PyTorchModel env_variables_dict = { "SAGEMAKER_TS_BATCH_SIZE": "3", "SAGEMAKER_TS_MAX_BATCH_DELAY": "100000"
} pytorch_model = PyTorchModel( model_data=model_artifact, role=role, source_dir="code", framework_version='1.9', entry_point="inference.py", env=env_variables_dict
) predictor = pytorch_model.deploy(initial_instance_count=1, instance_type="ml.c5.2xlarge", serializer=SageMaker.serializers.JSONSerializer(), deserializer=SageMaker.deserializers.BytesDeserializer())

I kodebiten, model_artifact refererer til alle nødvendige filer for å laste tilbake den trente modellen, som arkiveres i en .tar-fil og skyves inn i en Amazon enkel lagringstjeneste (Amazon S3) bøtte. Inference.py ligner på TorchServe tilpasset behandler; den har flere funksjoner som du kan overstyre for å imøtekomme modellinitialisering, forhåndsbehandling og etterbehandling av mottatte forespørsler og slutningslogikk.

Følgende bærbare viser et fullstendig eksempel på utplassering av en Hugging Face BERT-modell.

Hvis du trenger en tilpasset beholder, kan du bygge et tilpasset beholderbilde og skyve det til Amazon Elastic Container Registry (Amazon ECR) depot. Modellartefakten i dette tilfellet kan være en TorchServe .mar-fil som samler modellartefaktene sammen med behandler. Vi demonstrerer dette i neste avsnitt, hvor vi bruker en SageMaker batch-transformeringsjobb.

SageMaker batch transformeringsjobb

For frakoblede brukstilfeller der forespørsler er gruppert fra en datakilde, for eksempel et datasett, tilbyr SageMaker batch transformeringsjobber. Disse jobbene lar deg lese data fra en S3-bøtte og skrive resultatene til en mål-S3-bøtte. For mer informasjon, se Bruk Batch Transform for å få slutninger fra store datasett. Et fullstendig eksempel på batch-inferens ved bruk av batch-transformeringsjobber finner du i det følgende bærbare, hvor vi bruker en maskinoversettelsesmodell fra FLORES-konkurransen. I dette eksemplet viser vi hvordan du bruker en tilpasset beholder for å score modellen vår ved å bruke SageMaker. Ved å bruke en tilpasset slutningsbeholder kan du tilpasse TorchServe-konfigurasjonen ytterligere. I dette eksemplet ønsker vi å endre og deaktivere JSON-dekoding, noe vi kan gjøre gjennom TorchServe config.properties filen.

Når vi bruker en tilpasset behandler for TorchServe, må vi sørge for at behandleren implementerer batch-inferenslogikken. Hver behandler kan ha egendefinerte funksjoner for å utføre forbehandling, inferens og etterbehandling. Et eksempel på en tilpasset behandler med batch-slutningsstøtte er tilgjengelig på GitHub.

Vi bruker vår egendefinerte beholder til å bunte modellartefakter med behandleren slik vi gjør i TorchServe (lage en .mar-fil). Vi trenger også et inngangspunkt til Docker-beholderen som starter TorchServe med batchstørrelsen og JSON-dekodingen satt i config.properties. Vi demonstrerer dette i eksemplet bærbare.

SageMaker batch-transformeringsjobben krever tilgang til inngangsfilene fra en S3-bøtte, der den deler inn inputfilene i minibatcher og sender dem for slutning. Vurder følgende punkter når du konfigurerer batchtransformasjonsjobben:

  • Plasser inndatafilene (for eksempel et datasett) i en S3-bøtte og sett den som en datakilde i jobbinnstillingene.
  • Tilordne en S3-bøtte som du vil lagre resultatene av batchtransformeringsjobben i.
  • Sett Batchstrategi til MultiRecord og SplitType til Line hvis du trenger batch-transformeringsjobben for å lage minibatcher fra inndatafilen. Hvis den ikke automatisk kan dele opp datasettet i minibatcher, kan du dele det inn i minibatcher ved å legge hver batch i en egen inngangsfil, plassert i datakildens S3-bøtte.
  • Kontroller at batchstørrelsen passer inn i minnet. SageMaker håndterer vanligvis dette automatisk; Men når du deler partier manuelt, må dette justeres basert på minnet.

Følgende kode er et eksempel for en batch-transformeringsjobb:

s3_bucket_name= 'SageMaker-us-west-2-XXXXXXXX'
batch_input = f"s3://{s3_bucket_name}/folder/jobename_TorchServe_SageMaker/"
batch_output = f"s3://{s3_bucket_name}/folder/jobname_TorchServe_SageMaker_output/" batch_job_name = 'job-batch' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
batch_job_name request = { "ModelClientConfig": { "InvocationsTimeoutInSeconds": 3600, "InvocationsMaxRetries": 1, }, "TransformJobName": batch_job_name, "ModelName": model_name, "MaxConcurrentTransforms":1, "BatchStrategy": "MultiRecord", "TransformOutput": {"S3OutputPath": batch_output, "AssembleWith": "Line", "Accept": "application/json"}, "TransformInput": { "DataSource": { "S3DataSource": {"S3DataType": "S3Prefix", "S3Uri": batch_input} }, "SplitType" : "Line", "ContentType": "application/json", }, "TransformResources": {"InstanceType": "ml.p2.xlarge", "InstanceCount": 1},
}

Når vi bruker de foregående innstillingene og starter transformasjonsjobben vår, leser den inndatafilene fra kilde S3-bøtten i grupper og sender dem for slutning. Resultatene skrives tilbake til S3-bøtten som er spesifisert til utgangene.

Følgende kodebit viser hvordan du oppretter og starter en jobb ved å bruke de foregående innstillingene:

sm.create_transform_job(**request) while True: response = sm.describe_transform_job(TransformJobName=batch_job_name) status = response["TransformJobStatus"] if status == "Completed": print("Transform job ended with status: " + status) break if status == "Failed": message = response["FailureReason"] print("Transform failed with the following error: {}".format(message)) raise Exception("Transform job failed") print("Transform job is still in status: " + status) time.sleep(30)

konklusjonen

I dette innlegget gjennomgikk vi de to modusene SageMaker tilbyr for online og offline inferens. Førstnevnte bruker dynamisk batching levert i TorchServe for å gruppere forespørslene fra flere klienter. Sistnevnte bruker en SageMaker-transformeringsjobb for å gruppere forespørslene fra inngangsfiler i en S3-bøtte og kjøre inferens.

Vi viste også hvordan du kan betjene modeller på SageMaker ved å bruke native SageMaker PyTorch inferensverktøysett-beholderbilder, og hvordan du bruker tilpassede beholdere for brukstilfeller som krever avanserte TorchServe-konfigurasjonsinnstillinger.

Ettersom TorchServe fortsetter å utvikle seg for å møte behovene til PyTorch-fellesskapet, er nye funksjoner integrert i SageMaker for å gi effektive måter for å betjene modeller i produksjon. For mer informasjon, sjekk ut TorchServe GitHub repo og SageMaker eksempler.


Om forfatterne

Phi Nguyen er en løsningsarkitekt hos AWS som hjelper kunder med deres skyreise med spesielt fokus på datainnsjø, analyse, semantikkteknologier og maskinlæring. På fritiden kan du finne ham som sykler til jobben, trener sønnens fotballag eller nyter en tur i naturen med familien.

Nikhil Kulkarni er en programvareutvikler med AWS Machine Learning, med fokus på å gjøre maskinlæringsarbeidsmengder mer effektive på skyen og er en medskaper av AWS Deep Learning Containers for opplæring og slutninger. Han brenner for distribuerte Deep Learning-systemer. Utenom jobben liker han å lese bøker, fikle med gitaren og lage pizza.

Hamid Shojanazeri er en partneringeniør hos Pytorch som jobber med OSS-modelloptimalisering og -servering med høy ytelse. Hamid har en doktorgrad i datasyn og jobbet som forsker i multimedialaboratorier i Australia, Malaysia og NLP leder i Opus.ai. Han liker å finne enklere løsninger på vanskelige problemer og er kunstentusiast på fritiden.

Geeta Chauhan leder AI Partner Engineering ved Meta AI med ekspertise på å bygge spenstige, anti-skjøre, distribuerte plattformer i stor skala for oppstart og Fortune 500s. Teamet hennes jobber med strategiske partnere, maskinlæringsledere på tvers av bransjen og alle store skytjenesteleverandører for å bygge og lansere nye AI-produkttjenester og -opplevelser; og tar PyTorch-modeller fra forskning til produksjon.. Hun er en vinner av Women in IT – Silicon Valley – CTO of the year 2019, en ACM Distinguished Speaker og tankeleder på emner som spenner fra etikk i AI, Deep Learning, Blockchain, IoT. Hun brenner for å fremme bruk av AI for Good.

Kilde: https://aws.amazon.com/blogs/machine-learning/optimize-your-inference-jobs-using-dynamic-batch-inference-with-torchserve-on-amazon-sagemaker/

Tidstempel:

Mer fra AWS maskinlæringsblogg