Diffusers documentation

Nunchaku Lite

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

Nunchaku Lite

Nunchaku Lite هو واجهة خلفية للكمّية (quantization) لتحميل نقاط التفتيش المُكمّاة مسبقًا في Diffusers. أنشئ نقاط تفتيش متوافقة باستخدام diffuse-compressor. يقوم بتكميم مُحوِّل (transformer) وتصديره، ثم يجمعه كخط أنابيب (pipeline) في Diffusers.

يعتمد Nunchaku Lite على محرك الاستدلال الأصلي Nunchaku، ومكتبة التكميم DeepCompressor، وورقة SVDQuant.

تثبيت نواة CUDA

يوفر حزمة kernels نواة CUDA المُحسّنة، والتي يتم تحميلها تلقائيًا. ثبّتها أولًا.

pip install -U kernels

تحمّل Nunchaku Lite نواتها من مستودع rootonchair/nunchaku-lite-kernels، حيث أن ناشره ليس ناشر نواة موثوقًا به على Hub. يؤدي تحميله إلى تنزيل وتنفيذ أكواد من Hub، لذا يتطلب Diffusers منك الموافقة صراحةً على ذلك عن طريق تعيين DIFFUSERS_TRUST_REMOTE_KERNELS=true. راجع الثقة في النوى البعيدة للتفاصيل.

تحميل خط أنابيب مُكمَّم

حمّل خط الأنابيب المُكمَّم مسبقًا باستخدام from_pretrained()، حيث يقرأ إعدادات الكمّ من config.json.

import torch
from diffusers import DiffusionPipeline

model_id = "rootonchair/ERNIE-Image-Turbo-nunchaku-lite-nvfp4"

