Diffusers documentation

Biên dịch và chuyển các mô hình lượng tử

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Biên dịch và chuyển các mô hình lượng tử

Việc tối ưu hóa mô hình thường liên quan đến sự đánh đổi giữa tốc độ suy luận và lượng bộ nhớ sử dụng. Ví dụ, trong khi lưu trữ đệm (caching) có thể tăng tốc độ suy luận, nó cũng làm tăng mức tiêu thụ bộ nhớ vì cần lưu trữ đầu ra của các lớp chú ý trung gian. Một chiến lược tối ưu hóa cân bằng hơn kết hợp việc lượng tử hóa mô hình, torch.compile và các phương pháp offloading khác nhau.

Xem hướng dẫn torch.compile để tìm hiểu thêm về biên dịch và cách áp dụng chúng ở đây. Ví dụ, biên dịch theo vùng có thể giảm đáng kể thời gian biên dịch mà không đánh đổi bất kỳ tốc độ tăng tốc nào.

Đối với việc tạo ảnh, việc kết hợp lượng tử hóa và chuyển mô hình thường mang lại sự cân bằng tốt nhất giữa chất lượng, tốc độ và bộ nhớ. Việc chuyển theo nhóm không hiệu quả bằng đối với việc tạo ảnh vì thường không thể trùng lặp hoàn toàn việc truyền dữ liệu nếu nhân tính toán kết thúc nhanh hơn. Điều này dẫn đến một số chi phí truyền thông giữa CPU và GPU.

Đối với việc tạo video, việc kết hợp lượng tử hóa và group-offloading thường cho kết quả tốt hơn vì các mô hình video phụ thuộc nhiều hơn vào khả năng tính toán.

Bảng dưới đây cung cấp so sánh các tổ hợp chiến lược tối ưu hóa và tác động của chúng đến độ trễ và mức sử dụng bộ nhớ đối với Flux.

tổ hợpđộ trễ (giây)lượng bộ nhớ sử dụng (GB)
lượng tử hóa32.60214.9453
quantization, torch.compile25.84714.9448
lượng tử hóa, torch.compile, chuyển mô hình ra CPU32.31212.2369
These results are benchmarked on Flux with a RTX 4090. The transformer and text_encoder components are quantized. Refer to the benchmarking script if you're interested in evaluating your own model.

Hướng dẫn này sẽ cho bạn thấy cách biên dịch và offload một mô hình đã lượng tử hóa bằng bitsandbytes. Hãy đảm bảo bạn đang sử dụng PyTorch nightly và phiên bản mới nhất của bitsandbytes.

Mặc dù chúng ta sử dụng bitsandbytes trong ví dụ này, các backend lượng tử hóa khác như TorchAO cũng hỗ trợ các tính năng này.

pip install -U bitsandbytes

Quantization và torch.compile

Bắt đầu bằng cách lượng tử hóa một mô hình để giảm bộ nhớ cần thiết cho việc lưu trữ và biên dịch nó để tăng tốc suy luận.

Cấu hình Dynamo capture_dynamic_output_shape_ops = True để xử lý các đầu ra động khi biên dịch các mô hình bitsandbytes.

import torch
from diffusers import DiffusionPipeline
from diffusers.quantizers import PipelineQuantizationConfig

torch._dynamo.config.capture_dynamic_output_shape_ops = True

# quantize
pipeline_quant_config = PipelineQuantizationConfig(
    quant_backend="bitsandbytes_4bit",
    quant_kwargs={"load_in_4bit": True, "bnb_4bit_quant_type": "nf4", "bnb_4bit_compute_dtype": torch.bfloat16},
    components_to_quantize=["transformer", "text_encoder_2"],
)
pipeline = DiffusionPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

# compile
pipeline.transformer.to(memory_format=torch.channels_last)
pipeline.transformer.compile(mode="max-autotune", fullgraph=True)
pipeline("""
    cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
    highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""
).images[0]

Quantization, torch.compile, và offloading

Ngoài lượng tử hóa và torch.compile, hãy thử offloading nếu bạn cần giảm thêm mức sử dụng bộ nhớ. Offloading di chuyển các lớp hoặc thành phần mô hình khác nhau từ CPU sang GPU khi cần cho các phép tính.

Cấu hình Dynamo cache_size_limit trong quá trình offloading để tránh biên dịch lại quá mức và đặt capture_dynamic_output_shape_ops = True để xử lý các đầu ra động khi biên dịch các mô hình bitsandbytes.

tách bộ nhớ CPU cho model
tải xuống nhóm

Model CPU offloading di chuyển một thành phần pipeline riêng lẻ, chẳng hạn như mô hình transformer, sang GPU khi cần thiết cho việc tính toán. Ngược lại, thành phần đó sẽ được offload sang CPU.

import torch
from diffusers import DiffusionPipeline
from diffusers.quantizers import PipelineQuantizationConfig

torch._dynamo.config.cache_size_limit = 1000
torch._dynamo.config.capture_dynamic_output_shape_ops = True

# quantize
pipeline_quant_config = PipelineQuantizationConfig(
    quant_backend="bitsandbytes_4bit",
    quant_kwargs={"load_in_4bit": True, "bnb_4bit_quant_type": "nf4", "bnb_4bit_compute_dtype": torch.bfloat16},
    components_to_quantize=["transformer", "text_encoder_2"],
)
pipeline = DiffusionPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

# model CPU offloading
pipeline.enable_model_cpu_offload()

# compile
pipeline.transformer.compile()
pipeline(
    "cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California, highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain"
).images[0]
Update on GitHub