Transformers documentation
SINQ
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)
| Recurso | SINQ | HQQ | A-SINQ | AWQ |
|---|---|---|---|---|
| 🎯 Calibração | Sem calibração | Sem calibração | Calibrado | Calibrado |
| 🧮 Tipo de quantização | Simétrico & Assimétrico | Somente assimétrico | Simétrico & Assimétrico | Simétrico & Assimétrico |
| 📦 Suporte a NF4 | Sim | Não | Sim | Não |
| ⚡ Velocidade de quantização | ~2× mais rápido que HQQ | Mais lento | ~4× mais rápido que AWQ | Mais lento |
| 📈 Qualidade do Modelo | Superior | Menor | Superior | Menor |
📄 Quer saber mais?
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:
| Flag | Descrição | Tipo | Opções | Padrão |
|---|---|---|---|---|
--nbits | Largura de bits para quantização de pesos | int | 2, 3, 4, 5, 6, 8 | 4 |
--tiling_mode | Estratégia de tiling da matriz de pesos | str | 1D, 2D | 1D |
--group_size | Pesos por grupo de quantização | int | 64, 128 | 64 |
--method | Método de quantização | str | síncrono, assíncrono | sinq |
--modules_to_not_convert | Lista das camadas que NÃO são quantizadas | Lista 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
gemliteestiver 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