Optimaliseer uw inferentietaken met behulp van dynamische batchinferentie met TorchServe op Amazon SageMaker

Bronknooppunt: 1884601

Bij deep learning verwijst batchverwerking naar het invoeren van meerdere inputs in een model. Hoewel het essentieel is tijdens de training, kan het ook tijdens de inferentietijd zeer nuttig zijn om de kosten te beheersen en de doorvoer te optimaliseren. Hardwareversnellers zijn geoptimaliseerd voor parallellisme, en batching helpt de rekencapaciteit te verzadigen en leidt vaak tot een hogere doorvoer.

Batching kan nuttig zijn in verschillende scenario's tijdens de implementatie van modellen in productie. Hier categoriseren we ze grofweg in twee gebruiksscenario’s:

  • Realtime toepassingen waarbij verschillende gevolgtrekkingsverzoeken van verschillende clients worden ontvangen en dynamisch in batches worden samengevoegd en aan het bedieningsmodel worden doorgegeven. Latency is meestal belangrijk in deze gebruikssituaties.
  • Offline toepassingen waarbij verschillende invoer of verzoeken aan de clientzijde worden samengevoegd en naar het bedieningsmodel worden verzonden. Een hogere doorvoer is vaak het doel van deze gebruiksscenario's, wat helpt de kosten te beheersen. Voorbeelden van gebruiksscenario's zijn onder meer videoanalyse en modelevaluatie.

Amazon Sage Maker biedt twee populaire opties voor uw gevolgtrekkingstaken. Voor real-time toepassingen gebruikt SageMaker Hosting TorchServe als de backend-bibliotheek die de dynamische batchverwerking van de ontvangen verzoeken afhandelt. Voor offline toepassingen kunt u batchtransformatietaken van SageMaker gebruiken. In dit bericht bespreken we een voorbeeld van elke optie om u op weg te helpen.

Omdat TorchServe native is geïntegreerd met SageMaker via de SageMaker PyTorch-inferentietoolkit, kunt u eenvoudig een PyTorch-model op TorchServe implementeren met behulp van SageMaker Hosting. Het kan ook voorkomen dat u uw omgeving verder moet aanpassen met behulp van aangepaste Docker-images. In dit bericht laten we eerst zien hoe u een realtime eindpunt kunt implementeren met behulp van de native SageMaker PyTorch-inferentietoolkit en hoe u de batchgrootte kunt configureren om de doorvoer te optimaliseren. In het tweede voorbeeld laten we zien hoe u een aangepaste Docker-image kunt gebruiken om geavanceerde TorchServe-configuraties te configureren die niet beschikbaar zijn als omgevingsvariabele om uw batch-inferentietaak te optimaliseren.

Best practices voor batch-inferentie

Batchverwerking kan de doorvoer verhogen en uw bronnen optimaliseren, omdat het helpt een groter aantal gevolgtrekkingen in een bepaalde tijd te voltooien, wat ten koste gaat van de latentie. Om de modelimplementatie voor een hogere doorvoer te optimaliseren, is de algemene richtlijn om de batchgrootte te vergroten totdat de doorvoer afneemt. Dit is meestal geschikt voor offline toepassingen, waarbij verschillende invoergegevens in batch worden verwerkt (zoals videoframes, afbeeldingen of tekst) om voorspellingsuitvoer te verkrijgen.

Voor real-time toepassingen is latentie vaak een belangrijk aandachtspunt. Er is een afweging tussen een hogere doorvoer en een grotere batchgrootte en latentie; Mogelijk moet u deze indien nodig aanpassen om aan uw latentie-SLA te voldoen. In termen van best practices in de cloud zijn de kosten per een bepaald aantal gevolgtrekkingen een nuttige richtlijn bij het nemen van een weloverwogen beslissing die voldoet aan uw zakelijke behoeften. Eén factor die bijdraagt ​​aan het beheersen van de kosten is het kiezen van de juiste versneller. Voor meer informatie, zie Kies de beste AI-versneller en modelcompilatie voor computervisie-inferentie met Amazon SageMaker.

TorchServe dynamische batching op SageMaker

FakkelServe is de native PyTorch-bibliotheek voor het op schaal aanbieden van modellen in productie. Het is een gezamenlijke ontwikkeling van Facebook en AWS. Met TorchServe kunt u monitoren, aangepaste statistieken toevoegen, meerdere modellen ondersteunen, het aantal werknemers op- en afschalen via beveiligde beheer-API's, en eindpunten voor gevolgtrekking en uitleg bieden.

