# أربعة من ستة

[Four Over Six](https://github.com/mit-han-lab/fouroversix) هي مكتبة لتنفيذ تكميم FP4 بسرعة ودقة، لا سيما باستخدام تنسيق NVFP4 على وحدات معالجة الرسوميات NVIDIA Blackwell. يعتمد منهجنا على تحجيم كتل NVFP4 بشكل تكيفي إلى 4 أو 6 لتقليل خطأ التكميم على القيم القريبة من الحد الأقصى في كل كتلة، كما هو موضح في [ورقتنا المسبقة](https://arxiv.org/abs/2512.02010).

![Four Over Six visual explanation](https://github.com/mit-han-lab/fouroversix/raw/main/assets/four-over-six.png)

يعمل تنفيذنا بكفاءة قصوى على وحدات معالجة الرسوميات NVIDIA Blackwell. ومع ذلك، يمكنك تشغيل Four Over Six على أجهزة أقدم، وحتى على وحدات المعالجة المركزية (CPUs)، دون إجراء أي تغييرات على الكود، ففي هذه الحالات يتراجع إطار عملنا تلقائيًا إلى تنفيذ يعتمد على محاكاة باستخدام ضرب المصفوفات بدقة FP32.

للتكميم نموذج إلى NVFP4 بنسبة 4/6، يمكنك تحميل نموذجك على النحو التالي:

```python
from transformers import AutoModelForCausalLM, FourOverSixConfig

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-8B",
    device_map="auto",
    quantization_config=FourOverSixConfig(),
)
```

ندعم العديد من خيارات التكميم المختلفة التي تُستخدم عادةً أثناء تكميم NVFP4، بما في ذلك تحويل هادامارد العشوائي، وتقييد الكتلة ثنائي الأبعاد، والمدخلات المحوّرة، والتدوير العشوائي، كما هو موضح في [ورقتنا المسبقة](https://arxiv.org/abs/2512.02010). يمكن استخدام هذه الخيارات من خلال ضبط الخيار المناسب في `FourOverSixConfig` المُمرَّر أعلاه. كما يمكن منح طبقات فردية خيارات تكميم مخصصة من خلال ضبط `module_config_overrides`، أو استبعادها من التكميم من خلال ضبط `modules_to_not_convert`، كما هو موضح أدناه.

## التدريب

تحتوي طبقة الخطي المُكمّمة لدينا على تنفيذ لمرحلة الرجوع (backward pass)، مما يتيح تدريب العديد من النماذج بشكل إضافي مع تعديلات قليلة. تأكد من تعيين `keep_master_weights` إلى `True`، ومن استبعاد الطبقات من التكميم عند الحاجة (غالباً ما يكون من المهم إبقاء الطبقات الأخيرة القليلة من الشبكة بدقة عالية):

```python
from transformers import AutoModelForCausalLM, FourOverSixConfig

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-8B",
    device_map="auto",
    quantization_config=FourOverSixConfig(
        keep_master_weights=True,
        modules_to_not_convert=[
            "lm_head",
            "model.layers.34.self_attn.q_proj",
            "model.layers.34.self_attn.k_proj",
            "model.layers.34.self_attn.v_proj",
            # Add more layers here, e.g. self_attn.o_proj, MLP layers
        ],
    ),
)
```

