Optimieren Sie Ihre Inferenzjobs mithilfe dynamischer Batch-Inferenz mit TorchServe auf Amazon SageMaker

Quellknoten: 1884601

Beim Deep Learning bezieht sich Stapelverarbeitung auf das Einspeisen mehrerer Eingaben in ein Modell. Obwohl dies während des Trainings unerlässlich ist, kann es sehr hilfreich sein, die Kosten zu verwalten und den Durchsatz auch während der Inferenzzeit zu optimieren. Hardwarebeschleuniger sind für Parallelität optimiert, und Batching trägt dazu bei, die Rechenkapazität zu sättigen, und führt häufig zu einem höheren Durchsatz.

Die Stapelverarbeitung kann in mehreren Szenarien während der Modellbereitstellung in der Produktion hilfreich sein. Hier kategorisieren wir sie grob in zwei Anwendungsfälle:

  • Echtzeitanwendungen, bei denen mehrere Inferenzanfragen von verschiedenen Clients empfangen und dynamisch gestapelt und dem Serving-Modell zugeführt werden. Latenz ist in diesen Anwendungsfällen normalerweise wichtig.
  • Offline-Anwendungen, bei denen mehrere Eingaben oder Anforderungen auf der Clientseite gebündelt und an das Bereitstellungsmodell gesendet werden. Höherer Durchsatz ist oft das Ziel für diese Anwendungsfälle, was hilft, die Kosten zu kontrollieren. Beispiele für Anwendungsfälle sind Videoanalyse und Modellbewertung.

Amazon Sage Maker bietet zwei beliebte Optionen für Ihre Inferenzaufträge. Für Echtzeitanwendungen verwendet SageMaker Hosting TorchServe als Back-End-Serving-Bibliothek, die das dynamische Batching der empfangenen Anforderungen verarbeitet. Für Offline-Anwendungen können Sie SageMaker-Batch-Transformationsjobs verwenden. In diesem Beitrag gehen wir ein Beispiel für jede Option durch, um Ihnen den Einstieg zu erleichtern.

Weil TorchServe nativ ist in SageMaker integriert über das SageMaker PyTorch-Inferenz-Toolkit, können Sie mithilfe von SageMaker-Hosting problemlos ein PyTorch-Modell auf TorchServe bereitstellen. Es kann auch vorkommen, dass Sie Ihre Umgebung mit benutzerdefinierten Docker-Images weiter anpassen müssen. In diesem Beitrag zeigen wir zunächst, wie Sie einen Echtzeit-Endpunkt mithilfe des nativen SageMaker PyTorch-Inferenz-Toolkits bereitstellen und die Stapelgröße konfigurieren, um den Durchsatz zu optimieren. Im zweiten Beispiel zeigen wir, wie Sie ein benutzerdefiniertes Docker-Image verwenden, um erweiterte TorchServe-Konfigurationen zu konfigurieren, die nicht als Umgebungsvariable verfügbar sind, um Ihren Batch-Inferenz-Job zu optimieren.

Best Practices für Batch-Inferenz

Die Stapelverarbeitung kann den Durchsatz erhöhen und Ihre Ressourcen optimieren, da sie hilft, eine größere Anzahl von Inferenzen in einer bestimmten Zeit auf Kosten der Latenz abzuschließen. Um die Modellbereitstellung für einen höheren Durchsatz zu optimieren, lautet die allgemeine Richtlinie, die Stapelgröße zu erhöhen, bis der Durchsatz abnimmt. Dies eignet sich am häufigsten für Offline-Anwendungen, bei denen mehrere Eingaben (z. B. Videoframes, Bilder oder Text) gestapelt werden, um Vorhersageausgaben zu erhalten.

Bei Echtzeitanwendungen ist Latenz häufig ein Hauptanliegen. Es gibt einen Kompromiss zwischen höherem Durchsatz und erhöhter Stapelgröße und Latenz; Sie müssen möglicherweise nach Bedarf anpassen, um Ihre Latenz-SLA zu erfüllen. In Bezug auf Best Practices in der Cloud sind die Kosten pro einer bestimmten Anzahl von Inferenzen eine hilfreiche Richtlinie, um eine fundierte Entscheidung zu treffen, die Ihren Geschäftsanforderungen entspricht. Ein Faktor, der zum Kostenmanagement beiträgt, ist die Wahl des richtigen Beschleunigers. Weitere Informationen finden Sie unter Wählen Sie mit Amazon SageMaker den besten KI-Beschleuniger und die beste Modellkompilierung für Computer-Vision-Inferenz.