Ter ondersteuning van batchverwerking biedt TorchServe een dynamische batchfunctie. Het verzamelt de ontvangen verzoeken binnen een bepaald tijdsbestek, voegt ze samen en verzendt de batch voor gevolgtrekking. De ontvangen aanvragen worden verwerkt via de afhandelaars in TorchServe. TorchServe heeft verschillende standaard handlers, en u bent van harte welkom om een ​​aangepaste handler te schrijven als uw gebruiksscenario niet gedekt is. Wanneer u een aangepaste handler gebruikt, zorg er dan voor dat de batch-inferentielogica in de handler is geïmplementeerd. Een voorbeeld van een aangepaste handler met ondersteuning voor batch-inferentie is beschikbaar op GitHub.

U kunt dynamische batching configureren met behulp van twee instellingen: batch_size en max_batch_delay, hetzij via omgevingsvariabelen in SageMaker, hetzij via de config.properties bestand in TorchServe (bij gebruik van een aangepaste container). TorchServe gebruikt alle instellingen die het eerst komen, ofwel de maximale batchgrootte (batch_size) of een opgegeven tijdvenster waarin moet worden gewacht totdat de batch aanvragen is verwerkt max_batch_delay.

Met TorchServe-integraties met SageMaker kunt u nu PyTorch-modellen native implementeren op SageMaker, waar u een SageMaker PyTorch-model kunt definiëren. U kunt aangepaste modellaad-, inferentie- en voor- en naverwerkingslogica toevoegen aan een script dat wordt doorgegeven als toegangspunt voor de SageMaker PyTorch (zie de volgende voorbeeldcode). Als alternatief kunt u een aangepaste container gebruiken om uw modellen te implementeren. Voor meer informatie, zie De SageMaker PyTorch-modelserver.

U kunt de batchgrootte voor PyTorch-modellen op SageMaker instellen via omgevingsvariabelen. Als u ervoor kiest een container op maat te gebruiken, kunt u bundelen settings in config.properties met uw model bij het verpakken van uw model in TorchServe. Het volgende codefragment toont een voorbeeld van hoe u de batchgrootte instelt met behulp van omgevingsvariabelen en hoe u een PyTorch-model op SageMaker kunt implementeren:

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

In het codefragment wordt model_artifact verwijst naar alle vereiste bestanden voor het terugladen van het getrainde model, dat wordt gearchiveerd in een .tar-bestand en naar een .tar-bestand wordt gepusht Amazon eenvoudige opslagservice (Amazon S3) bak. De inference.py is vergelijkbaar met de aangepaste TorchServe-handler; het heeft verschillende functies die u kunt overschrijven om tegemoet te komen aan de modelinitialisatie, voorverwerking en naverwerking van ontvangen verzoeken, en gevolgtrekkingslogica.

De volgende notitieboekje toont een volledig voorbeeld van de inzet van een Hugging Face BERT-model.

Als u een aangepaste container nodig heeft, kunt u een aangepaste containerimage bouwen en deze naar de Amazon Elastic Container-register (Amazon ECR)-repository. Het modelartefact kan in dit geval een TorchServe .mar-bestand zijn dat de modelartefacten samen met de handler bundelt. We demonstreren dit in de volgende sectie, waar we een batchtransformatietaak van SageMaker gebruiken.

SageMaker batch-transformatietaak

Voor offline gebruik waarbij verzoeken vanuit een gegevensbron zoals een dataset worden verzameld, biedt SageMaker batch-transformatietaken. Met deze taken kunt u gegevens uit een S3-bucket lezen en de resultaten naar een doel-S3-bucket schrijven. Voor meer informatie, zie Gebruik batchtransformatie om gevolgtrekkingen uit grote gegevenssets te verkrijgen. Een volledig voorbeeld van batch-inferentie met behulp van batchtransformatietaken vindt u hieronder notitieboekje, waarbij we een machinevertaalmodel van de FLORES-wedstrijd gebruiken. In dit voorbeeld laten we zien hoe u een aangepaste container kunt gebruiken om ons model te scoren met behulp van SageMaker. Door een aangepaste inferentiecontainer te gebruiken, kunt u uw TorchServe-configuratie verder aanpassen. In dit voorbeeld willen we de JSON-decodering wijzigen en uitschakelen, wat we kunnen doen via TorchServe config.properties bestand.

Wanneer we een aangepaste handler voor TorchServe gebruiken, moeten we ervoor zorgen dat de handler de batch-inferentielogica implementeert. Elke handler kan aangepaste functies hebben voor het uitvoeren van voorbewerking, gevolgtrekking en nabewerking. Een voorbeeld van een aangepaste handler met ondersteuning voor batch-inferentie is beschikbaar op GitHub.

We gebruiken onze aangepaste container om de modelartefacten met de handler te bundelen, zoals we doen in TorchServe (een .mar-bestand maken). We hebben ook een toegangspunt nodig voor de Docker-container die TorchServe start met de batchgrootte en JSON-decodering ingesteld config.properties. We laten dit zien in het voorbeeld notitieboekje.

