اگر امروز برای اجرای مدلهای تبدیل متن به تصویر با خطای کمبود حافظه مواجه میشوید، راهکار جدید هگینگ فیس مصرف VRAM شما را تا ۵۰٪ کاهش میدهد. این یعنی مدلهایی که پیشتر فقط روی کارتهای گرافیکی صنعتی اجرا میشدند، اکنون روی سختافزارهای مصرفکننده جای میگیرند.
بارگذاری یک مدل مدرن تبدیل متن به تصویر با دقت BF16 معمولاً به ۲۰ تا ۳۰ گیگابایت حافظه ویدیویی (VRAM) نیاز دارد؛ سدی سخت که اکثر کاربران خانگی و کارتهای گرافیکی مصرفکننده را از دایره رقابت خارج میکند. هگینگ فیس (Hugging Face) برای حل این مشکل، Nunchaku Lite را بهطور بومی در کتابخانه Diffusers ادغام کرد تا استنتاج ۴ بیتی با کارایی بالا را روی سختافزارهای معمولی ممکن کند.
بسیاری از بکاندهای کوانتش فعلی مانند bitsandbytes، GGUF، torchao یا Quanto، تنها روی وزنها تمرکز دارند (Weight-only). این بدان معناست که آنها وزنها را با دقت پایین ذخیره میکنند اما در زمان محاسبه، آنها را دوباره به دقت بالا برمیگردانند (Dequantize). این روند حافظه را میگیرد اما بهندرت باعث بهبود سرعت میشود و حتی میتواند باعث ایجاد یک تأخیر کوچک در زمان اجرا شود.
همانطور که در تحلیل قبلی ما دربارهی بهینهسازیهای لایههای مدلهای زبانی اشاره کردیم، چالش اصلی همواره تعادل بین دقت و سرعت است. Nunchaku Lite بازی را تغییر میدهد و با پیادهسازی کوانتش W4A4، هم وزنها و هم فعالسازها (Activations) را در دقت ۴ بیتی اجرا میکند. این ادغام، فراتر از صرفاً کاهش حافظه است و مستقیماً حلقه حذف نویز (denoising loop) را هدف قرار میدهد تا فرآیند تولید تصویر سریعتر شود در حالی که ردپای حافظه کوچک باقی میماند.
طبق مستندات فنی، هسته این فناوری SVDQuant است. در مدلهای ترنسفورمر انتشار (Diffusion Transformers)، وجود مقادیر پرت (Outliers) بزرگ در هر دو بخش وزنها و فعالسازها، کوانتش ۴ بیتی را دشوار میکند، زیرا این مقادیر پرت باعث کاهش شدید دقت مدل میشوند.
SVDQuant این مشکل را با انتقال مقادیر پرت فعالسازها به داخل وزنها حل میکند. بهطور دقیقتر، SVDQuant سختترین بخش هر ماتریس وزنی را با یک شاخه کمرتبه (Low-rank branch) کوچک ۱۶ بیتی نمایش میدهد. سپس باقیمانده (Residual) به ۴ بیت کوانت میشود.
برای رسیدن به حداکثر سرعت، موتور استنتاج مرجع Nunchaku از کرنلهای ادغامشده (Fused Kernels) استفاده میکند. Nunchaku تصویر پایینرتبه (Low-rank down projection) را با کرنل کوانتش و تصویر بالا-رتبه (Low-rank up projection) را با کرنل محاسباتی ۴ بیتی ادغام میکند. این کار سربار دسترسی به حافظه را که معمولاً با شاخه ۱۶ بیتی همراه است، کاملاً حذف میکند.

در حالی که نسخه اصلی موتور Nunchaku به مسیرهای اجرای ادغامشدهی خاص هر مدل وابسته بود — مانند ادغام تصویرهای QKV و کرنلهای GELU/MLP — این بهینهسازیها به چیدمان خاص ماژولها گره خورده بودند و پشتیبانی از یک خانواده مدل جدید معمولاً نیازمند کارهای ادغام دستی بود.
Nunchaku Lite یک مسیر ادغام عمومی (Generic) را در Diffusers ارائه میدهد. در لایههای زیرین، این سیستم پیش از بارگذاری چکپوینت، ماژولهای nn.Linear مربوطه در یک مدل استاندارد Diffusers را با لایههای خطی SVDQ/AWQ در زمان اجرا جایگزین (Patch) میکند. در این حالت، دیگر نیازی به کلاس خط لوله (Pipeline) سفارشی یا موتور استنتاج مجزا نیست و هیچ کامپایل محلی CUDA مورد نیاز نمیباشد. کرنلهای NVFP4 در اولین بار استفاده، از طریق بسته kernels از هاب دانلود میشوند.
این سیستم از دو خانوادهٔ کرنل متمایز استفاده میکند:
- svdq_w4a4: برای بخشهای توجه (Attention) و تصویرهای MLP ترنسفورمر که تقریباً تمام محاسبات در آنجا انجام میشود. این کرنل در دو مدل INT4 و NVFP4 موجود است و از وزنها و فعالسازهای ۴ بیتی با اصلاح کمرتبه SVDQuant استفاده میکند.
- awq_w4a16: دارای وزنهای ۴ بیتی و فعالسازهای ۱۶ بیتی. این کرنل برای لایههای حساس به دقت و محدود به حافظه (Memory-bound) مانند تصویرهای نرمالسازی تطبیقی و مدولاسیون (به عنوان مثال
adanorm_single/adanorm_zeroدر مدل FLUX یا لایههای مدولاسیون Qwen-Image) استفاده میشود تا کیفیت مدل حفظ شود.

