Menayangkan model Diffusion Transformer menggunakan penampung xDiT di GPU Cloud

xDiT adalah library open source yang mempercepat inferensi untuk model Diffusion Transformer (DiT) dengan menggunakan teknik paralelisme dan pengoptimalan. Teknik ini memungkinkan penyiapan multi-GPU yang skalabel untuk workload yang menuntut. Halaman ini menunjukkan cara men-deploy model DiT menggunakan xDiT dan GPU Cloud di Vertex AI.

Untuk mengetahui informasi selengkapnya tentang xDiT, lihat project GitHub xDiT.

Manfaat

Daftar berikut menjelaskan manfaat utama menggunakan xDiT untuk menayangkan model DiT di Vertex AI:

  • Pembuatan hingga tiga kali lebih cepat: Buat gambar dan video beresolusi tinggi dalam waktu yang jauh lebih singkat dibandingkan solusi penayangan lainnya.
  • Dukungan multi-GPU yang skalabel: Mendistribusikan workload secara efisien di beberapa GPU untuk performa yang optimal.
    • Paralelisme hibrida: xDiT mendukung berbagai pendekatan pemrosesan paralel, seperti paralelisme urutan terpadu, PipeFusion, paralelisme CFG, dan paralelisme data. Metode ini dapat digabungkan dalam resep unik untuk mengoptimalkan performa.
  • Performa GPU tunggal yang dioptimalkan: xDiT memberikan inferensi yang lebih cepat bahkan pada GPU tunggal.
    • Akselerasi GPU: xDiT menggabungkan beberapa metode akselerasi kernel dan menggunakan teknik dari DiTFastAttn untuk mempercepat inferensi pada satu GPU.
  • Deployment yang mudah: Mulai dengan cepat menggunakan deployment sekali klik atau notebook Colab Enterprise di Vertex AI Model Garden.

Model yang didukung

xDiT tersedia untuk arsitektur model DiT tertentu di Vertex AI Model Garden seperti Flux.1 Schnell, CogVideoX-2b, dan varian model text-to-video Wan2.1. Untuk melihat apakah model DiT mendukung xDiT di Model Garden, lihat kartu modelnya di Model Garden.

Paralelisme hibrida untuk performa multi-GPU:

xDiT menggunakan kombinasi teknik paralelisme untuk memaksimalkan performa pada penyiapan multi-GPU. Teknik ini bekerja sama untuk mendistribusikan workload dan mengoptimalkan pemanfaatan resource:

  • Paralelisme urutan terpadu: Teknik ini membagi data input (seperti membagi gambar menjadi beberapa patch) di beberapa GPU, sehingga mengurangi penggunaan memori dan meningkatkan skalabilitas.
  • PipeFusion: PipeFusion membagi model DiT menjadi beberapa tahap dan menetapkan setiap tahap ke GPU yang berbeda, sehingga memungkinkan pemrosesan paralel dari berbagai bagian model.
  • Paralelisme CFG: Teknik ini secara khusus mengoptimalkan model dengan menggunakan panduan bebas klasifikasi, metode umum untuk mengontrol gaya dan konten gambar yang dihasilkan. Hal ini memparalelkan komputasi cabang bersyarat dan tanpa syarat, sehingga menghasilkan inferensi yang lebih cepat.
  • Paralelisme Data: Metode ini mereplikasi seluruh model di setiap GPU, dengan setiap GPU memproses batch data input yang berbeda, sehingga meningkatkan throughput keseluruhan sistem.

Untuk mengetahui informasi selengkapnya tentang peningkatan performa, lihat laporan xDiT tentang Flux.1 Schnell atau CogVideoX-2b. Google dapat mereproduksi hasil ini di Vertex AI Model Garden.

Akselerasi GPU tunggal

Library xDiT memberikan manfaat untuk penayangan GPU tunggal dengan menggunakan torch.compile dan onediff untuk meningkatkan kecepatan runtime di GPU. Teknik ini juga dapat digunakan bersama dengan paralelisme hibrida.