Dynamisches Batching von TorchServe auf SageMaker

FackelServe ist die native PyTorch-Bibliothek zum Bereitstellen von Modellen in der Produktion im großen Maßstab. Es ist eine gemeinsame Entwicklung von Facebook und AWS. TorchServe ermöglicht es Ihnen, benutzerdefinierte Metriken zu überwachen, hinzuzufügen, mehrere Modelle zu unterstützen, die Anzahl der Mitarbeiter über sichere Verwaltungs-APIs zu erhöhen und zu verringern und Endpunkte für Inferenzen und Erklärungen bereitzustellen.

Zur Unterstützung der Stapelverarbeitung bietet TorchServe eine dynamische Stapelfunktion. Es aggregiert die empfangenen Anforderungen innerhalb eines bestimmten Zeitrahmens, fasst sie zusammen und sendet den Stapel zur Inferenz. Die eingehenden Anfragen werden über die verarbeitet Handler in TorchServe. TorchServe verfügt über mehrere Standardhandler, und Sie können gerne einen benutzerdefinierten Handler erstellen, wenn Ihr Anwendungsfall nicht abgedeckt ist. Wenn Sie einen benutzerdefinierten Handler verwenden, stellen Sie sicher, dass die Batchrückschlusslogik im Handler implementiert wurde. Ein Beispiel für einen benutzerdefinierten Handler mit Batchrückschlussunterstützung ist unter verfügbar GitHub.

Sie können die dynamische Stapelverarbeitung mit zwei Einstellungen konfigurieren: batch_size und max_batch_delay, entweder durch Umgebungsvariablen in SageMaker oder durch die config.properties Datei in TorchServe (bei Verwendung eines benutzerdefinierten Containers). TorchServe verwendet eine der Einstellungen, die zuerst kommt, entweder die maximale Stapelgröße (batch_size) oder ein angegebenes Zeitfenster, um auf den Stapel von Anforderungen zu warten max_batch_delay.

Mit TorchServe-Integrationen mit SageMaker können Sie jetzt PyTorch-Modelle nativ auf SageMaker bereitstellen, wo Sie ein SageMaker-PyTorch-Modell definieren können. Sie können benutzerdefinierte Modelllade-, Inferenz- sowie Vorverarbeitungs- und Nachverarbeitungslogik in einem Skript hinzufügen, das als Einstiegspunkt an SageMaker PyTorch übergeben wird (siehe folgenden Beispielcode). Alternativ können Sie einen benutzerdefinierten Container verwenden, um Ihre Modelle bereitzustellen. Weitere Informationen finden Sie unter Der SageMaker PyTorch-Modellserver.

Sie können die Stapelgröße für PyTorch-Modelle in SageMaker über Umgebungsvariablen festlegen. Wenn Sie sich für einen benutzerdefinierten Container entscheiden, können Sie ihn bündeln Einstellungen in config.properties mit Ihrem Modell, wenn Sie Ihr Modell in TorchServe verpacken. Das folgende Code-Snippet zeigt ein Beispiel, wie die Stapelgröße mithilfe von Umgebungsvariablen festgelegt und ein PyTorch-Modell auf SageMaker bereitgestellt wird:

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

Im Codeausschnitt model_artifact bezieht sich auf alle erforderlichen Dateien zum Zurückladen des trainierten Modells, das in einer TAR-Datei archiviert und in eine geschoben wird Amazon Simple Storage-Service (Amazon S3) Eimer. Die Datei inference.py ähnelt dem benutzerdefinierten TorchServe-Handler. Es verfügt über mehrere Funktionen, die Sie überschreiben können, um die Modellinitialisierung, die Vorverarbeitung und Nachverarbeitung empfangener Anforderungen und die Inferenzlogik zu berücksichtigen.

