Transformers documentation
SINQ
SINQ
التكميم المعيار بواسطة سينكهورن (SINQ) هي تقنية تكميم سريعة، قابلة للتطبيق الفوري، وغير مرتبطة بنموذج محدد، توفر أداءً متقدماً على مستوى الحالة الفنية لنماذج اللغة الكبيرة دون المساس بالدقة.
🔍 ما ستجده هنا
📊 مقارنة الميزات: SINQ مقابل HQQ (بدون معايرة) و A-SINQ مقابل AWQ (مع معايرة)
| ميزة | SINQ | HQQ | A-SINQ | AWQ |
|---|---|---|---|---|
| 🎯 المعايرة | بدون معايرة | بدون معايرة | معايرة | معايرة |
| 🧮 نوع التكميم | متماثل وغير متماثل | غير متماثل فقط | متماثل وغير متماثل | متماثل وغير متماثل |
| 📦 دعم NF4 | نعم | لا | نعم | لا |
| ⚡ سرعة التكميم | أسرع بمرتين تقريبًا من HQQ | أبطأ | أسرع 4 أضعاف تقريبًا من AWQ | أبطأ |
| 📈 جودة النموذج | أعلى | أدنى | أعلى | أدنى |
📄 هل تريد معرفة المزيد؟
1. قم بتكميم أي نموذج LLM باستخدام SINQ
الإعداد والبدء السريع
أولاً، ثبّت الحزمة. يمكن القيام بذلك بطريقتين:
- من المصدر باستخدام مستودع Github الرسمي SINQ [موصى به]
- باستخدام حزمة pip:
pip install sinq
الكمّية في بضعة أسطر
تكميم أي نموذج من نماذج 🤗 Hugging Face باستخدام SINQ أمرٌ بسيط ولا يستغرق سوى بضع سطور من الكود. أولاً، أنشئ SinqConfig وحدد المعاملات التالية:
| علم | الوصف | النوع | خيارات | افتراضي |
|---|---|---|---|---|
--nbits | عرض البتات لاختزال الأوزان | int | 2, 3, 4, 5, 6, 8 | 4 |
--tiling_mode | استراتيجية تقطيع مصفوفة الأوزان | str | 1D, 2D | 1D |
--group_size | عدد الأوزان لكل مجموعة تكميم | int | 64, 128 | 64 |
--method | طريقة التكميم | str | sinq, asinq | sinq |
--modules_to_not_convert | قائمة بالطبقات التي لا يتم تكميمها | قائمة من str | [lm_head, …] | [lm_head] |
ثم حدد النموذج الذي تريد تكميمه ومرّر SinqConfig كخيار لإعدادات التكميم
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, SinqConfig
model_name = "Qwen/Qwen3-1.7B"
cfg = SinqConfig(
nbits=4,
group_size=64,
tiling_mode="1D",
method="sinq",
modules_to_not_convert=["lm_head"]
)
tok = AutoTokenizer.from_pretrained(model_name)
qmodel = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=cfg,
dtype=torch.bfloat16
)
✅ هذا كل شيء. تم الآن تكميم نموذجك باستخدام SINQ وهو جاهز للاستدلال أو الحفظ.
اطّلع على مستودع SINQ الرسمي على GitHub للاطلاع على آخر التحديثات!
الحفظ وإعادة التحميل
إذا كنت ترغب في إعادة استخدام نموذج مُكمَّم لاحقًا، فاحفظه على القرص أو ارفعه على HuggingFace Hub ثم أعد تحميله دون الحاجة إلى أوزان FP الأساسية. إذا قمت بتثبيت SINQ من المصدر، فيجب عليك استدعاء دالة patch_hf_pretrained_io عند إعادة تحميل نموذج مُكمَّم:
# Save sinq quantized model
model.save_pretrained("/path/to/save/qwen3-1.7B-sinq-4bit")
model.push_to_hub("HF_Hub_username/qwen3-1.7B-sinq-4bit")
tokenizer.push_to_hub("HF_Hub_username/qwen3-1.7B-sinq-4bit")from sinq.hf_io import patch_hf_pretrained_io
patch_hf_pretrained_io()
# Reload a sinq quantized model
hf_hub_model = "HF_Hub_username/qwen3-1.7B-sinq-4bit"
tokenizer = AutoTokenizer.from_pretrained(hf_hub_model)
model = AutoModelForCausalLM.from_pretrained(hf_hub_model)وإلا، إذا قمت بتثبيت SINQ عبر pip، يمكنك ببساطة استخدام الدوال المدمجة في HF:
# --- Save to a folder (sharded safetensors) ---
# 'model' must already be SINQ-quantized
# Locally save
qmodel.save_pretrained("/path/to/save/qwen3-1.7B-sinq-4bit")
# Push to the Hub
qmodel.push_to_hub("HF_Hub_username/qwen3-1.7B-sinq-4bit")
tok.push_to_hub("HF_Hub_username/qwen3-1.7B-sinq-4bit")
# --- Reload later--
save_dir = "/path/to/save/qwen3-1.7B-sinq-4bit"
hf_hub_model = "HF_Hub_username/qwen3-1.7B-sinq-4bit"
# From local directory
tok = AutoTokenizer.from_pretrained(save_dir)
qmodel = AutoModelForCausalLM.from_pretrained(save_dir)
# From HF Hub
tok = AutoTokenizer.from_pretrained(hf_hub_model)
qmodel = AutoModelForCausalLM.from_pretrained(hf_hub_model)
✅ تم تحميل نموذجك الآن وهو جاهز للاستدلال!
ملاحظة: إذا تم تكميم النموذج بدقة 4 بت وتم تثبيت مكتبة
gemlite، فسيتم استخدام نواة gemlite الأسرع لتشغيل الاستدلال.
متوافق مع إطار عمل lm-eval للتقييم
فيما يلي مثال مبسط يوضح كيفية تقييم نموذج مُكمَّم باستخدام SINQ على مجموعة بيانات مرجعية:
import torch
from lm_eval import evaluator
from lm_eval.models.huggingface import HFLM
device = torch.accelerator.current_accelerator().type if torch.accelerator.is_available() else "cpu"
# Wrap the already quantized model and tokenizer with HFLM
lm = HFLM(pretrained=qmodel, tokenizer=tok, device=device)
# Evaluate (many tasks available on lm-eval such as MMLU and HellaSwag)
results = evaluator.simple_evaluate(
model=lm,
tasks=["wikitext"], # small and fast benchmark
device=device
)2. كيفية الاستشهاد بهذا العمل
إذا وجدت أن SINQ مفيد في أبحاثك أو تطبيقاتك
@misc{muller2025sinq,
title={SINQ: Sinkhorn-Normalized Quantization for Calibration-Free Low-Precision LLM Weights},
author={Lorenz K. Muller and Philippe Bich and Jiawei Zhuang and Ahmet Celik and Luca Benfenati and Lukas Cavigelli},
year={2025},
eprint={2509.22944},
archivePrefix={arXiv},
primaryClass={cs.LG},
url={http://arxiv.org/abs/2509.22944}
}3. القيود الحالية
حالياً، لا يدعم Hugging Face طريقة A-SINQ. يُرجى الرجوع إلى مستودع SINQ الرسمي لاختزال نموذج باستخدام هذه الاستراتيجية. في الوقت الحالي، لا تدعم استراتيجية اختزال SINQ والنماذج المختزلة باستخدام SINQ خيار Multi-GPU، لذا إذا كان نظامك يحتوي على وحدات معالجة رسومية متعددة، يرجى تحديد الوحدة التي يجب استخدامها.
Update on GitHub