xDiT juga memiliki teknik komputasi perhatian yang efisien, yang disebut DiTFastAttn, untuk mengatasi hambatan komputasi DiT. Untuk saat ini, teknik ini hanya dapat digunakan untuk penyiapan GPU tunggal atau bersama dengan paralelisme data.

Mulai menggunakan Model Garden

Container penayangan Cloud GPU yang dioptimalkan xDiT disediakan dalam Vertex AI Model Garden. Untuk model yang didukung, deployment menggunakan container ini saat Anda menggunakan deployment sekali klik atau contoh notebook Colab Enterprise.

Contoh berikut menggunakan model Flux.1-schnell untuk menunjukkan cara men-deploy model DiT pada container xDiT.

Menggunakan deployment sekali klik

Anda dapat men-deploy endpoint Vertex AI kustom dengan container xDiT menggunakan kartu model.

  1. Buka halaman kartu model, lalu klik Deploy.

  2. Untuk variasi model yang akan digunakan, pilih jenis mesin yang akan digunakan untuk deployment Anda.

  3. Klik Deploy untuk memulai proses deployment. Anda akan menerima dua notifikasi email; satu saat model diupload dan satu lagi saat endpoint siap.

Menggunakan notebook Colab Enterprise

Untuk fleksibilitas dan penyesuaian, gunakan contoh notebook Colab Enterprise untuk men-deploy endpoint Vertex AI dengan container xDiT menggunakan Vertex AI SDK untuk Python.

  1. Buka halaman kartu model, lalu klik Buka notebook.

  2. Pilih notebook Vertex Serving. Notebook akan dibuka di Colab Enterprise.

  3. Jalankan notebook untuk men-deploy model menggunakan container xDiT dan mengirim permintaan prediksi ke endpoint. Cuplikan kode untuk deployment adalah sebagai berikut:

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

Argumen xDiT

xDiT menawarkan berbagai argumen server yang dapat dikonfigurasi untuk mengoptimalkan performa untuk kasus penggunaan tertentu. Argumen ini ditetapkan sebagai variabel lingkungan selama deployment. Berikut adalah argumen utama yang mungkin perlu Anda konfigurasi:

Konfigurasi Model
  • MODEL_ID (string): Menentukan ID model yang akan dimuat. Nama ini harus cocok dengan nama model di registry atau jalur Anda.
Argumen Pengoptimalan Runtime
  • N_GPUS (integer): Menentukan jumlah GPU yang akan digunakan untuk inferensi. Nilai defaultnya adalah 1.
  • WARMUP_STEPS (integer): Jumlah langkah pemanasan yang diperlukan sebelum inferensi dimulai. Hal ini sangat penting saat PipeFusion diaktifkan untuk memastikan performa yang stabil. Nilai default adalah 1.
  • USE_PARALLEL_VAE (boolean): Memungkinkan pemrosesan gambar beresolusi tinggi (lebih dari 2048 piksel) yang efisien dengan memparalelkan komponen VAE di seluruh perangkat. Hal ini mencegah masalah OOM untuk gambar berukuran besar. Nilai defaultnya adalah false.
  • USE_TORCH_COMPILE (boolean): Mengaktifkan akselerasi GPU tunggal melalui torch.compile, yang memberikan pengoptimalan tingkat kernel untuk meningkatkan performa. Nilai defaultnya adalah false.
  • USE_ONEDIFF (boolean): Mengaktifkan teknologi akselerasi kompilasi OneDiff untuk mengoptimalkan kecepatan eksekusi kernel GPU. Nilai defaultnya adalah false.