De batchtransformatietaak van SageMaker vereist toegang tot de invoerbestanden vanuit een S3-bucket, waar de invoerbestanden in minibatches worden verdeeld en ter gevolgtrekking worden verzonden. Houd rekening met de volgende punten bij het configureren van de batchtransformatietaak:

  • Plaats de invoerbestanden (zoals een dataset) in een S3-bucket en stel deze in als gegevensbron in de taakinstellingen.
  • Wijs een S3-bucket toe waarin u de resultaten van de batchtransformatietaak wilt opslaan.
  • Zet de BatchStrategie naar MultiRecord en SplitType naar Line als u de batchtransformatietaak nodig hebt om minibatches te maken van het invoerbestand. Als het de dataset niet automatisch in mini-batches kan splitsen, kunt u deze in mini-batches verdelen door elke batch in een apart invoerbestand te plaatsen, dat in de S3-bucket van de gegevensbron wordt geplaatst.
  • Zorg ervoor dat de batchgrootte in het geheugen past. SageMaker handelt dit meestal automatisch af; bij het handmatig verdelen van batches moet dit echter worden afgestemd op basis van het geheugen.

De volgende code is een voorbeeld van een batchtransformatietaak:

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},
}

Wanneer we de voorgaande instellingen gebruiken en onze transformatietaak starten, worden de invoerbestanden uit de bron-S3-bucket in batches gelezen en verzonden voor gevolgtrekking. De resultaten worden teruggeschreven naar de S3-bucket die is opgegeven voor de uitgangen.

Het volgende codefragment laat zien hoe u een taak kunt maken en starten met behulp van de voorgaande instellingen:

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)

Conclusie

In dit bericht hebben we de twee modi besproken die SageMaker biedt voor online en offline gevolgtrekking. De eerste maakt gebruik van dynamische batching in TorchServe om de verzoeken van meerdere clients in batches te verwerken. De laatste gebruikt een SageMaker-transformatietaak om de verzoeken van invoerbestanden in een S3-bucket te batchen en gevolgtrekkingen uit te voeren.

We hebben ook laten zien hoe u modellen op SageMaker kunt aanbieden met behulp van native SageMaker PyTorch inference toolkit containerimages, en hoe u aangepaste containers kunt gebruiken voor gebruiksscenario's waarvoor geavanceerde TorchServe-configuratie-instellingen nodig zijn.

Terwijl TorchServe blijft evolueren om tegemoet te komen aan de behoeften van de PyTorch-gemeenschap, worden nieuwe functies geïntegreerd in SageMaker om performante manieren te bieden voor het bedienen van modellen in productie. Voor meer informatie, bekijk de TorchServe GitHub-opslagplaats en SageMaker-voorbeelden.


Over de auteurs

Phi Nguyen is een oplossingsarchitect bij AWS die klanten helpt bij hun cloudtraject met een speciale focus op data lake, analyse, semantische technologieën en machine learning. In zijn vrije tijd fiets je naar zijn werk, coacht hij het voetbalteam van zijn zoon of geniet je van een natuurwandeling met zijn gezin.

Nikhil Kulkarni is een softwareontwikkelaar met AWS Machine Learning, gericht op het performanter maken van machine learning-workloads in de cloud, en is mede-maker van AWS Deep Learning Containers voor training en gevolgtrekking. Hij heeft een passie voor gedistribueerde Deep Learning Systems. Buiten zijn werk leest hij graag boeken, speelt hij met gitaar en maakt hij pizza.

Hamid Shojanazeri is een partneringenieur bij Pytorch die werkt aan de optimalisatie en bediening van OSS-modellen met hoge prestaties. Hamid heeft een doctoraat in computervisie en werkte als onderzoeker in multimedialaboratoria in Australië, Maleisië en was hoofd NLP bij Opus.ai. Hij vindt graag eenvoudigere oplossingen voor moeilijke problemen en is in zijn vrije tijd een kunstliefhebber.

Geeta Chauhan leidt AI Partner Engineering bij Meta AI met expertise in het bouwen van veerkrachtige, anti-fragiele, grootschalige gedistribueerde platforms voor startups en Fortune 500's. Haar team werkt samen met strategische partners, leiders op het gebied van machine learning in de hele sector en alle grote cloudserviceproviders voor het bouwen en lanceren van nieuwe AI-productdiensten en -ervaringen; en het meenemen van PyTorch-modellen van onderzoek naar productie. Ze is winnaar van Women in IT – Silicon Valley – CTO of the year 2019, een ACM Distinguished Speaker en thought leader over onderwerpen variërend van ethiek in AI, Deep Learning, Blockchain en IoT. Ze is gepassioneerd door het promoten van het gebruik van AI for Good.

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

Tijdstempel:

Meer van AWS Blog over machine learning