Folgende Notizbuch zeigt ein vollständiges Beispiel für die Bereitstellung eines Hugging Face BERT-Modells.

Wenn Sie einen benutzerdefinierten Container benötigen, können Sie ein benutzerdefiniertes Container-Image erstellen und es per Push an die Amazon Elastic Container-Registrierung (Amazon ECR)-Repository. Das Modellartefakt kann in diesem Fall eine TorchServe .mar-Datei sein, die die Modellartefakte zusammen mit dem Handler bündelt. Wir demonstrieren dies im nächsten Abschnitt, in dem wir einen SageMaker-Batch-Transformationsjob verwenden.

SageMaker-Batch-Transformationsjob

Für Offline-Anwendungsfälle, bei denen Anforderungen aus einer Datenquelle wie einem Dataset gestapelt werden, bietet SageMaker Batch-Transformationsjobs. Mit diesen Jobs können Sie Daten aus einem S3-Bucket lesen und die Ergebnisse in einen Ziel-S3-Bucket schreiben. Weitere Informationen finden Sie unter Verwenden Sie die Stapeltransformation, um Rückschlüsse aus großen Datensätzen zu erhalten. Ein vollständiges Beispiel für Batch-Inferenz mit Batch-Transformationsjobs finden Sie im Folgenden Notizbuch, wo wir ein maschinelles Übersetzungsmodell des FLORES-Wettbewerbs verwenden. In diesem Beispiel zeigen wir, wie Sie einen benutzerdefinierten Container verwenden, um unser Modell mit SageMaker zu bewerten. Durch die Verwendung eines benutzerdefinierten Inferenzcontainers können Sie Ihre TorchServe-Konfiguration weiter anpassen. In diesem Beispiel möchten wir die JSON-Decodierung ändern und deaktivieren, was wir über TorchServe tun können config.properties Datei.

Wenn Sie einen benutzerdefinierten Handler für TorchServe verwenden, müssen wir sicherstellen, dass der Handler die Batch-Inferenzlogik implementiert. Jeder Handler kann über benutzerdefinierte Funktionen verfügen, um Vorverarbeitung, Inferenz und Nachverarbeitung durchzuführen. Ein Beispiel für einen benutzerdefinierten Handler mit Batchrückschlussunterstützung ist unter verfügbar GitHub.

Wir verwenden unseren benutzerdefinierten Container, um die Modellartefakte mit dem Handler zu bündeln, wie wir es in TorchServe tun (Erstellen einer .mar-Datei). Wir benötigen auch einen Einstiegspunkt zum Docker-Container, der TorchServe mit der eingestellten Stapelgröße und JSON-Decodierung startet config.properties. Wir demonstrieren dies im Beispiel Notizbuch.

Der Batch-Transformationsjob von SageMaker erfordert Zugriff auf die Eingabedateien aus einem S3-Bucket, wo er die Eingabedateien in Mini-Batches aufteilt und sie zur Inferenz sendet. Berücksichtigen Sie beim Konfigurieren des Batch-Transformationsjobs die folgenden Punkte:

  • Platzieren Sie die Eingabedateien (z. B. ein Dataset) in einem S3-Bucket und legen Sie ihn in den Jobeinstellungen als Datenquelle fest.
  • Weisen Sie einen S3-Bucket zu, in dem die Ergebnisse des Batch-Transformationsjobs gespeichert werden sollen.
  • Sept BatchStrategie zu MultiRecord und SplitType zu Line wenn Sie den Batch-Transformationsjob benötigen, um Mini-Batches aus der Eingabedatei zu erstellen. Wenn das Dataset nicht automatisch in Mini-Batches aufgeteilt werden kann, können Sie es in Mini-Batches aufteilen, indem Sie jeden Batch in eine separate Eingabedatei einfügen, die im S3-Bucket der Datenquelle abgelegt wird.
  • Stellen Sie sicher, dass die Stapelgröße in den Speicher passt. SageMaker handhabt dies normalerweise automatisch; Beim manuellen Aufteilen von Stapeln muss dies jedoch basierend auf dem Speicher abgestimmt werden.