Argumen Paralel Data
  • DATA_PARALLEL_DEGREE (bilangan bulat): Menetapkan tingkat paralelisme data. Biarkan kosong untuk menonaktifkan atau tetapkan ke tingkat paralel yang dipilih.
  • USE_CFG_PARALLEL (boolean): Mengaktifkan komputasi paralel untuk panduan bebas klasifikasi (CFG), yang juga dikenal sebagai Batch Terpisah. Jika diaktifkan, tingkat paralelisme konstan adalah 2. Disetel ke benar (true) saat menggunakan CFG untuk mengontrol gaya dan konten output. Nilai defaultnya adalah false.
Argumen Paralel Urutan (USP - Unified Sequence Parallelism)
  • ULYSSES_DEGREE (integer): Menetapkan derajat Ulysses untuk pendekatan paralel urutan terpadu, yang menggabungkan DeepSpeed-Ulysses dan Ring-Attention. Setelan ini mengontrol pola komunikasi semua-ke-semua. Biarkan kosong untuk menggunakan setelan default.
  • RING_DEGREE (bilangan bulat): Menetapkan tingkat Ring untuk komunikasi peer-to-peer dalam paralelisme berurutan. Bekerja bersama dengan ULYSSES_DEGREE untuk membentuk mesh proses 2D. Biarkan kosong untuk menggunakan setelan default.
Argumen Paralel Tensor
  • TENSOR_PARALLEL_DEGREE (bilangan bulat): Menetapkan tingkat paralelisme tensor, yang membagi parameter model di seluruh perangkat di sepanjang dimensi fitur untuk mengurangi biaya memori per perangkat. Biarkan kosong untuk menonaktifkan.
  • SPLIT_SCHEME (string): Menentukan cara membagi tensor model di seluruh perangkat (misalnya, menurut head perhatian, dimensi tersembunyi). Biarkan kosong untuk skema pemisahan default.
Argumen Terdistribusi Ray
  • USE_RAY (boolean): Mengaktifkan framework eksekusi terdistribusi Ray untuk menskalakan komputasi di beberapa node. Nilai defaultnya adalah false.
  • RAY_WORLD_SIZE (integer): Jumlah total proses dalam cluster Ray. Nilai defaultnya adalah 1.
  • VAE_PARALLEL_SIZE (integer): Jumlah proses yang dikhususkan untuk pemrosesan paralel VAE saat menggunakan Ray. Nilai defaultnya adalah 0.
  • DIT_PARALLEL_SIZE (bilangan bulat): Jumlah proses yang dikhususkan untuk pemrosesan paralel backbone DiT saat menggunakan Ray. Nilai defaultnya adalah 0.
Argumen Paralel PipeFusion
  • PIPEFUSION_PARALLEL_DEGREE (bilangan bulat): Menetapkan tingkat paralelisme untuk PipeFusion, paralelisme pipeline tingkat urutan yang memanfaatkan karakteristik redundansi temporal input model difusi. Nilai yang lebih tinggi meningkatkan paralelisme, tetapi memerlukan lebih banyak memori. Nilai default adalah 1.
  • NUM_PIPELINE_PATCH (integer): Jumlah patch untuk membagi urutan menjadi pemrosesan pipeline. Biarkan kosong untuk penentuan otomatis.
  • ATTN_LAYER_NUM_FOR_PP (string): Menentukan lapisan perhatian mana yang akan digunakan untuk paralelisme pipeline. Dapat dipisahkan dengan koma (misalnya, "10,9") atau dipisahkan dengan spasi (misalnya, "10 9"). Biarkan kosong untuk menggunakan semua lapisan.
Argumen Pengoptimalan Memori
  • ENABLE_MODEL_CPU_OFFLOAD (boolean): Mengurangi beban bobot model ke memori CPU saat tidak digunakan, sehingga mengurangi penggunaan memori GPU dengan biaya peningkatan latensi. Nilai defaultnya adalah false.
  • ENABLE_SEQUENTIAL_CPU_OFFLOAD (boolean): Secara berurutan memindahkan lapisan model ke CPU selama penerusan maju, sehingga memungkinkan inferensi model yang lebih besar daripada memori GPU. Nilai defaultnya adalah false.
  • ENABLE_TILING (boolean): Mengurangi penggunaan memori GPU dengan mendekode komponen VAE satu petak dalam satu waktu. Argumen ini berguna untuk gambar atau video yang lebih besar dan untuk mencegah error kehabisan memori. Nilai defaultnya adalah false.
  • ENABLE_SLICING (boolean): Mengurangi penggunaan memori GPU dengan membagi tensor input menjadi slice untuk decoding VAE. Nilai defaultnya adalah false.
