# Четыре из шести

[Four Over Six](https://github.com/mit-han-lab/fouroversix) — это библиотека для быстрого и точного FP4-квантования, в частности с использованием формата NVFP4 на GPU 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)

Наша реализация работает наиболее эффективно на GPU NVIDIA Blackwell. Тем не менее, вы можете запускать Four Over Six на более старом оборудовании, а также на CPU, без каких-либо изменений в коде, поскольку в этих случаях наш фреймворк автоматически переключается на реализацию, выполняющую симуляцию с использованием матричного умножения в формате FP32.

Чтобы квантовать модель в NVFP4 с 4/6, вы можете загрузить модель следующим образом:

```python
from transformers import AutoModelForCausalLM, FourOverSixConfig

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

Мы поддерживаем множество различных вариантов квантования, которые часто используются при квантовании NVFP4, включая случайное преобразование Хадамарда, масштабирование 2D-блоков, транспонированные входные данные и стохастическое округление, как описано в нашей [препринт-статье](https://arxiv.org/abs/2512.02010). Их можно использовать, задав соответствующий параметр в `FourOverSixConfig`, переданном выше. Отдельным слоям можно назначить собственные параметры квантования, задав `module_config_overrides`, или исключить их из квантования, задав `modules_to_not_convert`, как показано ниже.

## Обучение

Наша квантованная линейная функция содержит реализацию обратного прохода, поэтому многие модели можно продолжать обучать с минимальными изменениями. Убедитесь, что параметр `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
        ],
    ),
)
```

