Optimera dina slutledningsjobb med hjälp av dynamisk batch-inferens med TorchServe på Amazon SageMaker

Källnod: 1884601

Inom djupinlärning hänvisar batchbearbetning till att mata in flera input till en modell. Även om det är viktigt under träning, kan det vara till stor hjälp att hantera kostnaderna och optimera genomströmningen även under slutledningstiden. Hårdvaruacceleratorer är optimerade för parallellitet, och batchning hjälper till att mätta beräkningskapaciteten och leder ofta till högre genomströmning.

Batchning kan vara till hjälp i flera scenarier under modelldistribution i produktionen. Här kategoriserar vi dem i stort sett i två användningsfall:

  • Realtidsapplikationer där flera slutledningsförfrågningar tas emot från olika klienter och dynamiskt batchas och matas till serveringsmodellen. Latens är vanligtvis viktigt i dessa användningsfall.
  • Offlineapplikationer där flera ingångar eller förfrågningar batchas på klientsidan och skickas till serveringsmodellen. Högre genomströmning är ofta målet för dessa användningsfall, vilket hjälper till att hantera kostnaderna. Exempel på användningsfall inkluderar videoanalys och modellutvärdering.

Amazon SageMaker ger två populära alternativ för dina slutledningsjobb. För realtidsapplikationer använder SageMaker Hosting TorchServe som backend-serverbiblioteket som hanterar den dynamiska batchningen av mottagna förfrågningar. För offlineapplikationer kan du använda SageMaker batchtransformeringsjobb. I det här inlägget går vi igenom ett exempel på varje alternativ för att hjälpa dig komma igång.

Eftersom TorchServe är inbyggt integrerad med SageMaker via SageMaker PyTorch inferensverktygssats, kan du enkelt distribuera en PyTorch-modell på TorchServe med SageMaker Hosting. Det kan också finnas tillfällen då du behöver anpassa din miljö ytterligare med hjälp av anpassade Docker-bilder. I det här inlägget visar vi först hur man distribuerar en slutpunkt i realtid med hjälp av det inbyggda SageMaker PyTorch-inferensverktyget och konfigurerar batchstorleken för att optimera genomströmningen. I det andra exemplet visar vi hur man använder en anpassad Docker-bild för att konfigurera avancerade TorchServe-konfigurationer som inte är tillgängliga som en miljövariabel för att optimera ditt batch-inferensjobb.

Bästa metoder för batch slutledning

Batchbearbetning kan öka genomströmningen och optimera dina resurser eftersom det hjälper till att slutföra ett större antal slutsatser under en viss tid på bekostnad av latens. För att optimera modelldistributionen för högre genomströmning är den allmänna riktlinjen att öka satsstorleken tills genomströmningen minskar. Detta passar oftast offlineapplikationer, där flera ingångar grupperas (som videoramar, bilder eller text) för att få prediktionsutdata.

För realtidsapplikationer är latens ofta ett huvudproblem. Det finns en kompromiss mellan högre genomströmning och ökad batchstorlek och latens; du kan behöva justera efter behov för att uppfylla din latens-SLA. När det gäller bästa praxis på molnet är kostnaden per ett visst antal slutsatser en användbar riktlinje för att fatta ett välgrundat beslut som uppfyller dina affärsbehov. En bidragande faktor för att hantera kostnaden är att välja rätt accelerator. För mer information, se Välj den bästa AI-acceleratorn och modellsammanställningen för slutledning av datorseende med Amazon SageMaker.

TorchServe dynamisk batchning på SageMaker

TorchServe är det ursprungliga PyTorch-biblioteket för att betjäna modeller i produktion i stor skala. Det är en gemensam utveckling från Facebook och AWS. TorchServe låter dig övervaka, lägga till anpassade mätvärden, stödja flera modeller, skala upp och ner antalet arbetare genom säkra hanterings-API:er och tillhandahålla slutpunkter och förklaringar.

