Diffusers documentation

SDNQ

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

SDNQ

SDNQ (SD.Next Quantization) هو واجهة خلفية للتكميم لا تتطلب تدريبًا، ويدعم مجموعة واسعة من أنواع بيانات الأوزان (من int8 حتى 2-bit، وFP8، وأنواع فاصلة العائمة منخفضة البتات الأخرى) مع تصحيح اختياري باستخدام SVD، ودوران Hadamard، وضرب مصفوفات مكمّمة INT8/FP8 لاستدلال أسرع. يعمل على CUDA وROCm وXPU وMPS وCPU.

قم بتثبيت مكتبة sdnq لاستخدام هذا الخلفية.

pip install sdnq

تحميل نقطة تحقق مُسبقة التكميم

يُخزَّن تكوين التكميم لنقطة تحقق SDNQ مُكمَّمة مسبقًا في ملف config.json الخاص بها، لذا يتم تحميلها مثل أي نموذج آخر، دون الحاجة إلى معامل quantization_config. الشرط الوحيد هو تثبيت sdnq.

import torch
from diffusers import DiffusionPipeline

pipe = DiffusionPipeline.from_pretrained(
    "Disty0/Z-Image-Turbo-SDNQ-uint4-svd-r32",
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

image = pipe("a cat holding a sign that says hello").images[0]
image.save("output.png")

اضبط DIFFUSERS_SDNQ_TRANSFORMERS=1 (قبل استيراد Diffusers) عند تحميل نموذج Transformers مُكمَّم بـ SDNQ بشكل مستقل، مثل مُشفّر نص مُكمَّم أو مكوّن LLM مستقل في خط أنابيب معياري. يتيح ذلك لـ sdnq تسجيل نفسه مع Transformers حتى يتم تحميل النموذج المُكمَّم بشكل صحيح. لا تحتاج إلى ضبطه عند تحميل مُحوّل diffusers مُكمَّم بـ SDNQ إلى جانبه، لأن تحميل ذلك المُحوّل يستورد sdnq مسبقًا ويسجّله. وهو معطّل افتراضيًا حتى لا تستورد خطوط الأنابيب التي لا تستخدم SDNQ مكتبة sdnq أبدًا.

تكميم نموذج أثناء التشغيل

مرّر SDNQConfig إلى from_pretrained لتهيئة النموذج أثناء التحميل. استخدم PipelineQuantizationConfig لتهيئة مكوّنات خط المعالجة المحددة.

import torch
from diffusers import DiffusionPipeline, PipelineQuantizationConfig, SDNQConfig

pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={"transformer": SDNQConfig(weights_dtype="uint4", use_svd=True)}
)
pipe = DiffusionPipeline.from_pretrained(
    "Tongyi-MAI/Z-Image-Turbo",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

أو قم بتكميم مكوّن نموذج واحد مباشرة.

import torch
from diffusers import ZImageTransformer2DModel, SDNQConfig

transformer = ZImageTransformer2DModel.from_pretrained(
    "Tongyi-MAI/Z-Image-Turbo",
    subfolder="transformer",
    quantization_config=SDNQConfig(weights_dtype="int8"),
    dtype=torch.bfloat16,
)

تُمرَّر جميع الحُجج إلى sdnq.SDNQConfig. راجع توثيق SDNQ للحصول على القائمة الكاملة لأنواع البيانات (dtypes) والخيارات المدعومة.

اختيار الطبقات التي سيتم تكميمها

بعض الطبقات أكثر حساسية للكمّية من غيرها، وتخطي الطبقات الحساسة يحسّن الجودة بتكلفة ذاكرة ضئيلة. يتعامل SDNQ مع ذلك بشكل افتراضي: فهو يأتي بقوائم تخطٍ مدمجة (قائمة عامة بالإضافة إلى قوائم لكل نموذج للعديد من البنى المعمارية) تُطبَّق تلقائيًا، بحيث تبقى الطبقات الحساسة المعتادة غير مُكمَّمة دون أي إعداد. ولتحكم أدق، يمكنه أيضًا اختيار الطبقات ديناميكيًا، بقياس خطأ الكمّية لكل طبقة وتخطي تلك التي تتجاوز عتبة الخسارة. راجع دليل الكمّية الديناميكية لـ SDNQ للتفاصيل.

استدلال أسرع باستخدام ضرب المصفوفات المُكمّمة

بشكل افتراضي، يعيد SDNQ فك ترميز الأوزان إلى نوع البيانات الحسابي قبل كل عملية ضرب مصفوفي. وبدلاً من ذلك، عند تفعيل الضرب المصفوفي الكمومي، تُنفَّذ عملية الضرب المصفوفي مباشرةً في نوع بيانات منخفض الدقة (INT8/FP8/FP16)، وهو ما يكون أسرع على الأجهزة التي تحتوي على تثبيت عامل لـ Triton (CUDA أو ROCm أو XPU).

فعّله على نموذج محمّل باستخدام apply_sdnq_options_to_model، حيث يقرأ إعدادات التكميم الحالية للنموذج ويعيد تطبيق الخيار في مكانه. ويعمل هذا مع نقاط التفتيش المُكمّمة مسبقًا أيضًا، حيث لا يتم تمرير SDNQConfig.

import torch
from diffusers import DiffusionPipeline
from sdnq.common import use_torch_compile as triton_is_available
from sdnq.loader import apply_sdnq_options_to_model

pipe = DiffusionPipeline.from_pretrained(
    "Disty0/Z-Image-Turbo-SDNQ-uint4-svd-r32",
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

if triton_is_available and (torch.cuda.is_available() or torch.xpu.is_available()):
    pipe.transformer = apply_sdnq_options_to_model(pipe.transformer, use_quantized_matmul=True)
    pipe.text_encoder = apply_sdnq_options_to_model(pipe.text_encoder, use_quantized_matmul=True)

torch.compile

تتوافق النماذج المُكمّمة بتقنية SDNQ مع torch.compile لتحقيق تسريع إضافي، بما في ذلك عند استخدامها مع group offloading.

transformer.compile(fullgraph=True)

حفظ نموذج مُكمَّم

يمكن تسلسل النماذج المُكمّاة باستخدام save_pretrained وإعادة تحميلها دون الحاجة إلى quantization_config.

transformer.save_pretrained("z-image-turbo-sdnq-int8")

الموارد

Update on GitHub