Optimer dine inferensjobs ved hjælp af dynamisk batchinferens med TorchServe på Amazon SageMaker

Kildeknude: 1884601

I deep learning refererer batch-behandling til at føde flere input til en model. Selvom det er vigtigt under træning, kan det også være meget nyttigt at styre omkostningerne og optimere gennemløbet i inferenstiden. Hardwareacceleratorer er optimeret til parallelitet, og batching hjælper med at mætte beregningskapaciteten og fører ofte til højere gennemløb.

Batching kan være nyttig i flere scenarier under modelimplementering i produktionen. Her kategoriserer vi dem groft i to use cases:

  • Realtidsapplikationer, hvor adskillige inferensanmodninger modtages fra forskellige klienter og dynamisk batches og føres til serveringsmodellen. Latency er normalt vigtig i disse tilfælde.
  • Offline applikationer, hvor flere input eller anmodninger samles på klientsiden og sendes til serveringsmodellen. Højere gennemløb er ofte målet for disse use cases, hvilket hjælper med at styre omkostningerne. Eksempler på brugscases omfatter videoanalyse og modelevaluering.

Amazon SageMaker giver to populære muligheder for dine inferensjob. Til realtidsapplikationer bruger SageMaker Hosting TorchServe som backend-serveringsbiblioteket, der håndterer den dynamiske batching af de modtagne anmodninger. Til offline-applikationer kan du bruge SageMaker batch-transformationsjob. I dette indlæg gennemgår vi et eksempel på hver mulighed for at hjælpe dig i gang.

Fordi TorchServe er indbygget integreret med SageMaker via SageMaker PyTorch inferensværktøjssæt, kan du nemt implementere en PyTorch-model på TorchServe ved hjælp af SageMaker Hosting. Der kan også være tidspunkter, hvor du har brug for at tilpasse dit miljø yderligere ved hjælp af brugerdefinerede Docker-billeder. I dette indlæg viser vi først, hvordan man implementerer et slutpunkt i realtid ved hjælp af det indbyggede SageMaker PyTorch-inferensværktøj og konfigurerer batchstørrelsen for at optimere gennemløbet. I det andet eksempel demonstrerer vi, hvordan man bruger et brugerdefineret Docker-billede til at konfigurere avancerede TorchServe-konfigurationer, der ikke er tilgængelige som en miljøvariabel for at optimere dit batch-inferensjob.

Bedste praksis for batch-inferens

Batchbehandling kan øge gennemløbet og optimere dine ressourcer, fordi det hjælper med at fuldføre et større antal slutninger på en vis tid på bekostning af latens. For at optimere modelimplementeringen til højere gennemløb er den generelle retningslinje at øge batchstørrelsen, indtil gennemløbet falder. Dette passer oftest til offline applikationer, hvor flere input er batchet (såsom videorammer, billeder eller tekst) for at få forudsigelsesoutput.

For realtidsapplikationer er latens ofte et hovedproblem. Der er en afvejning mellem højere gennemløb og øget batchstørrelse og latens; du skal muligvis justere efter behov for at opfylde din latency SLA. Med hensyn til bedste praksis i skyen er prisen pr. et vist antal slutninger en nyttig retningslinje til at træffe en informeret beslutning, der opfylder dine forretningsbehov. En medvirkende faktor til at styre omkostningerne er at vælge den rigtige accelerator. For mere information, se Vælg den bedste AI-accelerator og modelkompilering til computersynsslutning med Amazon SageMaker.

TorchServe dynamisk batching på SageMaker

TorchServe er det oprindelige PyTorch-bibliotek til at betjene modeller i produktion i skala. Det er en fælles udvikling fra Facebook og AWS. TorchServe giver dig mulighed for at overvåge, tilføje brugerdefinerede metrics, understøtte flere modeller, skalere op og ned antallet af arbejdere gennem sikre administrations-API'er og give slutpunkter til slutninger og forklaringer.

For at understøtte batchbehandling tilbyder TorchServe en dynamisk batch-funktion. Den aggregerer de modtagne anmodninger inden for en specificeret tidsramme, batcherer dem sammen og sender batchen til slutning. De modtagne anmodninger behandles gennem handlere i TorchServe. TorchServe har flere standardhandlere, og du er velkommen til at oprette en brugerdefineret handler, hvis din use case ikke er dækket. Når du bruger en brugerdefineret handler, skal du sørge for, at batch-inferenslogikken er implementeret i handleren. Et eksempel på en brugerdefineret handler med batch-inferensunderstøttelse er tilgængelig på GitHub.