بارگذاری یک مدل Nunchaku Lite بهسادگی فراخوانی from_pretrained() است. کاربران تنها با نصب پیشنیازهای لازم:pip install -U diffusers transformers accelerate kernels bitsandbytes
میتوانند شروع کنند.
یک پیادهسازی نمونه با استفاده از ErnieImagePipeline به این صورت است:
import torch
from diffusers import ErnieImagePipeline
pipe = ErnieImagePipeline.from_pretrained(
"lite-infer/ERNIE-Image-Turbo-nunchaku-lite-nvfp4_r32-bnb4-text-encoder",
torch_dtype=torch.bfloat16,
).to("cuda")
image = pipe(
prompt="A cinematic portrait of a red fox in a misty forest at sunrise, detailed fur, volumetric light",
height=1024, width=1024, num_inference_steps=8, guidance_scale=1.0,
generator=torch.Generator("cuda").manual_seed(42),
).images[0]
image.save("output.png")
یک مخزن Nunchaku Lite در واقع همان مخزن استاندارد Diffusers است که تنها با یک بلوک quantization_config در فایل config.json ترنسفورمر متمایز میشود:
"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", "layers.0.self_attention.to_k", "..." ]
},
"awq_w4a16": {
"precision": "int4",
"group_size": 64,
"targets": [ "adaLN_modulation.1", "..." ]
}
}
این پیکربندی پارامترهای زیر را مشخص میکند:
quant_method: روی "nunchaku_lite" تنظیم شده است.compute_dtype: معمولاً "bfloat16" است.- جزئیات
svdq_w4a4: شامل دقت (مثلاً "nvfp4")، اندازه گروه (۱۶)، رتبه یا Rank (۳۲) و فهرستی از ماژولهای هدف مانندlayers.0.self_attention.to_q. - جزئیات
awq_w4a16: شامل دقت (مثلاً "int4")، اندازه گروه (۶۴) و اهدافی مانندadaLN_modulation.1.
از آنجا که مدل کوانتیده دقیقاً همان ساختار ماژولهای نسخه متراکم (Dense) را حفظ میکند، تمامی ابزارهای پاییندستی — از جمله زمانبندها (Schedulers)، قلابهای بارگذاری لورا (LoRA)، سیستمهای Offloading و torch.compile — آن را به عنوان یک مدل عادی Diffusers میبینند. جزئیات بیشتر درباره فرمت چکپوینت در مستندات رسمی Diffusers موجود است.
پشتیبانی سختافزاری بر اساس نسل GPU و دقت چکپوینت تقسیم شده است. کوانتایزر در زمان بارگذاری، قابلیت CUDA گرافیک را اعتبارسنجی کرده و بهجای تولید خروجیهای نادرست، خطای واضحی صادر میکند:
- NVFP4 (SVDQ W4A4): نیازمند پردازندههای NVIDIA Blackwell (سری RTX 50، RTX PRO 6000، B200).
- INT4 (SVDQ W4A4 و AWQ W4A16): پشتیبانی از معماریهای Turing، Ampere و Ada (سری RTX 30 و 40، A100، L40S).
- عدم پشتیبانی: پردازندههای Volta و Hopper در حال حاضر توسط این کرنلهای ۴ بیتی پشتیبانی نمیشوند.
بنچمارکهای روی یک NVIDIA RTX PRO 6000 (Blackwell) با استفاده از مدل rootonchair/ERNIE-Image-Turbo-nunchaku-lite-int4-bnb4-text-encoder در ابعاد ۱۰۲۴ در ۱۰۲۴ بهبودهای قابلتوجهی را نشان میدهد:
- پایه BF16: تأخیر کلی (End-to-end) ۳.۰۰ ثانیه، حلقه حذف نویز ۲.۸۶ ثانیه و پیک VRAM ۳۱.۱ گیگابایت.
- Nunchaku Lite NVFP4: تأخیر کلی ۲.۲۷ ثانیه، حلقه حذف نویز ۲.۱۳ ثانیه و VRAM ۲۰.۶ گیگابایت (۱.۳۵ برابر سریعتر).
- Nunchaku Lite NVFP4 + torch.compile: تأخیر کلی ۱.۶۸ ثانیه، حلقه حذف نویز ۱.۵۳ ثانیه و VRAM ۲۰.۶ گیگابایت (۱.۸ برابر سریعتر).
- Nunchaku Lite NVFP4 + NF4 Text Encoder: تأخیر کلی ۲.۲۹ ثانیه، حلقه حذف نویز ۲.۱۳ ثانیه و VRAM ۱۶.۰ گیگابایت.

