In den letzten Jahren hat sich das Thema Deep Learning rasant entwickelt. Obwohl sich die Hardware verbessert hat, beispielsweise mit der neuesten Generation von Beschleunigern von NVIDIA und Amazon, stoßen fortgeschrittene Praktiker des maschinellen Lernens (ML) immer noch regelmäßig auf Probleme, wenn sie ihre großen Deep-Learning-Modelle für Anwendungen wie die Verarbeitung natürlicher Sprache (NLP) einsetzen.
In einem früheren Beitrag haben wir darüber gesprochen Funktionen und konfigurierbare Einstellungen in Amazon SageMaker-Modellbereitstellung das kann die Inferenz mit diesen großen Modellen erleichtern. Heute kündigen wir eine neue an Amazon Sage Maker Deep Learning Container (DLC), mit dem Sie innerhalb weniger Minuten mit der Inferenz großer Modelle beginnen können. Dies DLC enthält einige der beliebtesten Open-Source-Bibliotheken für die parallele Inferenz von Modellen, wie DeepSpeed und Hugging Face Accelerate.
In diesem Beitrag verwenden wir einen neuen SageMaker-Inferenz-DLC für große Modelle, um zwei der beliebtesten großen NLP-Modelle bereitzustellen: BigScience BLÜTE-176B und Metas OPT-30B aus dem Hugging Face-Repository. Insbesondere verwenden wir Deep Java Library (DJL) Serving- und Tensor-Parallelismus-Techniken von DeepSpeed, um in einem Anwendungsfall zur Textgenerierung eine Latenz von 0.1 Sekunden pro Token zu erreichen.
Unsere kompletten Beispiel-Notebooks finden Sie in unserem GitHub-Repository.
Inferenztechniken für große Modelle
Sprachmodelle sind in letzter Zeit sowohl in Größe als auch in Popularität explodiert. Mit einfachem Zugang von Modellzoos wie Hugging Face und verbesserter Genauigkeit und Leistung bei NLP-Aufgaben wie Klassifizierung und Textgenerierung greifen Praktiker zunehmend nach diesen großen Modellen. Große Modelle sind jedoch oft zu groß, um in den Speicher eines einzelnen Beschleunigers zu passen. Beispielsweise kann das BLOOM-176B-Modell mehr als 350 Gigabyte Beschleunigerspeicher benötigen, was die Kapazität der heute verfügbaren Hardwarebeschleuniger bei weitem übersteigt. Dies erfordert die Verwendung von parallelen Modelltechniken aus Bibliotheken wie DeepSpeed und Hugging Face Accelerate, um ein Modell zur Inferenz auf mehrere Beschleuniger zu verteilen. In diesem Beitrag verwenden wir die SageMaker-Inferenzcontainer für große Modelle Latenz- und Durchsatzleistung mithilfe dieser beiden Open-Source-Bibliotheken zu generieren und zu vergleichen.
DeepSpeed und Accelerate verwenden unterschiedliche Techniken, um große Sprachmodelle für Inferenz zu optimieren. Der Hauptunterschied ist der von DeepSpeed Verwendung optimierter Kernel. Diese Kernel können die Inferenzlatenz drastisch verbessern, indem sie Engpässe im Berechnungsgraphen des Modells reduzieren. Optimierte Kernel können schwierig zu entwickeln sein und sind typischerweise spezifisch für eine bestimmte Modellarchitektur; DeepSpeed unterstützt mit diesen optimierten Kerneln beliebte große Modelle wie OPT und BLOOM. Im Gegensatz dazu enthält die Accelerate-Bibliothek von Hugging Face zum Zeitpunkt des Schreibens keine optimierten Kernel. Wie wir in unserem Ergebnisabschnitt besprechen, ist dieser Unterschied für einen Großteil des Leistungsvorsprungs verantwortlich, den DeepSpeed gegenüber Accelerate hat.
Ein zweiter Unterschied zwischen DeepSpeed und Accelerate ist die Art der Modellparallelität. Accelerate verwendet Pipeline-Parallelität, um ein Modell zwischen den verborgenen Schichten eines Modells zu partitionieren, während DeepSpeed Tensor-Parallelität verwendet, um die Schichten selbst zu partitionieren. Pipeline-Parallelität ist ein flexibler Ansatz, der mehr Modelltypen unterstützt und den Durchsatz verbessern kann, wenn größere Batchgrößen verwendet werden. Tensorparallelität erfordert mehr Kommunikation zwischen GPUs, da Modellschichten auf mehrere Geräte verteilt werden können, aber die Inferenzlatenz verbessern kann, indem mehrere GPUs gleichzeitig eingebunden werden. Weitere Informationen zu Parallelisierungstechniken finden Sie in Einführung in die Modellparallelität und Modellparallelität.
Lösungsüberblick
Um große Sprachmodelle effektiv hosten zu können, benötigen wir Funktionen und Unterstützung in den folgenden Schlüsselbereichen:
- Erstellen und Testen von Lösungen – Angesichts der iterativen Natur der ML-Entwicklung müssen wir in der Lage sein, zu erstellen, schnell zu iterieren und zu testen, wie sich der Inferenzendpunkt verhält, wenn diese Modelle gehostet werden, einschließlich der Fähigkeit, schnell fehlzuschlagen. Diese Modelle können normalerweise nur auf größeren Instanzen wie p4dn oder g5 gehostet werden, und angesichts der Größe der Modelle kann es eine Weile dauern, eine Inferenzinstanz hochzufahren und eine Testiteration auszuführen. Beim lokalen Testen gibt es normalerweise Einschränkungen, da Sie zum Testen eine Instanz ähnlicher Größe benötigen und diese Modelle nicht einfach zu beschaffen sind.
- Skalierte Bereitstellung und Ausführung – Die Modelldateien müssen auf die Inferenzinstanzen geladen werden, was bei der Größe schon eine Herausforderung darstellt. Tar / Un-Tar als Beispiel für den Bloom-176B dauert etwa 1 Stunde zum Erstellen und eine weitere Stunde zum Laden. Wir brauchen einen alternativen Mechanismus, um einen einfachen Zugriff auf die Modelldateien zu ermöglichen.
- Laden des Modells als Singleton – Bei einem Multi-Worker-Prozess müssen wir sicherstellen, dass das Modell nur einmal geladen wird, damit wir nicht in Race-Conditions geraten und unnötige Ressourcen verbrauchen. In diesem Beitrag zeigen wir eine Möglichkeit, direkt von zu laden Amazon Simple Storage-Service (Amazon S3). Dies funktioniert jedoch nur, wenn wir die Standardeinstellungen des DJL verwenden. Darüber hinaus muss jede Skalierung der Endpunkte in wenigen Minuten hochgefahren werden können, was eine Überlegung erfordert, wie die Modelle geladen und verteilt werden könnten.
- Sharding-Frameworks – Diese Modelle müssen in der Regel durch einen Tensor-Parallelismus-Mechanismus oder durch Pipeline-Sharding als typische Sharding-Techniken erstellt werden, und wir haben fortschrittliche Konzepte wie ZeRO-Sharding, die auf Tensor-Sharding aufbauen. Weitere Informationen zu Sharding-Techniken finden Sie unter Modellparallelität. Um dies zu erreichen, können wir verschiedene Kombinationen haben und Frameworks von NIVIDIA, DeepSpeed und anderen verwenden. Dies erfordert die Fähigkeit, BYOC zu testen oder 1P-Container zu verwenden und über Lösungen zu iterieren und Benchmarking-Tests durchzuführen. Möglicherweise möchten Sie auch verschiedene Hosting-Optionen wie asynchron, serverlos und andere testen.
- Hardwareauswahl – Ihre Wahl der Hardware wird von allen oben genannten Punkten und weiteren Verkehrsmustern, Anwendungsfällen und Modellgrößen bestimmt.
In diesem Beitrag verwenden wir die optimierten Kernel und Tensor-Parallelismus-Techniken von DeepSpeed, um BLOOM-176B und OPT-30B auf SageMaker zu hosten. Wir vergleichen auch Ergebnisse von Accelerate, um die Leistungsvorteile optimierter Kernel und Tensorparallelität zu demonstrieren. Weitere Informationen zu DeepSpeed und Accelerate finden Sie unter DeepSpeed-Inferenz: Effiziente Inferenz von Transformatormodellen in beispielloser Größenordnung und Unglaublich schnelle BLOOM-Inferenz mit DeepSpeed und Accelerate.
In diesem Beispiel verwenden wir DJLServing als Modellbereitstellungslösung. DJLServing ist eine hochleistungsfähige universelle Model-Serving-Lösung, die von der programmiersprachenunabhängigen Deep Java Library (DJL) unterstützt wird. Weitere Informationen zu DJL und DJLServing finden Sie unter Stellen Sie große Modelle auf Amazon SageMaker mit DJLServing und paralleler DeepSpeed-Modellinferenz bereit.
Es ist erwähnenswert, dass optimierte Kernel zu Genauigkeitsänderungen und einem modifizierten Berechnungsgraphen führen können, was theoretisch zu einem geänderten Modellverhalten führen könnte. Obwohl dies gelegentlich das Ergebnis der Inferenz ändern könnte, erwarten wir nicht, dass diese Unterschiede die grundlegenden Bewertungsmetriken eines Modells wesentlich beeinflussen. Dennoch wird Praktikern empfohlen, sich zu vergewissern, dass die Modellausgaben bei Verwendung dieser Kernel wie erwartet sind.
Die folgenden Schritte zeigen, wie Sie ein BLOOM-176B-Modell in SageMaker mithilfe von DJLServing und einem SageMaker-Inferenzcontainer für große Modelle bereitstellen. Das vollständige Beispiel ist auch in unserem verfügbar GitHub-Repository.
Verwenden des DJLServing SageMaker DLC-Images
Verwenden Sie den folgenden Code, um das DJLServing SageMaker DLC-Image zu verwenden, nachdem Sie die Region durch Ihre spezifische Region ersetzt haben, in der Sie das Notebook ausführen:
Erstellen Sie unsere Modelldatei
Zuerst erstellen wir eine Datei namens serving.properties
die nur eine Codezeile enthält. Dies weist den DJL-Modellserver an, die DeepSpeed-Engine zu verwenden. Die Datei enthält den folgenden Code:
serving.properties
ist eine von DJLServing definierte Datei, die zum Konfigurieren der Konfiguration pro Modell verwendet wird.
Als nächstes erstellen wir unsere model.py
-Datei, die den Code definiert, der zum Laden und anschließenden Bereitstellen des Modells erforderlich ist. In unserem Code lesen wir die ein TENSOR_PARALLEL_DEGREE
Umgebungsvariable (der Standardwert ist 1). Damit wird die Anzahl der Geräte festgelegt, auf die die Tensor-Parallelmodule verteilt werden. Beachten Sie, dass DeepSpeed einige integrierte Partitionsdefinitionen bereitstellt, darunter eine für BLOOM-Modelle. Wir verwenden es durch Angabe replace_method
und relpace_with_kernel_inject
. Wenn Sie ein angepasstes Modell haben und DeepSpeed für eine effektive Partitionierung benötigen, müssen Sie es ändern relpace_with_kernel_inject
zu false
und fügen injection_policy
damit die Laufzeitpartition funktioniert. Weitere Informationen finden Sie unter Initialisierung für Inferenz. Für unser Beispiel haben wir das vorpartitionierte BLOOM-Modell auf DeepSpeed verwendet.
Zweitens in der model.py
-Datei laden wir das Modell auch aus Amazon S3, nachdem der Endpunkt hochgefahren wurde. Das Modell wird in die geladen /tmp
Speicherplatz auf dem Container, weil SageMaker den abbildet /tmp
zu den Amazon Elastic Block-Shop (Amazon EBS)-Volume, das gemountet wird, wenn wir den Endpunkterstellungsparameter angeben VolumeSizeInGB
. Für Instanzen wie p4dn, die mit der Volume-Instanz vorkonfiguriert sind, können wir die weiterhin nutzen /tmp
auf dem Behälter. Siehe folgenden Code:
DJLServing verwaltet die Laufzeitinstallation auf allen Pip-Paketen, die in definiert sind requirement.txt
. Diese Datei enthält:
Wir haben ein Verzeichnis namens erstellt code
und für model.py
, serving.properties
und requirements.txt
In diesem Verzeichnis sind bereits Dateien angelegt. Um die Dateien anzuzeigen, können Sie den folgenden Code vom Terminal aus ausführen:
Die folgende Abbildung zeigt den Aufbau der model.tar.gz
.
Zuletzt erstellen wir die Modelldatei und laden sie auf Amazon S3 hoch:
Laden Sie das Modell von Hugging Face herunter und speichern Sie es (optional)
Wir haben die Schritte in diesem Abschnitt für den Fall bereitgestellt, dass Sie das Modell auf Amazon S3 herunterladen und von dort aus verwenden möchten. Die Schritte werden in der Jupyter-Datei auf GitHub bereitgestellt. Der folgende Screenshot zeigt eine Momentaufnahme der Schritte.
Erstellen Sie ein SageMaker-Modell
Wir erstellen jetzt eine SageMaker-Modell. Wir benutzen das Amazon Elastic Container-Registrierung (Amazon ECR)-Bild bereitgestellt von und das Modellartefakt aus dem vorherigen Schritt zum Erstellen des SageMaker-Modells. Im Modellaufbau konfigurieren wir TENSOR_PARALLEL_DEGREE=8
, was bedeutet, dass das Modell entlang von 8 GPUs partitioniert ist. Siehe folgenden Code:
Nachdem Sie die vorherige Zelle in der Jupyter-Datei ausgeführt haben, sehen Sie eine Ausgabe ähnlich der folgenden:
Erstellen Sie einen SageMaker-Endpunkt
Sie können beliebige Instanzen mit mehreren GPUs zum Testen verwenden. In dieser Demo verwenden wir eine p4d.24xlarge-Instanz. Beachten Sie im folgenden Code, wie wir die festlegen ModelDataDownloadTimeoutInSeconds
, ContainerStartupHealthCheckTimeoutInSeconds
und VolumeSizeInGB
Parameter zur Anpassung an die große Modellgröße. Das VolumeSizeInGB
Der Parameter gilt für GPU-Instances, die den EBS-Volume-Anhang unterstützen.
Zuletzt erstellen wir einen SageMaker-Endpunkt:
Sie sehen es im folgenden Code ausgedruckt:
Das Starten des Endpunkts kann eine Weile dauern. Sie können es noch ein paar Mal versuchen, wenn Sie auf das stoßen InsufficientInstanceCapacity
Fehler, oder Sie können eine Anfrage an AWS stellen, um das Limit in Ihrem Konto zu erhöhen.
Leistungsoptimierung
Wenn Sie beabsichtigen, diesen Post und das begleitende Notebook mit einem anderen Modell zu verwenden, möchten Sie vielleicht einige der einstellbaren Parameter erkunden, die SageMaker, DeepSpeed und DJL bieten. Iteratives Experimentieren mit diesen Parametern kann erhebliche Auswirkungen auf die Latenz, den Durchsatz und die Kosten Ihres gehosteten großen Modells haben. Weitere Informationen zum Optimieren von Parametern wie Anzahl der Worker, Grad der Tensorparallelität, Größe der Auftragswarteschlange usw. finden Sie unter DJL Serving-Konfigurationen und Stellen Sie große Modelle auf Amazon SageMaker mit DJLServing und paralleler DeepSpeed-Modellinferenz bereit.
Die Ergebnisse
In diesem Beitrag haben wir DeepSpeed verwendet, um BLOOM-176B und OPT-30B auf SageMaker ML-Instanzen zu hosten. Die folgende Tabelle fasst unsere Leistungsergebnisse zusammen, einschließlich eines Vergleichs mit Accelerate von Hugging Face. Die Latenz spiegelt die Anzahl der Millisekunden wider, die benötigt wird, um viermal eine 256-Token-Zeichenfolge zu erzeugen (batch_size=4
) aus dem Modell. Der Durchsatz spiegelt die Anzahl der Token wider, die pro Sekunde für jeden Test produziert werden. Für Hugging Face Accelerate haben wir das Standardladen der Bibliothek mit GPU-Speicherzuordnung verwendet. Für DeepSpeed haben wir seinen schnelleren Checkpoint-Lademechanismus verwendet.
Modell | Bibliothek | Modellpräzision | Batch-Größe | Parallelstudium | Beispiel | Zeit zum Laden (S) |
Latenz (4 x 256 Token-Ausgabe) | . | ||
. | . | . | . | . | . | . | P50 (Frau) |
P90 (Frau) |
P99 (Frau) |
Durchsatz (Token/Sek.) |
BLÜTE-176B | Tiefgeschwindigkeit | INT8 | 4 | 8 | p4d.24xlarge | 74.9 | 27,564 | 27,580 | 32,179 | 37.1 |
BLÜTE-176B | Accelerate | INT8 | 4 | 8 | p4d.24xlarge | 669.4 | 92,694 | 92,735 | 103,292 | 11.0 |
OPT-30B | Tiefgeschwindigkeit | FP16 | 4 | 4 | g5.24xgroß | 239.4 | 11,299 | 11,302 | 11,576 | 90.6 |
OPT-30B | Accelerate | FP16 | 4 | 4 | g5.24xgroß | 533.8 | 63,734 | 63,737 | 67,605 | 16.1 |
Aus Latenzsicht ist DeepSpeed etwa 3.4-mal schneller für BLOOM-176B und 5.6-mal schneller für OPT-30B als Accelerate. Die optimierten Kernel von DeepSpeed sind für einen Großteil dieses Latenzunterschieds verantwortlich. Angesichts dieser Ergebnisse empfehlen wir, DeepSpeed statt Accelerate zu verwenden, wenn das Modell Ihrer Wahl unterstützt wird.
Es ist auch erwähnenswert, dass die Modellladezeiten mit DeepSpeed viel kürzer waren, was es zu einer besseren Option macht, wenn Sie davon ausgehen, dass Sie Ihre Anzahl von Endpunkten schnell erhöhen müssen. Die flexiblere Pipeline-Parallelisierungstechnik von Accelerate ist möglicherweise eine bessere Option, wenn Sie über Modelle oder Modellgenauigkeiten verfügen, die von DeepSpeed nicht unterstützt werden.
Diese Ergebnisse demonstrieren auch den Unterschied in Latenz und Durchsatz unterschiedlicher Modellgrößen. In unseren Tests generiert OPT-30B die 2.4-fache Anzahl an Tokens pro Zeiteinheit als BLOOM-176B auf einem Instance-Typ, der mehr als dreimal billiger ist. Bezogen auf den Durchsatzpreis pro Einheit ist OPT-30B auf einer g5.24xl-Instanz 8.9-mal besser als BLOOM-176B auf einer p4d.24xl-Instanz. Wenn Sie strenge Latenz-, Durchsatz- oder Kostenbeschränkungen haben, sollten Sie das kleinstmögliche Modell verwenden, das die funktionalen Anforderungen noch erfüllt.
Aufräumen
Als Teil der Best Practices wird immer empfohlen, inaktive Instanzen zu löschen. Der folgende Code zeigt Ihnen, wie Sie die Instanzen löschen.
Löschen Sie optional den Modellprüfpunkt von Ihrem S3
Zusammenfassung
In diesem Beitrag haben wir gezeigt, wie SageMaker-Inferenzcontainer für große Modelle verwendet werden, um zwei große Sprachmodelle, BLOOM-176B und OPT-30B, zu hosten. Wir haben die modellparallelen Techniken von DeepSpeed mit mehreren GPUs auf einer einzigen SageMaker ML-Instanz verwendet.
Weitere Einzelheiten zu Amazon SageMaker und seinen Inferenzfunktionen für große Modelle finden Sie unter Amazon SageMaker unterstützt jetzt die Bereitstellung großer Modelle durch konfigurierbare Volume-Größe und Timeout-Kontingente und Echtzeit-Inferenz.
Über die Autoren
Simon Zamarin ist ein AI / ML Solutions Architect, dessen Hauptaugenmerk darauf liegt, Kunden dabei zu helfen, Wert aus ihren Datenbeständen zu ziehen. In seiner Freizeit verbringt Simon gerne Zeit mit seiner Familie, liest Science-Fiction und arbeitet an verschiedenen DIY-Hausprojekten.
Rupinder Grewal ist ein Sr Ai/ML Specialist Solutions Architect bei AWS. Derzeit konzentriert er sich auf die Bereitstellung von Modellen und MLOps auf SageMaker. Vor dieser Funktion hat er als Machine Learning Engineer gearbeitet und Modelle erstellt und gehostet. Außerhalb der Arbeit spielt er gerne Tennis und radelt auf Bergpfaden.
Frank Liu ist ein Software Engineer für AWS Deep Learning. Er konzentriert sich auf den Aufbau innovativer Deep-Learning-Tools für Software-Ingenieure und Wissenschaftler. In seiner Freizeit wandert er gerne mit Freunden und der Familie.
Alan Tan ist Senior Product Manager bei SageMaker und leitet die Bemühungen zur Inferenz großer Modelle. Er setzt sich leidenschaftlich für die Anwendung von Machine Learning im Bereich Analytics ein. Außerhalb der Arbeit genießt er die Natur.
Dhawal Patel ist Principal Machine Learning Architect bei AWS. Er hat mit Organisationen von großen Unternehmen bis hin zu mittelständischen Startups an Problemen im Zusammenhang mit verteiltem Computing und künstlicher Intelligenz gearbeitet. Er konzentriert sich auf Deep Learning, einschließlich NLP- und Computer Vision-Domänen. Er hilft Kunden, hochleistungsfähige Modellinferenz auf SageMaker zu erreichen.
Qing Lan ist Softwareentwicklungsingenieur bei AWS. Er hat an mehreren herausfordernden Produkten bei Amazon gearbeitet, darunter Hochleistungs-ML-Inferenzlösungen und Hochleistungs-Protokollierungssysteme. Das Team von Qing führte erfolgreich das erste Billion-Parameter-Modell in Amazon Advertising mit sehr geringer Latenz ein. Qing verfügt über fundierte Kenntnisse in den Bereichen Infrastrukturoptimierung und Deep-Learning-Beschleunigung.
Qingwei Li ist Spezialist für maschinelles Lernen bei Amazon Web Services. Er erhielt seinen Ph.D. in Operations Research, nachdem er das Konto seines Beraters für Forschungsstipendien aufgelöst und den versprochenen Nobelpreis nicht geliefert hatte. Derzeit hilft er Kunden in der Finanzdienstleistungs- und Versicherungsbranche beim Aufbau von Lösungen für maschinelles Lernen auf AWS. In seiner Freizeit liest und unterrichtet er gerne.
Robert Van Dusen ist Senior Product Manager bei Amazon SageMaker. Er leitet die Deep-Learning-Modelloptimierung für Anwendungen wie die Inferenz großer Modelle.
Siddharth Venkatesan ist Software Engineer bei AWS Deep Learning. Derzeit konzentriert er sich auf die Entwicklung von Lösungen für die Inferenz großer Modelle. Vor AWS arbeitete er in der Amazon Grocery-Organisation am Aufbau neuer Zahlungsfunktionen für Kunden auf der ganzen Welt. Außerhalb der Arbeit fährt er gerne Ski, ist in der Natur und schaut sich Sport an.
- Fortgeschritten (300)
- AI
- Kunst
- KI-Kunstgenerator
- KI-Roboter
- Amazon Sage Maker
- künstliche Intelligenz
- Zertifizierung für künstliche Intelligenz
- Künstliche Intelligenz im Bankwesen
- Roboter mit künstlicher Intelligenz
- Roboter mit künstlicher Intelligenz
- Software für künstliche Intelligenz
- AWS Maschinelles Lernen
- Blockchain
- Blockchain-Konferenz ai
- Einfallsreichtum
- dialogorientierte künstliche Intelligenz
- Krypto-Konferenz ai
- Dalls
- tiefe Lernen
- Google Ai
- Maschinelles Lernen
- Plato
- platon ai
- Datenintelligenz von Plato
- Plato-Spiel
- PlatoData
- Platogaming
- Skala ai
- Syntax
- Zephyrnet