# SINQ

[Sinkhorn-Normalized Quantization (SINQ)](https://github.com/huawei-csl/SINQ/tree/main)は、精度を犠牲にすることなく、大規模言語モデルに対して最先端の性能を実現する、高速でプラグアンドプレイ、モデル非依存の量子化手法です。

### 🔍 ここにあるもの

- [1. SINQで任意のLLMを量子化（および保存）する](#1-quantize-any-llm-with-sinq)
- [2. 本研究成果の引用方法](#2-how-to-cite-this-work)
- [3. 現在の制限事項](#3-current-limitations)

#### 📊 機能比較: SINQ vs HQQ _(キャリブレーション不要)_ および A-SINQ vs AWQ _(キャリブレーション済み)_

| 機能 | **SINQ** | **HQQ** | **A-SINQ** | **AWQ** |
|------------|:--------:|:--------:|:----------:|:-------:|
| 🎯 較正 | キャリブレーション不要 | キャリブレーション不要 |  キャリブレーション済み | キャリブレーション済み |
| 🧮 量子化タイプ | 対称と非対称 | 非対称のみ | 対称と非対称 | 対称と非対称 |
| 📦 NF4 対応 | **はい** | いいえ | **はい** | いいえ |
| ⚡ 量子化の速度 | HQQより**約2倍高速** | 遅い | AWQより**約4倍高速** | 遅い |
| 📈 モデルの品質 | **より高い** | 下 | **より高い** | 下 |

📄 **さらに詳しく知りたいですか？**
- [**arXiv**](http://arxiv.org/abs/2509.22944) に掲載されている論文をご覧ください。
- 公式の[**SINQ**](https://github.com/huawei-csl/SINQ/tree/main) GitHub リポジトリを確認してください

--- 

## 1. SINQで任意のLLMを量子化

### セットアップとクイックスタート

まず、パッケージをインストールします。インストールには2つの方法があります。
- 公式のGithubリポジトリ [**SINQ**](https://github.com/huawei-csl/SINQ/tree/main) からソースとしてインストールする **[推奨]**
- pip パッケージを使用する場合:
```bash
pip install sinq
```

---

### 数行で量子化

SINQによる🤗 Hugging Faceモデルの量子化は簡単で、わずか数行のコードで完了します。まず、[SinqConfig](/docs/transformers/main/ja/main_classes/quantization#transformers.SinqConfig)を作成し、以下のパラメータを指定します。

| フラグ | 説明 | 型 | オプション | デフォルト |
|------|-------------|---------|---------|----------|
| `--nbits` | 重みの量子化に使用するビット幅 | int | 2, 3, 4, 5, 6, 8 | 4 |
| `--tiling_mode` | 重み行列のタイル化戦略 | str | 1D, 2D | 1D |
| `--group_size` | 量子化グループごとの重み | int | 64, 128 | 64 |
| `--method` | 量子化手法 | str | sinq, asinq | sinq |
| `--modules_to_not_convert` | 量子化されないレイヤーのリスト | str のリスト | [lm_head, ...] | [lm_head] |

次に、量子化したいモデルを指定し、SinqConfigを量子化設定オプションとして渡します。

```python
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**](https://github.com/huawei-csl/SINQ/tree/main) GitHubリポジトリをご覧ください!

---

### 保存と再読み込み

後で量子化モデルを再利用する場合は、ディスクに保存するかHuggingFace Hubにプッシュし、ベースのFP重みなしで再読み込みできます。SINQをソースからインストールした場合は、量子化モデルを再読み込みする際に*patch_hf_pretrained_io*関数を呼び出す必要があります。
```python
# 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")
```
```python
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)
```
それ以外の場合、pip 経由で SINQ をインストールした場合は、HF の組み込み関数をそのまま使用できます。

```python
# --- 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`](https://github.com/EleutherAI/lm-evaluation-harness)評価フレームワークと互換性あり

以下は、ベンチマークデータセット上でSINQ量子化モデルを評価する方法を示す最小限の例です。

```python
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**](https://github.com/huawei-csl/SINQ/tree/main)のGitHubリポジトリにスター⭐️を付けて、プロジェクトを応援してください。
- 論文を引用してください:

```bibtex
@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. 現在の制限

現在、Hugging Face では A-SINQ メソッドはサポートされていません。この戦略でモデルを量子化するには、公式の [SINQ リポジトリ](https://github.com/huawei-csl/SINQ/tree/main) を参照してください。現時点で、SINQ 量子化戦略および SINQ 量子化モデルは Multi-GPU オプションをサポートしていないため、システムに複数の GPU がある場合は、使用する GPU を指定してください。