Der folgende Code ist ein Beispiel für einen Batch-Transformationsjob:

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

Wenn wir die vorherigen Einstellungen verwenden und unseren Transformationsjob starten, liest er die Eingabedateien aus dem Quell-S3-Bucket in Stapeln und sendet sie zur Inferenz. Die Ergebnisse werden in den für die Ausgänge angegebenen S3-Bucket zurückgeschrieben.

Das folgende Code-Snippet zeigt, wie Sie einen Job mit den vorherigen Einstellungen erstellen und starten:

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)

Zusammenfassung

In diesem Beitrag haben wir die beiden Modi überprüft, die SageMaker für Online- und Offline-Inferenz bietet. Ersteres verwendet dynamisches Batching, das in TorchServe bereitgestellt wird, um die Anforderungen von mehreren Clients zu stapeln. Letzteres verwendet einen SageMaker-Transformationsjob, um die Anforderungen aus Eingabedateien in einem S3-Bucket zu bündeln und Inferenzen auszuführen.

Wir haben auch gezeigt, wie Modelle auf SageMaker bereitgestellt werden, indem native Container-Images des SageMaker-PyTorch-Inferenz-Toolkits verwendet werden, und wie benutzerdefinierte Container für Anwendungsfälle verwendet werden, die erweiterte TorchServe-Konfigurationseinstellungen erfordern.

Während sich TorchServe weiterentwickelt, um den Anforderungen der PyTorch-Community gerecht zu werden, werden neue Funktionen in SageMaker integriert, um leistungsstarke Möglichkeiten zum Bereitstellen von Modellen in der Produktion bereitzustellen. Weitere Informationen finden Sie unter TorchServe GitHub Repo und für SageMaker-Beispiele.


Über die Autoren

Phi Nguyen ist ein Lösungsarchitekt bei AWS, der Kunden bei ihrer Cloud-Reise mit einem besonderen Schwerpunkt auf Data Lake, Analytics, Semantics-Technologien und maschinellem Lernen unterstützt. In seiner Freizeit fährt er mit dem Fahrrad zur Arbeit, trainiert die Fußballmannschaft seines Sohnes oder genießt einen Naturspaziergang mit seiner Familie.

Nikhil Kulkarni ist ein Softwareentwickler bei AWS Machine Learning, der sich darauf konzentriert, Workloads für maschinelles Lernen in der Cloud leistungsfähiger zu machen, und ist Mitgestalter von AWS Deep Learning Containers für Training und Inferenz. Seine Leidenschaft gilt verteilten Deep-Learning-Systemen. Außerhalb der Arbeit liest er gerne Bücher, spielt mit der Gitarre und backt Pizza.

Hamid Shojanazeri ist Partner Engineer bei Pytorch und arbeitet an der Optimierung und Bereitstellung von OSS-Hochleistungsmodellen. Hamid hat einen Doktortitel in Computer Vision und arbeitete als Forscher in Multimedia-Laboren in Australien, Malaysia und leitete NLP bei Opus.ai. Er findet gerne einfachere Lösungen für schwierige Probleme und ist in seiner Freizeit ein Kunstliebhaber.

Geeta Chauhan leitet AI Partner Engineering bei Meta AI mit Expertise im Aufbau robuster, antifragiler, groß angelegter verteilter Plattformen für Startups und Fortune 500-Unternehmen. Ihr Team arbeitet mit strategischen Partnern, führenden Anbietern von maschinellem Lernen in der gesamten Branche und allen großen Cloud-Dienstanbietern zusammen, um neue KI-Produktdienste und -erfahrungen zu entwickeln und einzuführen. und PyTorch-Modelle von der Forschung zur Produktion zu bringen. Sie ist eine Gewinnerin von Women in IT – Silicon Valley – CTO des Jahres 2019, eine ACM Distinguished Speaker und Vordenkerin zu Themen wie Ethik in der KI, Deep Learning, Blockchain und IoT. Sie setzt sich leidenschaftlich dafür ein, den Einsatz von AI for Good zu fördern.

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

Zeitstempel:

Mehr von AWS-Blog für maschinelles Lernen