För att stödja batchbearbetning tillhandahåller TorchServe en dynamisk batchfunktion. Den aggregerar de mottagna förfrågningarna inom en angiven tidsram, batchar ihop dem och skickar batchen för slutledning. De mottagna förfrågningarna behandlas via hanterare i TorchServe. TorchServe har flera standardhanterare, och du är välkommen att skapa en anpassad hanterare om ditt användningsfall inte täcks. När du använder en anpassad hanterare, se till att batchinferenslogiken har implementerats i hanteraren. Ett exempel på en anpassad hanterare med stöd för batch slutledning finns på GitHub.

Du kan konfigurera dynamisk batchning med två inställningar, batch_size och max_batch_delay, antingen genom miljövariabler i SageMaker eller genom config.properties fil i TorchServe (om du använder en anpassad behållare). TorchServe använder någon av inställningarna som kommer först, antingen den maximala batchstorleken (batch_size) eller ett angivet tidsfönster för att vänta på att partiet av förfrågningar passerar max_batch_delay.

Med TorchServe-integrationer med SageMaker kan du nu distribuera PyTorch-modeller på SageMaker, där du kan definiera en SageMaker PyTorch-modell. Du kan lägga till anpassad modellladdning, slutledning och förbearbetnings- och efterbearbetningslogik i ett skript som skickas som en ingångspunkt till SageMaker PyTorch (se följande exempelkod). Alternativt kan du använda en anpassad behållare för att distribuera dina modeller. För mer information, se SageMaker PyTorch Model Server.

Du kan ställa in batchstorleken för PyTorch-modeller på SageMaker genom miljövariabler. Om du väljer att använda en anpassad behållare kan du bunta inställningar in config.properties med din modell när du paketerar din modell i TorchServe. Följande kodavsnitt visar ett exempel på hur man ställer in batchstorleken med hjälp av miljövariabler och hur man distribuerar 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 kodavsnittet, model_artifact hänvisar till alla nödvändiga filer för att ladda tillbaka den tränade modellen, som arkiveras i en .tar-fil och skjuts in i en Amazon enkel lagringstjänst (Amazon S3) hink. Inference.py liknar den anpassade TorchServe-hanteraren; den har flera funktioner som du kan åsidosätta för att tillgodose modellinitiering, förbearbetning och efterbehandling av mottagna förfrågningar och slutledningslogik.

Följande anteckningsbok visar ett fullständigt exempel på implementering av en Hugging Face BERT-modell.

Om du behöver en anpassad behållare kan du bygga en anpassad behållarbild och skjuta den till Amazon Elastic Container Registry (Amazon ECR) arkiv. Modellartefakten i det här fallet kan vara en TorchServe .mar-fil som paketerar modellartefakterna tillsammans med hanteraren. Vi visar detta i nästa avsnitt, där vi använder ett SageMaker-batchtransformeringsjobb.

SageMaker batchtransformeringsjobb

För offlineanvändningsfall där förfrågningar batchas från en datakälla som en datauppsättning tillhandahåller SageMaker batch-omvandlingsjobb. Dessa jobb gör det möjligt för dig att läsa data från en S3-bucket och skriva resultaten till en mål-S3-bucket. För mer information, se Använd Batch Transform för att få slutsatser från stora datamängder. Ett fullständigt exempel på batch-inferens med batchtransformeringsjobb finns i följande anteckningsbok, där vi använder en maskinöversättningsmodell från FLORES-tävlingen. I det här exemplet visar vi hur man använder en anpassad behållare för att poängsätta vår modell med SageMaker. Genom att använda en anpassad slutledningsbehållare kan du ytterligare anpassa din TorchServe-konfiguration. I det här exemplet vill vi ändra och inaktivera JSON-avkodning, vilket vi kan göra genom TorchServe config.properties fil.

När vi använder en anpassad hanterare för TorchServe måste vi se till att hanteraren implementerar batchinferenslogiken. Varje hanterare kan ha anpassade funktioner för att utföra förbearbetning, slutledning och efterbearbetning. Ett exempel på en anpassad hanterare med stöd för batch slutledning finns på GitHub.

Vi använder vår anpassade behållare för att bunta ihop modellartefakterna med hanteraren som vi gör i TorchServe (gör en .mar-fil). Vi behöver också en ingångspunkt till Docker-behållaren som startar TorchServe med batchstorleken och JSON-avkodningen inställd i config.properties. Vi visar detta i exemplet anteckningsbok.

