Diffusers documentation
BFL (fp8r / nvfp4)
BFL (fp8r / nvfp4)
تُصدر Black Forest Labs نسخًا مُكمّمة من محولات Flux3 الخاصة بها وفق مخططَين، وتُخزَّن كنقاط فحص أحادية الملف بجوار أوزان bf16 الأصلية:
fp8r: FP8 على مستوى الصفوف. يخزّن كل خطي مُكمَّم وزنًا من نوع E4M3weightومقياسًا لكل صف من نوع fp32weight_scale. يتم كمّ التنشيطات إلى E4M3 لكل صف وقت التشغيل.nvfp4: NVFP4 في تخطيط ModelOpt. يخزّن كل خطي مُكمَّمweightمُجمَّعًا من نوع E2M1 (قيمتان لكل بايت)، ومقاييس كتل E4M3 بحجم 16 (weight_scale)، ومقياسًا عامًاweight_scale_2من نوع fp32، ومقياس تنشيط مُعايَرinput_scaleمن نوع fp32.
تحمّل Diffusers كلاهما عبر ~FromSingleFileMixin.from_single_file باستخدام BFLQuantizationConfig. يتم قراءة المخطط من نقطة التفتيش، لذا يعمل نفس الإعداد مع أي من الملفين. يتم دعم تحميل نقاط التفتيش المُكمّاة مسبقًا فقط؛ ولا يتم دعم التحميل على مستوى خط الأنابيب.
يُحمّل المثال أدناه نقطة الفحص fp8r الخاصة بـ FLUX 3 Image Klein Base، والتي تقع في variants/fp8r/model.safetensors ضمن مستودع النموذج. مرّر config بحيث تُقرأ إعدادات النموذج من مجلد Diffusers في ذلك المستودع، ثم حمّل المكونات الأخرى بالاسم (انظر التحميل من ملف واحد).
import torch
from diffusers import BFLQuantizationConfig, Flux3Transformer2DModel, ModularPipeline
ckpt_path = "https://huggingface.co/black-forest-labs/flux-3-image-klein-base/blob/main/variants/fp8r/model.safetensors"
transformer = Flux3Transformer2DModel.from_single_file(
ckpt_path,
config="black-forest-labs/flux-3-image-klein-base",
subfolder="transformer",
quantization_config=BFLQuantizationConfig(compute_dtype=torch.bfloat16),
dtype=torch.bfloat16,
)
pipe = ModularPipeline.from_pretrained("black-forest-labs/flux-3-image-klein-base")
pipe.load_components(dtype=torch.bfloat16)
pipe.update_components(transformer=transformer)
pipe.to("cuda")
prompt = "A wide-angle wildlife photograph of a red fox standing alert in a snow-covered forest clearing at golden hour."
image = pipe(prompt=prompt, generator=torch.Generator().manual_seed(0), output="images")[0]
image.save("flux3-klein-base-fp8r.png")استبدل variants/fp8r بـ variants/nvfp4 لتحميل النسخة nvfp4. تأتي النسخة المُصفاة خطوة بخطوة من FLUX 3 Image Klein بالنسختين نفسيهما؛ حمّلهما باستخدام معرف مستودعها كـ config وخط أنابيب.
النوى
تبقى الأوزان المُكمّمة في نوع التخزين منخفض الدقة الخاص بها. يعتمد تنفيذ GEMM على الجهاز:
| المخطط | نواة مدمجة | المتطلبات |
|---|---|---|
fp8r | torch._scaled_mm مع مقاييس صفية | وحدة معالجة رسومات CUDA بقابلية حساب 8.9 أو أعلى |
nvfp4 | flashinfer.mm_fp4 (CUTLASS) مع flashinfer.nvfp4_quantize لتفعيلات | وحدة معالجة رسومات Blackwell (قدرة الحوسبة 10.0 أو أعلى)، وأدوات CUDA مع nvcc، وflashinfer-python مع flashinfer-cubin في نفس الإصدار |
قم بتثبيت حزم FlashInfer الاثنتين عند نفس الإصدار، على سبيل المثال pip install flashinfer-python==0.6.13 flashinfer-cubin==0.6.13. قد يتأخر إصدار flashinfer-cubin عن flashinfer-python، ويرفض FlashInfer الاستيراد عندما تختلف الإصدارات.
يقوم FlashInfer بتجميع نواته NVFP4 عند الاستخدام الأول باستخدام مجموعة أدوات CUDA الخاصة بالبيئة، ويحدد البنية المستهدفة من وحدة معالجة الرسوميات المرئية (أو من FLASHINFER_CUDA_ARCH_LIST عند ضبطها). تحتاج وحدات معالجة الرسوميات Blackwell الموجهة للمستهلكين ومحطات العمل (قدرة الحوسبة 12.0) إلى مجموعة أدوات CUDA من الإصدار 12.9 أو أحدث. عند استخدام مجموعة أدوات أقدم، لا يجد FlashInfer أي بنية مؤهلة، ويفشل أول استدعاء لـ NVFP4 مع رسالة FlashInfer requires GPUs with sm75 or higher.
على أي جهاز آخر، يتم إلغاء تكميم الأوزان إلى compute_dtype في كل تمريرة أمامية، وتعمل الطبقة كخطية عادية. في هذه الحالة، لا يتم تكميم التنشيطات، لذا فإن المخرجات تختلف قليلاً عن النوى المدمجة.