بهینهسازیهای تکمیلی شامل torch.compile است که میتوان آن را از طریق pipe.transformer.compile(fullgraph=True) یا روش سریعتر pipe.transformer.compile_repeated_blocks(fullgraph=True) اعمال کرد. این کار شتاب کلی را از ۱.۳۵ برابر به ۱.۸ برابر میرساند.
علاوه بر این، کوانتایز کردن رمزگذارهای متنی (مانند T5 یا Qwen3) با استفاده از NF4 در bitsandbytes، پیک VRAM را در این بنچمارکها تقریباً ۲۲٪ کاهش میدهد. ابزارهای کمکی Offloading در Diffusers مانند enable_model_cpu_offload() و enable_sequential_cpu_offload() نیز کاملاً سازگار هستند تا مدل در GPUهای کوچکتر جای بگیرد.
برای کسانی که میخواهند مدلهای جدید را کوانت کنند، ابزار diffuse-compressor عرضه شده است که اجازه میدهد کاربران معماریهای خود را کالیبره، کوانت، بستهبندی و منتشر کنند. با در نظر گرفتن مدل FLUX.2 Klein 4B به عنوان مثال، گردش کار شامل این مراحل است:
مرحله ۱: بازرسی (Inspection)
- استفاده از اسکنر عمومی برای پیمایش مدل.
- شناسایی لایه های خطی سازگار در استک تکرارشونده بلوکهای ترنسفورمر به عنوان اهداف SVDQ W4A4.
- شناسایی لایه های مدولاسیون شناختهشده به عنوان اهداف AWQ W4A16.
- سایر بخشها متراکم (Dense) باقی میمانند.
- برای FLUX.2 Klein 4B، نتیجه مورد انتظار ۱۰۰ هدف SVDQ، ۳ هدف AWQ و ۶ لایه خطی متراکم بیرونی است.
- اجرا:
python examples/text_to_image/quantize_hf.py black-forest-labs/FLUX.2-klein-4B --precision int4 --rank 32 --inspect-config
مرحله ۲: کوانتش (Quantization)
- اجرای SVDQuant روی ترنسفورمر و نوشتن چکپوینت در قالب
.safetensors. - جایگزینی
--precision int4باnvfp4برای ساخت وزنهای بومی Blackwell. - اجرا:
python examples/text_to_image/quantize_hf.py black-forest-labs/FLUX.2-klein-4B --precision int4 --output outputs/checkpoints/svdq-int4_r32-flux-2-klein-4b.safetensors
مرحله ۳: بستهبندی (Packaging)
- ترکیب ترنسفورمر کوانتیده با اجزای پایه خط لوله.
- نوشتن پیکربندی فشرده
nunchaku_liteدر فایلtransformer/config.json. - تبدیل اختیاری رمزگذارهای متنی به NF4.
- اجرا:
python examples/convert_nunchaku_lite_diffusers.py --checkpoint outputs/checkpoints/svdq-int4_r32-flux-2-klein-4b.safetensors --model-id black-forest-labs/FLUX.2-klein-4B --bnb4-text-encoder text_encoder --compute-dtype bfloat16 --output-dir outputs/diffusers/FLUX.2-klein-4B-nunchaku-lite-int4-bnb4-text-encoder
مرحله ۴: تأیید (Verification)
- بارگذاری از طریق
DiffusionPipeline.from_pretrained()برای تأیید کیفیت تصاویر (مثلاً: "یک ربات شیشهای در گلخانه، نورپردازی سینمایی"). - ارسال به هاب:
pipe.push_to_hub("your-name/your-model-nunchaku-lite-int4").