Du kan konfigurere dynamisk batching ved hjælp af to indstillinger, batch_size , max_batch_delay, enten gennem miljøvariabler i SageMaker eller gennem config.properties fil i TorchServe (hvis du bruger en brugerdefineret container). TorchServe bruger enhver af de indstillinger, der kommer først, enten den maksimale batchstørrelse (batch_size) eller angivet tidsvindue til at vente på, at partiet af anmodninger er igennem max_batch_delay.

Med TorchServe-integrationer med SageMaker kan du nu implementere PyTorch-modeller indbygget på SageMaker, hvor du kan definere en SageMaker PyTorch-model. Du kan tilføje tilpasset modelindlæsning, inferens og forbehandlings- og efterbehandlingslogik i et script, der sendes som et indgangspunkt til SageMaker PyTorch (se følgende eksempelkode). Alternativt kan du bruge en tilpasset container til at implementere dine modeller. For mere information, se SageMaker PyTorch Model Server.

Du kan indstille batchstørrelsen for PyTorch-modeller på SageMaker gennem miljøvariabler. Hvis du vælger at bruge en brugerdefineret beholder, kan du bundle indstillinger in config.properties med din model, når du pakker din model i TorchServe. Følgende kodestykke viser et eksempel på, hvordan man indstiller batchstørrelsen ved hjælp af miljøvariabler, og hvordan man implementerer en PyTorch-model 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 kodestykket, model_artifact henviser til alle de nødvendige filer til tilbagelæsning af den trænede model, som arkiveres i en .tar-fil og skubbes ind i en Amazon Simple Storage Service (Amazon S3) spand. Inference.py ligner TorchServe brugerdefinerede handler; den har flere funktioner, som du kan tilsidesætte for at imødekomme modelinitialisering, forbehandling og efterbehandling af modtagne anmodninger og inferenslogik.

Følgende notesbog viser et komplet eksempel på implementering af en Hugging Face BERT-model.

Hvis du har brug for en brugerdefineret container, kan du bygge et brugerdefineret containerbillede og skubbe det til Amazon Elastic Container Registry (Amazon ECR) repository. Modelartefakten i dette tilfælde kan være en TorchServe .mar-fil, der samler modelartefakterne sammen med handleren. Det demonstrerer vi i næste afsnit, hvor vi bruger et SageMaker batch transformationsjob.

SageMaker batch transformation job

SageMaker leverer til tilfælde af offlinebrug, hvor anmodninger er batchet fra en datakilde, såsom et datasæt batch transformationsjob. Disse job giver dig mulighed for at læse data fra en S3-spand og skrive resultaterne til en mål-S3-bucket. For mere information, se Brug Batch Transform til at få slutninger fra store datasæt. Et fuldstændigt eksempel på batch-inferens ved brug af batch-transformationsjob kan findes i det følgende notesbog, hvor vi bruger en maskinoversættelsesmodel fra FLORES konkurrencen. I dette eksempel viser vi, hvordan man bruger en brugerdefineret beholder til at score vores model ved hjælp af SageMaker. Ved at bruge en brugerdefineret inferensbeholder kan du yderligere tilpasse din TorchServe-konfiguration. I dette eksempel ønsker vi at ændre og deaktivere JSON-afkodning, hvilket vi kan gøre gennem TorchServe config.properties fil.

Når vi bruger en brugerdefineret handler til TorchServe, skal vi sikre os, at handleren implementerer batch-inferenslogikken. Hver handler kan have brugerdefinerede funktioner til at udføre forbehandling, inferens og efterbehandling. Et eksempel på en brugerdefineret handler med batch-inferensunderstøttelse er tilgængelig på GitHub.

Vi bruger vores brugerdefinerede beholder til at samle modelartefakter med handleren, som vi gør i TorchServe (laver en .mar-fil). Vi har også brug for et indgangspunkt til Docker-beholderen, der starter TorchServe med batchstørrelsen og JSON-afkodningen indstillet i config.properties. Det demonstrerer vi i eksemplet notesbog.