Argumen DiTFastAttn (Pengoptimalan Perhatian)
  • USE_FAST_ATTN (boolean): Mengaktifkan akselerasi DiTFastAttn untuk inferensi GPU tunggal, yang memanfaatkan Pengurangan Temporal Input untuk mengurangi kompleksitas komputasi. Nilai defaultnya adalah false.
  • N_CALIB (integer): Jumlah sampel kalibrasi untuk pengoptimalan DiTFastAttn. Nilai default-nya adalah 8.
  • THRESHOLD (float): Nilai minimum kesamaan untuk Pengurangan Kesamaan Temporal di DiTFastAttn. Nilai defaultnya adalah 0,5.
  • WINDOW_SIZE (bilangan bulat): Ukuran jendela untuk Window Attention dengan Residual Caching untuk mengurangi redundansi spasial. Nilai defaultnya adalah 64.
  • COCO_PATH (string): Jalur ke set data COCO untuk kalibrasi DiTFastAttn. Wajib diisi jika USE_FAST_ATTN benar (true). Biarkan kosong jika tidak digunakan.
Argumen Pengoptimalan Cache
  • USE_CACHE (boolean): Mengaktifkan mekanisme caching umum untuk mengurangi komputasi yang berlebihan. Nilai defaultnya adalah false.
  • USE_TEACACHE (boolean): Mengaktifkan metode pengoptimalan TeaCache untuk menyimpan dalam cache hasil sementara. Nilai defaultnya adalah false.
  • USE_FBCACHE (boolean): Mengaktifkan metode pengoptimalan First-Block-Cache. Nilai defaultnya adalah false.
Argumen Pengoptimalan Presisi
  • USE_FP8_T5_ENCODER (boolean): Mengaktifkan presisi FP8 (floating point 8 bit) untuk encoder teks T5, sehingga mengurangi penggunaan memori dan berpotensi meningkatkan throughput dengan dampak kualitas minimal. Nilai defaultnya adalah false.

Penyesuaian Penayangan

Model Garden menyediakan konfigurasi paralelisasi xDiT default untuk model yang didukung. Anda dapat memeriksa setelan default ini menggunakan Vertex AI SDK untuk Python.

Untuk melihat konfigurasi deployment default untuk model, seperti "black-forest-labs/FLUX.1-schnell", Anda dapat menjalankan cuplikan kode berikut:

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"
#  }
# ..........]

Metode list_deploy_options() menampilkan spesifikasi penampung, termasuk variabel lingkungan (env) yang menentukan konfigurasi xDiT.

Untuk menyesuaikan strategi paralelisme, Anda dapat mengganti variabel lingkungan ini saat men-deploy model. Contoh berikut menunjukkan cara mengubah RING_DEGREE dan ULYSSES_DEGREE untuk penyiapan 2 GPU, dengan mengubah pendekatan paralelisme:

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
)

Jangan lupa untuk membaca bagian "Memahami argumen khusus xDiT" untuk mengetahui detail setiap variabel lingkungan. Pastikan produk tingkat paralelisme (misalnya, PIPEFUSION_PARALLEL_DEGREE,ULYSSES_DEGREE, RING_DEGREE, dan USE_CFG_PARALLEL) sama dengan jumlah total GPU (N_GPUS).

Untuk contoh lainnya tentang cara menyajikan resep dan konfigurasi untuk berbagai model, lihat dokumentasi resmi xDiT. Untuk informasi tambahan tentang Model Garden SDK, lihat dokumentasi.