برای کاربرانی که به دنبال حداکثر سرعت هستند، Nunchaku از «بازنویسیهای ساختاری» (Structural Rewrites) پشتیبانی میکند که فراتر از مسیر عمومی است. مسیر عمومی فرض میکند معماری ثابت میماند، اما موتور اصلی Nunchaku گروههایی از لایهها را به ماژولهای ادغامشده تبدیل میکند.
به عنوان مثال، FLUX.1-dev سه ماژول مجزا را تعریف میکند: self.to_q ،self.to_k و self.to_v. Nunchaku اینها را با استفاده از fuse_linears() در یک ماژول کوانتیده واحد به نام to_qkv ترکیب میکند. این کار ضروری است زیرا اپراتور ادغامشده Nunchaku، تصویر QKV، نرمالسازی Q/K و رمزگذاریهای دورانی (Rotary Embeddings) را همگی در یک مرحله مصرف میکند.
در مسیر پیشفرض Diffusers، اجرا تکهتکه است:
۱. تصویر جداگانه توسط to_q ،to_k و to_v.
۲. باز کردن (Unflattening) به صورت سرها (Heads).
۳. نرمالسازی توسط norm_q و norm_k.
۴. اعمال رمزگذاریهای دورانی.
در مقابل، مسیر Nunchaku از fused_qkv_norm_rottary() برای پردازش حالتهای پنهان، تصویر to_qkv و ماژولهای نرمالسازی و رمزگذاریهای دورانی در یک کرنل واحد استفاده میکند.
این بازنویسیهای ساختاری از طریق یک پیکربندی هدف مدل-محور در زمان کوانتش و یک آداپتور زمان اجرا در هنگام بارگذاری (مانند موارد ارائه شده توسط rootonchair/nunchaku-lite) مدیریت میشوند. این به سیستم اجازه میدهد سه ماژول مقصد را با الحاق آنها در امتداد بُعد خروجی به ترتیب Q، K، V در یک ماژول گروهی نگاشت کند. اسکریپت کوانتش FLUX.2 Klein 4B یک نمونه عینی از پیکربندی هدف برای این فرآیند ارائه میدهد.
این تغییر رویکرد، کوانتش را از یک «حالت سازگاری» — که هدفش فقط جا شدن مدل در VRAM بود — به یک «حالت شتابدهنده» تبدیل میکند. با کوانتش فعالسازها، Nunchaku Lite دقیقاً گلوگاه محاسباتی واقعی مدلهای انتشار را هدف قرار داده است.
برای توسعهدهندگان معمولی، این موضوع اصطکاک مربوط به کامپایل سفارشی CUDA را حذف میکند. اکنون میتوان یک مدل ۴ بیتی را از طریق from_pretrained() بارگذاری کرد و فوراً سرعت بیشتری را مشاهده نمود. این کار بهطور مؤثر مانع سختافزاری برای اجرای ترنسفورمرهای پیشرفتهای مانند FLUX روی GPUهای ۱۶ تا ۲۴ گیگابایتی را پایین میآورد.
مثالی از یک خط لوله، یک ترنسفورمر Nunchaku NVFP4 را با یک رمزگذار متنی bitsandbytes NF4 جفت میکند تا یک تصویر ۱۰۲۴ در ۱۰۲۴ را در ۱.۷ ثانیه روی یک RTX 5090 با ۱۲ گیگابایت پیک حافظه تولید کند (در حالی که برای BF16 نیاز به ۲۴ گیگابایت بود).
اگرچه Nunchaku Lite به دلیل فقدان برخی کرنلهای ادغامشده خاص معماری، کمی کندتر از موتور کامل Nunchaku است، اما پیادهسازی پایه آن همچنان حدود ۳۰٪ سرعت را افزایش میدهد در حالی که همان سطح کاهش VRAM را حفظ میکند. سربار باقیمانده عمدتاً ناشی از فراخوانیهای اضافی کرنل است که torch.compile میتواند آن را کاهش دهد.
کاربران میتوانند با چکپوینتهای آماده در هاب شروع کنند، از جمله:
rootonchair/ERNIE-Image-Turbo-nunchaku-lite-int4-bnb4-text-encoder(INT4)rootonchair/ERNIE-Image-Turbo-nunchaku-lite-nvfp4-bnb4-text-encoder(NVFP4)OzzyGT/Krea_2_Turbo_nunchaku_lite_nvfp4(NVFP4)- و مجموعههای مختلف از
lite-infer.
گام بعدی شما
- اگر کاربر کارتهای سری RTX 40 یا 50 هستید، مدلهای آماده در هاب (مانند نسخههای
rootonchair) را برای تست سرعت امتحان کنید. - برای کاهش بیشتر VRAM، از ترکیب Nunchaku Lite با رمزگذارهای متنی NF4 استفاده کنید.
- توسعهدهندگان مدلهای بازمتن را توصیه میکنیم ابزار
diffuse-compressorرا برای بهینهسازی مدلهای خود بررسی کنند.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو