# HQQ

[Half-Quadratic Quantization (HQQ)](https://github.com/mobiusml/hqq/) поддерживает быструю квантизацию «на лету» для 8, 4, 3, 2 и даже 1 бита. Для этого не требуются данные калибровки, а метод совместим с моделями любого типа (LLM, vision и т. д.).

HQQ также поддерживает дообучение с [PEFT](https://huggingface.co/docs/peft) и полностью совместим с [torch.compile](https://pytorch.org/tutorials/intermediate/torch_compile_tutorial.html) для ещё более быстрого вывода и обучения.

Установите HQQ следующей командой, чтобы получить последнюю версию и собрать соответствующие CUDA-ядра, если вы используете устройство cuda. Также поддерживается Intel XPU с чистой реализацией на PyTorch.

```bash
pip install hqq
```

Вы можете либо заменить все линейные слои в модели на один и тот же конфигурационный файл квантования, либо назначить конкретный конфигурационный файл квантования для конкретных линейных слоев.

Квантуйте модель, создав [HqqConfig](/docs/transformers/main/ru/main_classes/quantization#transformers.HqqConfig) и указав `nbits` и `group_size` для замены всех линейных слоёв ([torch.nn.Linear](https://pytorch.org/docs/stable/generated/torch.nn.Linear.html)) модели.

``` py
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, HqqConfig

quant_config = HqqConfig(nbits=8, group_size=64)
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8B", 
    dtype=torch.float16, 
    device_map="auto", 
    quantization_config=quant_config
)
```

Квантуйте модель, создав словарь, в котором указаны `nbits` и `group_size` для линейных слоёв, подлежащих квантованию. Передайте их в [HqqConfig](/docs/transformers/main/ru/main_classes/quantization#transformers.HqqConfig) и с помощью конфигурации укажите, какие слои квантовать. Этот подход особенно полезен для квантования моделей с механизмом mixture-of-experts (MoE), поскольку они меньше страдают от более низких настроек квантования.

``` py
q4_config = {'nbits':4, 'group_size':64}
q3_config = {'nbits':3, 'group_size':32}
quant_config  = HqqConfig(dynamic_config={
  'self_attn.q_proj':q4_config,
  'self_attn.k_proj':q4_config,
  'self_attn.v_proj':q4_config,
  'self_attn.o_proj':q4_config,

  'mlp.gate_proj':q3_config,
  'mlp.up_proj'  :q3_config,
  'mlp.down_proj':q3_config,
})

model = transformers.AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8B", 
    dtype=torch.float16, 
    device_map="auto", 
    quantization_config=quant_config
)
```

## Бэкенды

HQQ поддерживает различные бэкенды, включая чистый PyTorch и собственные CUDA-ядра для деквантования. Эти бэкенды подходят для старых GPU и обучения PEFT/QLoRA.

```py
from hqq.core.quantize import *

HQQLinear.set_backend(HQQBackend.PYTORCH)
```

Для более быстрого вывода HQQ поддерживает 4-битные объединённые ядра (torchao и Marlin) после квантования модели. Они позволяют достигать до 200 токенов/сек на одном 4090. Пример ниже демонстрирует, как включить бэкенд torchao_int4.

```py
from hqq.utils.patching import prepare_for_inference

prepare_for_inference("model", backend="torchao_int4")
```

См. руководство [Backend](https://github.com/mobiusml/hqq/#backend) для получения подробной информации.

## Ресурсы

Подробнее о HQQ читайте в блоге [Half-Quadratic Quantization of Large Machine Learning Models](https://mobiusml.github.io/hqq_blog/).

