Diffusers documentation
البدء
البدء
تركز عملية الكمّ (Quantization) على تمثيل البيانات بعدد أقل من البتات مع السعي في الوقت نفسه للحفاظ على دقة البيانات الأصلية. وغالبًا ما يعني ذلك تحويل نوع البيانات لتمثيل المعلومات نفسها بعدد أقل من البتات. على سبيل المثال، إذا كانت أوزان النموذج مخزنة كنقاط عائمة بدقة 32 بت وتم كمّها إلى نقاط عائمة بدقة 16 بت، فإن ذلك يُقلّص حجم النموذج إلى النصف، مما يسهّل تخزينه ويقلّل من استهلاك الذاكرة. كما يمكن أن يؤدي انخفاض الدقة إلى تسريع الاستدلال (Inference) لأن إجراء العمليات الحسابية بعدد أقل من البتات يستغرق وقتًا أقصر.
يدعم Diffusers عدة محركات (backends) للكمّية (quantization) لجعل نماذج الانتشار الكبيرة مثل Flux أكثر قابلية للوصول. يوضح هذا الدليل كيفية استخدام فئة PipelineQuantizationConfig لكمّية (quantize) خط الأنابيب (pipeline) أثناء تهيئته من نقطة تحقق (checkpoint) مُدرَّبة مسبقًا أو غير مُكمَّاة.
التكميم على مستوى خط الأنابيب
هناك طريقتان لاستخدام PipelineQuantizationConfig اعتمادًا على مقدار التخصيص الذي ترغب في تطبيقه على إعدادات التكميم.
- لحالات الاستخدام الأساسية، عرّف الحجج
quant_backendوquant_kwargsوcomponents_to_quantize - للحصول على تحكم دقيق في التكميم، عرّف
quant_mappingيوفر إعدادات التكميم لمكونات النموذج الفردية
التكميم الأساسي
قم بتهيئة PipelineQuantizationConfig باستخدام المعلمات التالية.
quant_backendيحدد أي خلفية تكميم (quantization backend) يجب استخدامها. تشمل الخلفيات المدعومة حاليًا:bitsandbytes_4bit،bitsandbytes_8bit،gguf،quanto، وtorchao.quant_kwargsيحدد حُجج التكميم (quantization) التي يجب استخدامها.
تختلف هذه الحجة
quant_kwargsباختلاف كل إطار تشغيل. راجع وثائق Quantization API للاطلاع على الحجج الخاصة بكل إطار تشغيل.
components_to_quantizeيحدد المكوّن أو المكوّنات من خط الأنابيب التي يجب تكميمها. عادةً، يجب تكميم المكوّنات الأكثر استهلاكًا للحسابات مثل transformer. يُعدّ text encoder مكوّنًا آخر يُنظر في تكميمه إذا كان خط الأنابيب يحتوي على أكثر من مكوّن واحد، كما هو الحال في FluxPipeline. يكمّم المثال أدناه text encoder الخاص بـ T5 في FluxPipeline مع إبقاء نموذج CLIP كما هو.يقبل
components_to_quantizeإما قائمة لعدة نماذج أو نصًا لنموذج واحد.
يحمّل المثال أدناه واجهة bitsandbytes باستخدام الحُجج التالية من BitsAndBytesConfig، وهي load_in_4bit وbnb_4bit_quant_type وbnb_4bit_compute_dtype.
import torch
from diffusers import DiffusionPipeline
from diffusers.quantizers import PipelineQuantizationConfig
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_quant_config إلى from_pretrained() لتكميم خط الأنابيب.
pipe = DiffusionPipeline.from_pretrained(
"black-forest-labs/FLUX.1-dev",
quantization_config=pipeline_quant_config,
dtype=torch.bfloat16,
).to("cuda") # or "mps", "xpu", "cpu"
image = pipe("photo of a cute dog").images[0]التكميم المتقدم
توفر حجة quant_mapping خيارات إضافية لكيفية تكميم كل مكوّن فردي في خط الأنابيب، مثل دمج واجهات تكميم مختلفة.
قم بتهيئة PipelineQuantizationConfig وقم بتمرير quant_mapping إليه. يتيح لك quant_mapping تحديد خيارات التكميم لكل مكوّن في خط الأنابيب، مثل المحوّل (transformer) ومشفّر النص (text encoder).
يستخدم المثال أدناه واجهتي برمجة خلفية (backends) للكمّية، وهما QuantoConfig وtransformers.BitsAndBytesConfig، للمحوّل (transformer) ومشفّر النص (text encoder).
import torch
from diffusers import DiffusionPipeline
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
from diffusers.quantizers.quantization_config import QuantoConfig
from diffusers.quantizers import PipelineQuantizationConfig
from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig
pipeline_quant_config = PipelineQuantizationConfig(
quant_mapping={
"transformer": QuantoConfig(weights_dtype="int8"),
"text_encoder_2": TransformersBitsAndBytesConfig(
load_in_4bit=True, compute_dtype=torch.bfloat16
),
}
)يوجد مُنفّذ (backend) منفصل لـ bitsandbytes في Transformers. تحتاج إلى استيراد واستخدام transformers.BitsAndBytesConfig للمكوّنات القادمة من Transformers. على سبيل المثال، text_encoder_2 في FluxPipeline هو T5EncoderModel من Transformers، لذا عليك استخدام transformers.BitsAndBytesConfig بدلاً من diffusers.BitsAndBytesConfig.
استخدم طريقة التكميم الأساسية المذكورة أعلاه إذا كنت لا ترغب في إدارة هذه الاستيرادات المختلفة أو إذا لم تكن متأكداً من مصدر كل مكوّن في خط المعالجة.
import torch
from diffusers import DiffusionPipeline
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
from diffusers.quantizers import PipelineQuantizationConfig
from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig
pipeline_quant_config = PipelineQuantizationConfig(
quant_mapping={
"transformer": DiffusersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16),
"text_encoder_2": TransformersBitsAndBytesConfig(
load_in_4bit=True, compute_dtype=torch.bfloat16
),
}
)مرّر pipeline_quant_config إلى from_pretrained() لتكميم خط الأنابيب.
pipe = DiffusionPipeline.from_pretrained(
"black-forest-labs/FLUX.1-dev",
quantization_config=pipeline_quant_config,
dtype=torch.bfloat16,
).to("cuda") # or "mps", "xpu", "cpu"
image = pipe("photo of a cute dog").images[0]تحميل نقاط التفتيش المُسبقة التكميم
تدعم بعض واجهات التكميم (quantization backends) تحميل نقاط التفتيش (checkpoints) التي تم تكميمها مسبقًا ورفعها إلى الـ Hub. في هذه الحالة، يتم تخزين إعدادات التكميم في ملف config.json الخاص بالنموذج وتُقرأ تلقائيًا — فلا حاجة إلى إنشاء PipelineQuantizationConfig أو تمرير معامل quantization_config.
import torch
from diffusers import DiffusionPipeline
pipe = DiffusionPipeline.from_pretrained(
"rootonchair/ERNIE-Image-Turbo-nunchaku-lite-nvfp4",
dtype=torch.bfloat16,
).to("cuda") # or "mps", "xpu", "cpu"تدعم الخوادم الخلفية التالية تحميل نقاط التفتيش المُسبقة الكمّية دون أي إعداد إضافي.
| الواجهة الخلفية | ملاحظات |
|---|---|
| bitsandbytes | يتم حفظ Config في config.json؛ لا حاجة إلى أي حُجج إضافية. يدعم أيضًا التكميم أثناء التشغيل، وكذلك تحميل نقاط التفتيش المُكمَّمة مسبقًا. |
| torchao | نفس ما سبق. |
| GGUF | يستخدم from_single_file مع فئات النموذج؛ ولا يُدعم التحميل على مستوى خط الأنابيب. |
| BFL | يحمّل نقاط التفتيش أحادية الملف من Black Forest Labs بصيغتي fp8r وnvfp4 باستخدام from_single_file؛ ولا يُدعم التحميل على مستوى خط الأنابيب. |
| AutoRound | يُؤمَّن التحميل فقط؛ قم بتكميم النموذج أولاً باستخدام واجهة سطر الأوامر AutoRound CLI أو واجهة برمجة التطبيقات Python API. |
| نونتشاكو لايت | يُحفظ Config في config.json؛ ويتطلب الحزمة kernels. يتم دعم التحميل فقط. |
| ModelOpt | يُؤيَّد تحميل النماذج المُكمَّاة مسبقًا فقط. |
| SDNQ | يدعم كلًا من التكميم أثناء التشغيل وتحميل النماذج المُكمَّمة مسبقًا؛ ويتطلب حزمة sdnq. |
الموارد
اطّلع على الموارد أدناه لمعرفة المزيد حول التكميم.
إذا كنتَ جديدًا في مجال التكميم، فننصحك بالاطلاع على الدورات التعليمية التالية المصممة للمبتدئين والمقدمة بالتعاون مع DeepLearning.AI.
راجع دليل المساهمة في إضافة طريقة تكميم جديدة إذا كنت مهتمًا بإضافة طريقة تكميم جديدة.
توفر نظرة عامة على التكميم في Transformers نظرة شاملة على مزايا وعيوب مختلف أنظمة التكميم.
اقرأ منشور المدونة استكشاف واجهات التكميم في Diffusers للحصول على مقدمة موجزة لكل واجهة تكميم، وكيفية اختيار واجهة، ودمج التكميم مع تحسينات الذاكرة الأخرى.