xDiT ist eine Open-Source-Bibliothek, die die Inferenz für Diffusion Transformer-Modelle (DiT) mithilfe von Parallelitäts- und Optimierungstechniken beschleunigt. Diese Techniken ermöglichen eine skalierbare Multi-GPU-Einrichtung für anspruchsvolle Arbeitslasten. Auf dieser Seite wird gezeigt, wie DiT-Modelle mit xDiT und Cloud-GPUs auf der Gemini Enterprise Agent Platform bereitgestellt werden.
Weitere Informationen zu xDiT finden Sie im xDiT-GitHub-Projekt.
Vorteile
In der folgenden Liste sind die wichtigsten Vorteile der Verwendung von xDiT zum Bereitstellen von DiT-Modellen auf der Agent Platform aufgeführt:
- Bis zu dreimal schnellere Generierung: Generieren Sie Bilder und Videos mit hoher Auflösung in einem Bruchteil der Zeit im Vergleich zu anderen Bereitstellungslösungen.
- Skalierbare Multi-GPU-Unterstützung: Verteilen Sie Arbeitslasten effizient auf
mehrere GPUs, um eine optimale Leistung zu erzielen.
- Hybride Parallelität: xDiT unterstützt verschiedene Ansätze zur parallelen Verarbeitung, z. B. einheitliche Sequenzparallelität, PipeFusion, CFG-Parallelität und Datenparallelität. Diese Methoden können in einem einzigartigen Rezept kombiniert werden, um die Leistung zu optimieren.
- Optimierte Single-GPU-Leistung: xDiT bietet eine schnellere Inferenz auch auf einer
einzelnen GPU.
- GPU-Beschleunigung: xDiT enthält mehrere Methoden zur Kernelbeschleunigung und verwendet Techniken von DiTFastAttn, um die Inferenz auf einer einzelnen GPU zu beschleunigen.
- Einfache Bereitstellung: Mit der Ein-Klick-Bereitstellung oder Colab Enterprise-Notebooks im Model Garden der Gemini Enterprise Agent Platform können Sie schnell loslegen.
Unterstützte Modelle
xDiT ist für bestimmte DiT-Modellarchitekturen im Model Garden der Gemini Enterprise Agent Platform verfügbar, z. B. für die Varianten der Modelle Flux.1 Schnell, CogVideoX-2b und Wan2.1 für die Text-zu-Video-Generierung. Ob ein DiT-Modell xDiT im Model Garden unterstützt, sehen Sie auf der Modellkarte in Model Garden.
Hybride Parallelität für Multi-GPU-Leistung:
xDiT verwendet eine Kombination aus Parallelitätstechniken, um die Leistung bei Multi-GPU-Einrichtungen zu maximieren. Diese Techniken arbeiten zusammen, um die Arbeitslast zu verteilen und die Ressourcennutzung zu optimieren:
- Einheitliche Sequenzparallelität: Bei dieser Technik werden die Eingabedaten (z. B. durch Aufteilen eines Bildes in Patches) auf mehrere GPUs verteilt, wodurch die Arbeitsspeichernutzung reduziert und die Skalierbarkeit verbessert wird.
- PipeFusion: PipeFusion teilt das DiT-Modell in Phasen auf und weist jeder Phase eine andere GPU zu, wodurch die parallele Verarbeitung verschiedener Teile des Modells ermöglicht wird.
- CFG-Parallelität: Diese Technik optimiert Modelle speziell durch die Verwendung von Classifier-Free Guidance (CFG), einer gängigen Methode zum Steuern des Stils und Inhalts generierter Bilder. Sie parallelisiert die Berechnung von bedingten und bedingungslosen Zweigen, was zu einer schnelleren Inferenz führt.
- Datenparallelität: Bei dieser Methode wird das gesamte Modell auf jeder GPU repliziert. Jede GPU verarbeitet einen anderen Batch von Eingabedaten, wodurch der Gesamtdurchsatz des Systems erhöht wird.
Weitere Informationen zu Leistungsverbesserungen finden Sie im Bericht von xDiT zu Flux.1 Schnell oder CogVideoX-2b. Google konnte diese Ergebnisse im Model Garden der Gemini Enterprise Agent Platform reproduzieren.
Single-GPU-Beschleunigung
Die xDiT-Bibliothek bietet Vorteile für die Single-GPU-Bereitstellung, indem sie torch.compile und onediff verwendet, um die Laufzeitgeschwindigkeit auf GPUs zu verbessern. Diese Techniken können auch in Verbindung mit hybrider Parallelität verwendet werden.
xDiT verfügt außerdem über ein effizientes Verfahren zur Berechnung der Aufmerksamkeit, DiTFastAttn genannt, um den Rechenengpass von DiT zu beheben. Derzeit ist diese Technik nur für Single-GPU-Einrichtungen oder in Verbindung mit Datenparallelität verfügbar.
Erste Schritte mit Model Garden
Der für xDiT optimierte Cloud-GPU-Bereitstellungscontainer ist im Model Garden der Gemini Enterprise Agent Platform verfügbar. Bei unterstützten Modellen wird dieser Container für Bereitstellungen verwendet, wenn Sie die Ein-Klick-Bereitstellung oder die Colab Enterprise-Notebook-Beispiele verwenden.
In den folgenden Beispielen wird anhand des Modells Flux.1-schnell gezeigt, wie Sie ein DiT-Modell in einem xDiT-Container bereitstellen.
Bereitstellung mit nur einem Klick verwenden
Sie können einen benutzerdefinierten Agent Platform-Endpunkt mit dem xDiT-Container mithilfe einer Modellkarte bereitstellen.
Rufen Sie die Seite „Modellkarte“ auf und klicken Sie auf Bereitstellen.
Wählen Sie für die zu verwendende Modellvariante einen Maschinentyp für die Bereitstellung aus.
Klicken Sie auf Bereitstellen , um den Bereitstellungsprozess zu starten. Sie erhalten zwei E-Mail-Benachrichtigungen: eine, wenn das Modell hochgeladen wurde, und eine weitere, wenn der Endpunkt bereit ist.
Colab Enterprise-Notebook verwenden
Für mehr Flexibilität und Anpassungsmöglichkeiten können Sie Colab Enterprise-Notebook-Beispiele verwenden, um einen Agent Platform-Endpunkt mit dem xDiT-Container mithilfe des Agent Platform SDK für Python bereitzustellen.
Rufen Sie die Seite „Modellkarte“ auf und klicken Sie auf Notebook öffnen.
Wählen Sie das Vertex Serving-Notebook aus. Das Notebook wird in Colab Enterprise geladen.
Führen Sie das Notebook durch, um ein Modell mit dem xDiT-Container bereitzustellen und Vorhersageanfragen an den Endpunkt zu senden. Das Code-Snippet für die Bereitstellung sieht so aus:
import vertexai
from vertexai import model_garden
vertexai.init(project=<YOUR_PROJECT_ID>, location=<REGION>)
model = model_garden.OpenModel("black-forest-labs/FLUX.1-schnell")
endpoint = model.deploy()
xDiT-Argumente
xDiT bietet eine Reihe von Serverargumenten, die konfiguriert werden können, um die Leistung für bestimmte Anwendungsfälle zu optimieren. Diese Argumente werden während der Bereitstellung als Umgebungsvariablen festgelegt. In der folgenden Liste sind die wichtigsten Argumente aufgeführt, die Sie möglicherweise konfigurieren müssen:
Modellkonfiguration
MODEL_ID(String): Gibt die Modell-ID an, die geladen werden soll. Sie sollte mit dem Modellnamen in Ihrer Registrierung oder Ihrem Pfad übereinstimmen.
Argumente zur Laufzeitoptimierung
N_GPUS(Ganzzahl): Gibt die Anzahl der GPUs an, die für die Inferenz verwendet werden sollen. Der Standardwert ist 1.WARMUP_STEPS(Ganzzahl): Anzahl der Aufwärmschritte, die vor Beginn der Inferenz erforderlich sind. Dies ist besonders wichtig, wenn PipeFusion aktiviert ist, um eine stabile Leistung zu gewährleisten. Der Standardwert ist 1.USE_PARALLEL_VAE(boolesch): Ermöglicht die effiziente Verarbeitung von Bildern mit hoher Auflösung (mehr als 2048 Pixel), indem die VAE-Komponente parallel auf mehreren Geräten verarbeitet wird. Dadurch werden OOM-Probleme bei großen Bildern vermieden. Der Standardwert ist „false“.USE_TORCH_COMPILE(boolesch): Ermöglicht die Single-GPU-Beschleunigung über torch.compile und bietet Optimierungen auf Kernelebene für eine bessere Leistung. Der Standardwert ist „false“.USE_ONEDIFF(boolesch): Aktiviert die OneDiff-Kompilierungsbeschleunigungstechnologie, um die Ausführungsgeschwindigkeit des GPU-Kernels zu optimieren. Der Standardwert ist „false“.
Argumente für die Datenparallelität
DATA_PARALLEL_DEGREE(Ganzzahl): Legt den Grad der Datenparallelität fest. Lassen Sie das Feld leer, um die Datenparallelität zu deaktivieren, oder legen Sie den ausgewählten Grad der Parallelität fest.USE_CFG_PARALLEL(boolesch): Ermöglicht die parallele Berechnung für Classifier-Free Guidance (CFG), auch Split Batch genannt. Wenn diese Option aktiviert ist, ist der konstante Grad der Parallelität 2. Legen Sie den Wert auf „true“ fest, wenn Sie CFG verwenden, um Stil und Inhalt der Ausgabe zu steuern. Der Standardwert ist „false“.
Argumente für die Sequenzparallelität (USP – Unified Sequence Parallelism)
ULYSSES_DEGREE(Ganzzahl): Legt den Ulysses-Grad für den einheitlichen Ansatz zur Sequenzparallelität fest, der DeepSpeed-Ulysses und Ring-Attention kombiniert. Dadurch wird das All-to-All-Kommunikationsmuster gesteuert. Lassen Sie das Feld leer, um den Standardwert zu verwenden.RING_DEGREE(Ganzzahl): Legt den Ring-Grad für die Peer-to-Peer-Kommunikation bei der Sequenzparallelität fest. Er wird in Verbindung mit ULYSSES_DEGREE verwendet, um das 2D-Prozessnetz zu bilden. Lassen Sie das Feld leer, um den Standardwert zu verwenden.
Argumente für die Tensorparallelität
TENSOR_PARALLEL_DEGREE(Ganzzahl): Legt den Grad der Tensorparallelität fest, wodurch Modellparameter auf mehreren Geräten entlang der Feature-Dimensionen aufgeteilt werden, um die Speicherkosten pro Gerät zu senken. Lassen Sie das Feld leer, um die Tensorparallelität zu deaktivieren.SPLIT_SCHEME(String): Definiert, wie die Modell-Tensoren auf mehrere Geräte aufgeteilt werden (z.B. nach Aufmerksamkeitsköpfen, verborgenen Dimensionen). Lassen Sie das Feld leer, um das Standardaufteilungsschema zu verwenden.
Argumente für die verteilte Ray-Ausführung
USE_RAY(boolesch): Aktiviert das verteilte Ray-Ausführungsframework, um Berechnungen auf mehrere Knoten zu skalieren. Der Standardwert ist „false“.RAY_WORLD_SIZE(Ganzzahl): Gesamtzahl der Prozesse im Ray-Cluster. Der Standardwert ist 1.VAE_PARALLEL_SIZE(Ganzzahl): Anzahl der Prozesse, die für die parallele VAE-Verarbeitung verwendet werden, wenn Ray verwendet wird. Der Standardwert ist 0.DIT_PARALLEL_SIZE(Ganzzahl): Anzahl der Prozesse, die für die parallele Verarbeitung des DiT-Backbone verwendet werden, wenn Ray verwendet wird. Der Standardwert ist 0.
Argumente für die parallele PipeFusion-Ausführung
PIPEFUSION_PARALLEL_DEGREE(Ganzzahl): Legt den Grad der Parallelität für PipeFusion fest, eine Pipeline-Parallelität auf Sequenzebene, die die zeitliche Redundanz der Eingabe von Diffusionsmodellen nutzt. Höhere Werte erhöhen die Parallelität, erfordern aber mehr Arbeitsspeicher. Der Standardwert ist 1.NUM_PIPELINE_PATCH(Ganzzahl): Anzahl der Patches, in die die Sequenz für die Pipeline-Verarbeitung aufgeteilt werden soll. Lassen Sie das Feld leer, um die Anzahl automatisch zu bestimmen.ATTN_LAYER_NUM_FOR_PP(String): Gibt an, welche Aufmerksamkeits-Layer für die Pipeline-Parallelität verwendet werden sollen. Die Werte können kommagetrennt (z.B. „10,9“) oder durch Leerzeichen (z.B. „10 9“) getrennt werden. Lassen Sie das Feld leer, um alle Layer zu verwenden.
Argumente zur Arbeitsspeicheroptimierung
ENABLE_MODEL_CPU_OFFLOAD(boolesch): Lagert Modellgewichte in den CPU-Arbeitsspeicher aus, wenn sie nicht verwendet werden. Dadurch wird die GPU-Arbeitsspeichernutzung reduziert, aber die Latenz erhöht. Der Standardwert ist „false“.ENABLE_SEQUENTIAL_CPU_OFFLOAD(boolesch): Lagert Modell-Layer während der Vorwärtsübertragung sequenziell in die CPU aus, wodurch die Inferenz von Modellen ermöglicht wird, die größer als der GPU-Arbeitsspeicher sind. Der Standardwert ist „false“.ENABLE_TILING(boolesch): Reduziert die GPU-Arbeitsspeichernutzung, indem die VAE-Komponente jeweils in einem Tile decodiert wird. Dieses Argument ist nützlich für größere Bilder oder Videos und um Fehler aufgrund von zu wenig Arbeitsspeicher zu vermeiden. Der Standardwert ist „false“.ENABLE_SLICING(boolesch): Reduziert die GPU-Arbeitsspeichernutzung, indem der Eingabetensor für die VAE-Decodierung in Slices aufgeteilt wird. Der Standardwert ist „false“.
DiTFastAttn-Argumente (Aufmerksamkeitsoptimierung)
USE_FAST_ATTN(boolesch): Aktiviert die DiTFastAttn-Beschleunigung für die Single-GPU-Inferenz und nutzt die zeitliche Reduzierung der Eingabe, um die Rechenkomplexität zu reduzieren. Der Standardwert ist „false“.N_CALIB(Ganzzahl): Anzahl der Kalibrierungs-Samples für die DiTFastAttn-Optimierung. Der Standardwert ist 8.THRESHOLD(Float): Ähnlichkeitsschwelle für die zeitliche Ähnlichkeitsreduzierung in DiTFastAttn. Der Standardwert ist 0,5.WINDOW_SIZE(Ganzzahl): Fenstergröße für die Fensteraufmerksamkeit mit Residual Caching, um die räumliche Redundanz zu reduzieren. Der Standardwert ist 64.COCO_PATH(String): Pfad zum COCO-Dataset für die DiTFastAttn-Kalibrierung. Erforderlich, wenn USE_FAST_ATTN auf „true“ gesetzt ist. Lassen Sie das Feld leer, wenn Sie es nicht verwenden.
Argumente zur Cache-Optimierung
USE_CACHE(boolesch): Aktiviert allgemeine Caching-Mechanismen, um redundante Berechnungen zu reduzieren. Der Standardwert ist „false“.USE_TEACACHE(boolesch): Aktiviert die TeaCache-Optimierungsmethode zum Speichern von Zwischenergebnissen im Cache. Der Standardwert ist „false“.USE_FBCACHE(boolesch): Aktiviert die First-Block-Cache-Optimierungsmethode. Der Standardwert ist „false“.
Argumente zur Genauigkeitsoptimierung
USE_FP8_T5_ENCODER(boolesch): Aktiviert die FP8-Genauigkeit (8-Bit-Gleitkommazahl) für den T5-Text-Encoder, wodurch die Arbeitsspeichernutzung reduziert und der Durchsatz möglicherweise verbessert wird, ohne die Qualität wesentlich zu beeinträchtigen. Der Standardwert ist „false“.
Bereitstellungsanpassungen
Model Garden bietet Standardkonfigurationen für die xDiT-Parallelisierung für unterstützte Modelle. Sie können diese Standardeinstellungen mit dem Agent Platform SDK für Python prüfen.
Wenn Sie die Standardbereitstellungskonfiguration für ein Modell wie „black-forest-labs/FLUX.1-schnell“ aufrufen möchten, können Sie das folgende Code-Snippet ausführen:
import vertexai
from vertexai import model_garden
vertexai.init(project=<YOUR_PROJECT_ID>, location=<REGION>)
model = model_garden.OpenModel("black-forest-labs/FLUX.1-schnell")
deploy_options = model.list_deploy_options()
# Example Response
# ['black-forest-labs/flux1-schnell@flux.1-schnell']
# [model_display_name: "Flux1-schnell"
# container_spec {
# image_uri: "us-docker.pkg.dev/deeplearning-platform-release/vertex-model-garden/xdit-serve.cu125.0-2.ubuntu2204.py310"
# env {
# name: "DEPLOY_SOURCE"
# value: "UI_NATIVE_MODEL"
# }
# env {
# name: "MODEL_ID"
# value: "gs://vertex-model-garden-restricted-us/black-forest-labs/FLUX.1-schnell"
# }
# env {
# name: "TASK"
# value: "text-to-image"
# }
# env {
# name: "N_GPUS"
# value: "2"
# }
# env {
# name: "USE_TORCH_COMPILE"
# value: "true"
# }
# env {
# name: "RING_DEGREE"
# value: "2"
# }
# ..........]
Die Methode list_deploy_options() gibt die Containerspezifikationen zurück, einschließlich der Umgebungsvariablen (env), die die xDiT-Konfiguration definieren.
Wenn Sie die Parallelitätsstrategie anpassen möchten, können Sie diese Umgebungsvariablen überschreiben, wenn Sie das Modell bereitstellen. Das folgende Beispiel zeigt, wie Sie RING_DEGREE und ULYSSES_DEGREE für eine 2-GPU-Einrichtung ändern und so den Parallelitätsansatz ändern:
import vertexai
from vertexai import model_garden
# Replace with your project ID and region
vertexai.init(project="<YOUR_PROJECT_ID>", location="<REGION>")
model = model_garden.OpenModel("black-forest-labs/FLUX.1-schnell")
# Custom environment variables to override default settings
# This example sets N_GPUS as 2, so RING_DEGREE * ULYSSES_DEGREE must equal 2
container_env_vars = {
"N_GPUS": "2",
"RING_DEGREE": "1",
"ULYSSES_DEGREE": "2"
# Add other environment variables to customize here
}
machine_type = "a3-highgpu-2g"
accelerator_type = "NVIDIA_H100_80GB"
accelerator_count = 2
# Deploy the model with the custom environment variables
endpoint = model.deploy(
machine_type=machine_type,
accelerator_type=accelerator_type,
accelerator_count=accelerator_count,
container_env_vars=container_env_vars
)
Weitere Informationen zu den einzelnen Umgebungsvariablen finden Sie im Abschnitt „xDiT-spezifische Argumente“. Achten Sie darauf, dass das Produkt der Parallelitätsgrade (z.B. PIPEFUSION_PARALLEL_DEGREE, ULYSSES_DEGREE, RING_DEGREE und USE_CFG_PARALLEL) der Gesamtzahl der GPUs (N_GPUS) entspricht.
Weitere Beispiele für Bereitstellungsrezepte und -konfigurationen für verschiedene Modelle finden Sie in der offiziellen xDiT-Dokumentation. Weitere Informationen zum Model Garden SDK finden Sie in der Dokumentation.