SageMaker batchtransformationsjobbet kræver adgang til inputfilerne fra en S3 bucket, hvor den opdeler inputfilerne i minibatches og sender dem til slutning. Overvej følgende punkter, når du konfigurerer batchtransformationsjobbet:

  • Placer inputfilerne (såsom et datasæt) i en S3-bøtte, og indstil den som en datakilde i jobindstillingerne.
  • Tildel en S3-spand, som resultaterne af batchtransformationsjobbet skal gemmes i.
  • sæt Batchstrategi til MultiRecord , SplitType til Line hvis du har brug for batchtransformationsjobbet for at lave minibatches fra inputfilen. Hvis det ikke automatisk kan opdele datasættet i minibatches, kan du opdele det i minibatches ved at lægge hver batch i en separat inputfil, placeret i datakildens S3-bøtte.
  • Sørg for, at batchstørrelsen passer ind i hukommelsen. SageMaker håndterer normalt dette automatisk; Men når batches opdeles manuelt, skal dette justeres baseret på hukommelsen.

Følgende kode er et eksempel på et batchtransformationsjob:

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 bruger de foregående indstillinger og starter vores transformationsjob, læser det inputfilerne fra S3-kilden i batches og sender dem til slutning. Resultaterne skrives tilbage til den S3-bøtte, der er angivet til udgangene.

Følgende kodestykke viser, hvordan du opretter og starter et job ved hjælp af de foregående indstillinger:

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)

Konklusion

I dette indlæg gennemgik vi de to tilstande SageMaker tilbyder til online og offline inferens. Førstnævnte bruger dynamisk batching leveret i TorchServe til at batche anmodningerne fra flere klienter. Sidstnævnte bruger et SageMaker-transformationsjob til at batche anmodningerne fra inputfiler i en S3-bøtte og køre inferens.

Vi viste også, hvordan man serverer modeller på SageMaker ved hjælp af indbyggede SageMaker PyTorch-inference toolkit-containerbilleder, og hvordan man bruger brugerdefinerede containere til brugstilfælde, der kræver avancerede TorchServe-konfigurationsindstillinger.

Da TorchServe fortsætter med at udvikle sig for at imødekomme behovene i PyTorch-fællesskabet, er nye funktioner integreret i SageMaker for at give effektive måder til at betjene modeller i produktionen. For mere information, tjek TorchServe GitHub repo og SageMaker eksempler.


Om forfatterne

Phi Nguyen er løsningsarkitekt hos AWS, der hjælper kunder med deres cloud-rejse med særligt fokus på data lake, analytics, semantikteknologier og machine learning. I sin fritid kan du finde ham på cykel til arbejde, træner sin søns fodboldhold eller nyder en gåtur i naturen med sin familie.

Nikhil Kulkarni er en softwareudvikler med AWS Machine Learning, der fokuserer på at gøre maskinlæringsarbejdsbelastninger mere effektive i skyen og er medskaber af AWS Deep Learning Containers til træning og inferens. Han brænder for distribuerede Deep Learning-systemer. Uden for arbejdet nyder han at læse bøger, pille ved guitaren og lave pizza.

Hamid Shojanazeri er partneringeniør hos Pytorch, der arbejder med OSS højtydende modeloptimering og -servering. Hamid har en ph.d. i computersyn og arbejdede som forsker i multimedielaboratorier i Australien, Malaysia og NLP leder i Opus.ai. Han kan godt lide at finde enklere løsninger på svære problemer og er kunstentusiast i sin fritid.

Geeta Chauhan leder AI Partner Engineering hos Meta AI med ekspertise i at bygge modstandsdygtige, anti-skrøbelige, distribuerede platforme i stor skala til startups og Fortune 500'ere. Hendes team arbejder med strategiske partnere, maskinlæringsledere på tværs af industrien og alle større cloud-tjenesteudbydere for at bygge og lancere nye AI-produkttjenester og -oplevelser; og tager PyTorch-modeller fra forskning til produktion.. Hun er en vinder af Women in IT – Silicon Valley – CTO of the year 2019, en ACM Distinguished Speaker og tankeleder om emner lige fra etik i AI, Deep Learning, Blockchain, IoT. Hun brænder for at fremme brugen af ​​AI for Good.

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

Tidsstempel:

Mere fra AWS Machine Learning Blog