SageMaker batchtransformeringsjobb kräver åtkomst till indatafilerna från en S3-hink, där den delar upp indatafilerna i minibatcher och skickar dem för slutledning. Tänk på följande punkter när du konfigurerar batchtransformationsjobbet:

  • Placera indatafilerna (som en datauppsättning) i en S3-hink och ställ in den som en datakälla i jobbinställningarna.
  • Tilldela en S3-hink där du vill spara resultaten av batchtransformeringsjobbet.
  • uppsättning Batchstrategi till MultiRecord och SplitType till Line om du behöver batchtransformeringsjobbet för att göra minibatcher från inmatningsfilen. Om det inte automatiskt kan dela upp datasetet i minibatcher kan du dela upp det i minibatcher genom att lägga varje batch i en separat indatafil, placerad i datakällans S3-bucket.
  • Se till att batchstorleken passar in i minnet. SageMaker brukar hantera detta automatiskt; men när man delar upp batcher manuellt måste detta justeras baserat på minnet.

Följande kod är ett exempel för ett batchtransformeringsjobb:

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 använder de föregående inställningarna och startar vårt transformeringsjobb läser det indatafilerna från käll S3-bucket i omgångar och skickar dem för slutledning. Resultaten skrivs tillbaka till S3-skopan som anges för utgångarna.

Följande kodavsnitt visar hur du skapar och startar ett jobb med de föregående inställningarna:

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)

Slutsats

I det här inlägget granskade vi de två lägena SageMaker erbjuder för online och offline slutledning. Den förra använder dynamisk batchning som tillhandahålls i TorchServe för att batcha förfrågningar från flera klienter. Den senare använder ett SageMaker-transformationsjobb för att batcha förfrågningarna från indatafiler i en S3-bucket och köra slutledning.

Vi visade också hur man servar modeller på SageMaker med hjälp av inbyggda SageMaker PyTorch-inferensverktygs-containerbilder och hur man använder anpassade behållare för användningsfall som kräver avancerade TorchServe-konfigurationsinställningar.

När TorchServe fortsätter att utvecklas för att möta behoven hos PyTorch-communityt, integreras nya funktioner i SageMaker för att tillhandahålla effektiva sätt att betjäna modeller i produktionen. För mer information, kolla in TorchServe GitHub -repo och SageMaker exempel.


Om författarna

Phi Nguyen är en lösningsarkitekt på AWS som hjälper kunderna med sin molnresa med särskilt fokus på datasjö, analys, semantikteknik och maskininlärning. På sin fritid kan du hitta honom cykla till jobbet, coacha sin sons fotbollslag eller njuta av naturvandring med sin familj.

Nikhil Kulkarni är en mjukvaruutvecklare med AWS Machine Learning, med fokus på att göra maskininlärningsarbetsbelastningar mer effektiva i molnet och är en medskapare av AWS Deep Learning Containers för utbildning och slutledning. Han brinner för distribuerade Deep Learning Systems. Utanför jobbet tycker han om att läsa böcker, pilla med gitarren och göra pizza.

Hamid Shojanazeri är en partneringenjör på Pytorch som arbetar med OSS högpresterande modelloptimering och -servering. Hamid har en doktorsexamen i datorseende och arbetade som forskare i multimedialabb i Australien, Malaysia och som NLP-ledare i Opus.ai. Han tycker om att hitta enklare lösningar på svåra problem och är konstentusiast på fritiden.

Geeta Chauhan leder AI Partner Engineering på Meta AI med expertis i att bygga motståndskraftiga, anti-bräckliga, storskaliga distribuerade plattformar för startups och Fortune 500s. Hennes team arbetar med strategiska partners, maskininlärningsledare över hela branschen och alla större molntjänstleverantörer för att bygga och lansera nya AI-produkttjänster och -upplevelser; och tar PyTorch-modeller från forskning till produktion.. Hon är en vinnare av Women in IT – Silicon Valley – CTO of the year 2019, en ACM Distinguished Speaker och tankeledare i ämnen som sträcker sig från etik inom AI, Deep Learning, Blockchain, IoT. Hon brinner för att främja användningen av AI för gott.

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

Tidsstämpel:

Mer från AWS-maskininlärningsblogg