Transformers documentation

SINQ

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
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

Quantização Normalizada por Sinkhorn (SINQ) é uma técnica de quantização rápida, plug-and-play e agnóstica ao modelo, que oferece desempenho de estado da arte para Modelos de Linguagem de Grande Escala sem sacrificar a precisão.

🔍 O que você encontrará aqui

📊 Comparativo de recursos: SINQ vs HQQ (sem calibração) e A-SINQ vs AWQ (com calibração)

RecursoSINQHQQA-SINQAWQ
🎯 CalibraçãoSem calibraçãoSem calibraçãoCalibradoCalibrado
🧮 Tipo de quantizaçãoSimétrico & AssimétricoSomente assimétricoSimétrico & AssimétricoSimétrico & Assimétrico
📦 Suporte a NF4SimNãoSimNão
⚡ Velocidade de quantização~2× mais rápido que HQQMais lento~4× mais rápido que AWQMais lento
📈 Qualidade do ModeloSuperiorMenorSuperiorMenor

📄 Quer saber mais?

  • Leia nosso artigo no arXiv
  • Verifique o repositório oficial do SINQ no github

1. Quantize qualquer LLM com SINQ

Configuração e Início Rápido

Primeiro, instale o pacote. Isso pode ser feito de duas maneiras:

  • A partir do código-fonte usando o repositório oficial do Github SINQ [Recomendado]
  • Usando o pacote pip:
pip install sinq

Quantize em poucas linhas

Quantizar qualquer modelo do 🤗 Hugging Face com SINQ é simples e requer apenas algumas linhas de código. Primeiro, crie um SinqConfig e especifique os seguintes parâmetros:

FlagDescriçãoTipoOpçõesPadrão
--nbitsLargura de bits para quantização de pesosint2, 3, 4, 5, 6, 84
--tiling_modeEstratégia de tiling da matriz de pesosstr1D, 2D1D
--group_sizePesos por grupo de quantizaçãoint64, 12864
--methodMétodo de quantizaçãostrsíncrono, assíncronosinq
--modules_to_not_convertLista das camadas que NÃO são quantizadasLista de str[lm_head, …][lm_head]

Em seguida, especifique o modelo que deseja quantizar e passe o SinqConfig como opção de configuração de quantização

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
)

✅ É isso. Seu modelo agora está quantizado com SINQ e pronto para inferência ou salvamento.

Consulte nosso repositório oficial no GitHub SINQ para se manter atualizado!


Salvar e recarregar

Se você deseja reutilizar um modelo quantizado posteriormente, salve-o em disco ou envie-o para o HuggingFace Hub e recarregue-o sem precisar dos pesos base em FP. Se você instalou o SINQ a partir do código-fonte, deve chamar a função patch_hf_pretrained_io ao recarregar um modelo quantizado:

# 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)

Caso contrário, se você instalou o SINQ por meio do pip, pode simplesmente usar as funções embutidas do 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)

✅ Seu modelo agora está carregado e pronto para inferência!

Observação: se o modelo tiver sido quantizado em 4 bits e a biblioteca gemlite estiver instalada, o kernel mais rápido do gemlite é usado para executar a inferência.


Compatível com o framework de avaliação lm-eval

Abaixo está um exemplo mínimo mostrando como avaliar um modelo quantizado com SINQ em um conjunto de dados de referência:

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. Como citar este trabalho

Se você encontrar o SINQ útil em suas pesquisas ou aplicações

  • Apoie nosso projeto dando uma estrela ⭐️ no repositório do github SINQ
  • Por favor, cite nosso artigo:
@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. Limitações atuais

Atualmente, o método A-SINQ não é suportado no Hugging Face. Consulte o repositório oficial SINQ para quantizar um modelo com essa estratégia. No momento, a estratégia de quantização SINQ e os modelos quantizados com SINQ não suportam a opção Multi-GPU, portanto, se o seu sistema possui múltiplas GPUs, especifique qual delas deve ser utilizada.

Update on GitHub