Diffusers documentation

تجميع نماذج الكمّ وتحميلها

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

تجميع نماذج الكمّ وتحميلها

غالبًا ما تتضمن تحسين النماذج مقايضات بين سرعة الاستدلال واستهلاك الذاكرة. على سبيل المثال، بينما يمكن لـالتخزين المؤقت أن يعزز سرعة الاستدلال، فإنه يزيد أيضًا من استهلاك الذاكرة نظرًا لاحتياجه إلى تخزين مخرجات طبقات الانتباه الوسيطة. تجمع استراتيجية التحسين الأكثر توازنًا بين تكميم النموذج، وtorch.compile، وطرق التفريغ المختلفة.

راجع دليل torch.compile لمعرفة المزيد حول التجميع وكيفية تطبيقه هنا. على سبيل المثال، يمكن للتجميع الإقليمي أن يقلل بشكل كبير من وقت التجميع دون التنازل عن أي تسريع.

في توليد الصور، يمكن أن يؤدي الجمع بين التكميم وإزاحة النموذج غالبًا إلى تحقيق أفضل توازن بين الجودة والسرعة والذاكرة. ولا تكون إزاحة المجموعات فعالة بنفس القدر في توليد الصور، لأنه عادةً ما يكون من غير الممكن تداخل نقل البيانات بالكامل إذا انتهى نواة الحساب بشكل أسرع. وهذا يؤدي إلى بعض النفقات الإضافية للتواصل بين المعالج المركزي (CPU) ومعالج الرسوميات (GPU).

في توليد الفيديو، يميل الجمع بين التكميم وإزاحة المجموعات إلى أن يكون أفضل لأن نماذج الفيديو تكون أكثر ارتباطاً بالحساب.

توفر الجدول أدناه مقارنة بين تركيبات استراتيجيات التحسين وتأثيرها على زمن الاستجابة واستهلاك الذاكرة في Flux.

التركيبةزمن الاستجابة (ثانية)استهلاك الذاكرة (جيجابايت)
التكميم32.60214.9453
التكميم، torch.compile25.84714.9448
التكميم، torch.compile، نقل النموذج إلى وحدة المعالجة المركزية32.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.

ستُظهر لك هذه الدليل كيفية تجميع نموذج مُكمَّم ونقله باستخدام bitsandbytes. تأكد من أنك تستخدم PyTorch nightly وأحدث إصدار من bitsandbytes.

على الرغم من أننا نستخدم bitsandbytes في هذا المثال، فإن محركات التكميم الأخرى مثل TorchAO تدعم أيضًا هذه الميزات.

pip install -U bitsandbytes

التكميم وtorch.compile

ابدأ بـ تكميم النموذج لتقليل الذاكرة المطلوبة للتخزين و تجميعه لتسريع الاستدلال.

قم بإعداد Dynamo باستخدام capture_dynamic_output_shape_ops = True للتعامل مع المخرجات الديناميكية عند تجميع نماذج 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]

التكميم، وtorch.compile، والتفريغ

بالإضافة إلى التكميم وtorch.compile، جرّب الإزاحة (offloading) إذا كنت بحاجة إلى تقليل استهلاك الذاكرة بشكل أكبر. تقوم الإزاحة بنقل طبقات أو مكونات نموذج مختلفة من وحدة المعالجة المركزية (CPU) إلى وحدة معالجة الرسوميات (GPU) حسب الحاجة للعمليات الحسابية.

قم بتكوين Dynamo cache_size_limit أثناء الإزاحة لتجنب إعادة التجميع المفرط، و اضبط capture_dynamic_output_shape_ops = True للتعامل مع المخرجات الديناميكية عند تجميع نماذج bitsandbytes.

إزاحة النموذج إلى وحدة المعالجة المركزية
إخلاء المجموعة

ينقل إزاحة النموذج إلى المعالج المركزي مكوّن خط المعالجة الفردي، مثل نموذج التحوّل، إلى وحدة معالجة الرسوميات عند الحاجة إليه للحساب. وإلا، يتم إزاحته إلى المعالج المركزي.

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