Transformers documentation

SINQ

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

arXiv License GitHub stars hf-space

SINQ

Sinkhorn-Normalized Quantization (SINQ) — это быстрый, универсальный и не требующий доработок метод квантования, обеспечивающий передовые результаты для больших языковых моделей без потери точности.

🔍 Что вы найдёте здесь

📊 Сравнение возможностей: SINQ и HQQ (без калибровки), а также A-SINQ и AWQ (с калибровкой)

ВозможностьSINQHQQA-SINQAWQ
🎯 КалибровкаБез калибровкиБез калибровкиОткалиброванныйОткалиброванный
🧮 Тип квантованияСимметрические и асимметрическиеТолько асимметричныйСимметрические и асимметрическиеСимметрические и асимметрические
📦 Поддержка NF4ДаНетДаНет
⚡ Скорость квантования~2× быстрее, чем HQQМедленнее~4× Быстрее, чем AWQМедленнее
📈 Качество моделиВышеНижеВышеНиже

📄 Хотите узнать больше?

  • Прочитайте нашу статью на arXiv
  • Проверьте официальный репозиторий SINQ на GitHub

1. Квантование любой LLM с помощью SINQ

Настройка и быстрый старт

Сначала установите пакет. Это можно сделать двумя способами:

  • Из исходного кода с официального репозитория на Github SINQ [Рекомендуется]
  • Использование пакета pip:
pip install sinq

Квантование в несколько строк

Квантование любой модели 🤗 Hugging Face с помощью SINQ — это просто, и для этого требуется всего несколько строк кода. Сначала создайте SinqConfig и укажите следующие параметры:

ФлагОписаниеТипПараметрыПо умолчанию
--nbitsРазрядность для квантования весовint2, 3, 4, 5, 6, 84
--tiling_modeСтратегия тайлинга матрицы весовstr1D, 2D1D
--group_sizeВесов на группу квантованияint64, 12864
--methodМетод квантованияstrsinq, asinqsinq
--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 полезным в своих исследованиях или приложениях

  • Поддержите наш проект, поставив звёздочку ⭐️ в репозитории SINQ на GitHub
  • Пожалуйста, цитируйте нашу статью:
@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. Ограничения

В настоящее время метод A-SINQ не поддерживается в Hugging Face. Для квантования модели с использованием этой стратегии обратитесь к официальному репозиторию SINQ. На данный момент стратегия квантования SINQ и модели, квантованные с её помощью, не поддерживают опцию Multi-GPU, поэтому, если в вашей системе несколько GPU, укажите, какой именно из них следует использовать.

Update on GitHub