pipe = DiffusionPipeline.from_pretrained(
    model_id, dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

prompt = "A modern red armchair in a quiet studio, soft window light, realistic product photography"
image = pipe(
    prompt=prompt,
    height=1024,
    width=1024,
    num_inference_steps=8,
    guidance_scale=1.0,
).images[0]
image.save("ernie-image-turbo-nunchaku-lite.png")

يجب أن يطابق state dict المُصدَّر بنية نموذج Diffusers المستهدف تمامًا. على سبيل المثال، لن يتم تحميل نقطة تفتيش (checkpoint) تم تكميمها باستخدام إسقاطات QKV مدمجة في إعدادات نموذج يتوقع وحدات إسقاط منفصلة لكل من Q وK وV.

أنواع التكميم المدعومة

يدعم Nunchaku Lite صيغ طبقات الخطي المُكمّمة التالية.

استخدم nvfp4 على وحدات معالجة الرسومات Blackwell. قد يكون تشغيل نقاط التفتيش int4 على Blackwell أبطأ من nvfp4.

تدعم نواة CUDA حاليًا معماريات وحدات معالجة الرسوميات من NVIDIA التالية:

  • sm_75 (تورينغ، على سبيل المثال RTX 2080)
  • sm_80 (Ampere، على سبيل المثال A100)
  • sm_86 (Ampere، على سبيل المثال RTX 3090 و RTX A6000)
  • sm_89 (Ada، على سبيل المثال RTX 4090)
  • sm_120 (Blackwell، على سبيل المثال RTX 5090)

لا يتم دعم معالجات Hopper الرسومية، مثل sm_90 H100 وH200، حاليًا.

يتطلب نقاط التفتيش nvfp4 معالجًا رسوميًا من NVIDIA من طراز Blackwell أو أحدث. على معالجات Blackwell الرسومية، استخدم PyTorch >= 2.7 مع CUDA >= 12.8. تتطلب نقاط التفتيش int4 معالجًا رسوميًا من NVIDIA من طراز Turing أو أحدث.

الطريقةالدقةحجم المجموعةملاحظات
svdq_w4a4nvfp416يستخدم نواة NVFP4 وقت التشغيل مع تصحيح SVDQ منخفض الرتبة.
svdq_w4a4int464يستخدم نواة INT4 W4A4 مع تصحيح SVDQ منخفض الرتبة.
awq_w4a16int464يستخدم نواة INT4 للأوزان فقط بأسلوب AWQ.

NunchakuLiteQuantizationConfig

يجب أن يتضمن ملف config.json كائن NunchakuLiteQuantizationConfig. وهو يحدد نوع البيانات compute_dtype وقت التشغيل، والوحدات المستهدفة لكل طريقة من طرق التكميم في Nunchaku Lite.

  • compute_dtype: نوع البيانات وقت التشغيل للذاكرة المؤقتة ذات الفاصلة العائمة في الوحدات الكمية، وهو عادةً torch.bfloat16.
  • svdq_w4a4: تكوين الهدف SVDQ W4A4 مع precision وgroup_size وrank وtargets.
  • awq_w4a16: إعدادات الهدف AWQ W4A16 مع precision وgroup_size وtargets.

يجب أن يشير كل عنصر في targets إلى طبقة خطية. تقوم Diffusers باستبدال كل هدف svdq_w4a4 بطبقة SVDQ W4A4 وكل هدف awq_w4a16 بطبقة AWQ W4A16. يُظهر المثال أدناه الشكل المتوقع مع قوائم أهداف مختصرة.

أدرج كل وحدة تريد تكميمها تحت svdq_w4a4 أو awq_w4a16. لا يمكن للوحدة استخدام سوى طريقة واحدة، لذا لا تدرج نفس الهدف تحت الطريقتين معًا.

{
  "_class_name": "ErnieImageTransformer2DModel",
  "quantization_config": {
    "quant_method": "nunchaku_lite",
    "compute_dtype": "bfloat16",
    "svdq_w4a4": {
      "precision": "nvfp4",
      "group_size": 16,
      "rank": 32,
      "targets": ["layers.0.self_attention.to_q"]
    },
    "awq_w4a16": {
      "precision": "int4",
      "group_size": 64,
      "targets": ["final_linear"]
    }
  }
}

النواة المدمجة

يستمد محرك Nunchaku الأصلي جزءًا كبيرًا من سرعته من مسارات التنفيذ المدمجة المحددة لكل نموذج. فهو يجمع بين إسقاطات Q وK وV مع RMSNorm وRoPE، ويستخدم نواة GELU مدمجة لطبقة MLP. أما Nunchaku Lite فيستخدم نموذج Diffusers القياسي مع طبقات خطية كمية عامة، لذا فهو لا يتضمن هذه الدمجات.

تُظهر القياسات التالية تأثير زمن الاستجابة لكل خطوة لهذه الدمج في محرك Nunchaku الأصلي، وقد قُيس باستخدام Flux Schnell على بطاقة RTX 5090.

التحسينزمن الاستجابة عند إيقافهزمن الاستجابة عند تفعيلهالتسريع
دمج QKV+norm+RoPE (مجمّع)1.057 s0.834 s1.27×
— تجميع Q/K/V في عملية ضرب مصفوفات واحدة، بشكل منفصل1.059 s1.034 s1.025×
— دمج خاتمة RMSNorm+RoPE، فوق التجميع1.034 s0.836 s1.236×
دمج GELU-MLP0.766 s0.722 s1.06×

بدون هذه الدمجات، تُطلق وحدة المعالجة الرسومية (GPU) عمليات الإسقاط والتطبيع والتضمين الدوّاري وشبكة الطبقات متعددة الطبقات (MLP) ككُتل (kernels) منفصلة، مما يُضيف عبئًا على عملية الإطلاق. قد تقلل torch.compile من بعض هذا العبء، على الرغم من أنها لا تُعيد بالضرورة إنتاج الكُتل المدمجة الأصلية للمحرك. قم بإجراء اختبارات أداء (Benchmark) للخط الأنابيب المُجمّع (compiled pipeline) الخاص بنموذجك وحِمل العمل لديك.

torch.compile

تتوافق نواة Nunchaku Lite والطبقات الخطية المُكمّمة مع torch.compile. قم بتجميع المُحوِّل المُكمَّم بعد تحميل خط الأنابيب للحصول على استدلال أسرع.

pipe.transformer = torch.compile(pipe.transformer, mode="default", fullgraph=True)

يعمل خط أنابيب Nunchaku Lite NVFP4 المُجمَّع أسرع بنسبة 1.8 مرة من خط أنابيب BF16 الأصلي (من 2.271 ثانية إلى 1.675 ثانية على بطاقة RTX PRO 6000).

الموارد

Update on GitHub