mcpField
H
hqq-quantization

hqq-quantization

github.com/kalarislabs開発9657 回インストール3 日前に更新
リポジトリ

hqq-quantization について

HQQは、モデルの重みを校正データなしで8ビットから1ビットまで量子化するライブラリとガイドです。推論や微調整向けにモデルを圧縮する開発者を対象に、精度設定と複数の最適化バックエンドを提供します。

主な機能

  1. 01校正データなしで量子化
  2. 028、4、3、2、1ビットの重み設定
  3. 03複数の推論バックエンド
  4. 04HuggingFace TransformersとvLLMとの連携
  5. 05LoRA/PEFTによる量子化モデルの微調整
  6. 06レイヤー種別ごとの混合精度設定

活用シーン

  1. 01校正用サンプルを用意せずにモデルを圧縮
  2. 02vLLMで量子化モデルを提供
  3. 03LoRAを使った量子化モデルの微調整
  4. 04量子化推論のバックエンド比較

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/kalarislabs/research-agent-skills --skill hqq-quantization

インストール後、Claude Code で/hqq-quantizationを入力して読み込まれたか確認します。

同梱ファイルreferences/advanced-usage.mdreferences/troubleshooting.md

詳細

HQQ - Half-Quadratic Quantization

複数の最適化されたバックエンドに対応した、高速でキャリブレーション不要の重み量子化です。8/4/3/2/1ビットの精度をサポートします。

HQQ を使う場面

次の場合は HQQ を使ってください:

  • キャリブレーションデータなしでモデルを量子化する(データセットは不要です)
  • 高速な量子化が必要(GPTQ/AWQ の数時間に対して数分)
  • vLLM または HuggingFace Transformers でデプロイする
  • LoRA/PEFT を使って量子化モデルをファインチューニングする
  • 極端な量子化(2ビット、1ビット)を試す

主な利点:

  • キャリブレーション不要:サンプルデータなしで、あらゆるモデルをすぐに量子化できます
  • 複数のバックエンド:最適化された推論向けに PyTorch、ATEN、TorchAO、Marlin、BitBlas を利用できます
  • 柔軟な精度:設定可能なグループサイズで、8/4/3/2/1ビットに対応します
  • フレームワーク連携:HuggingFace と vLLM をネイティブにサポートします
  • PEFT 互換:LoRA を使って量子化モデルをファインチューニングできます

代わりに次の選択肢を使ってください:

  • AWQ:キャリブレーションベースの精度や、本番環境でのサービングが必要な場合
  • GPTQ:キャリブレーションデータを利用でき、最大限の精度が必要な場合
  • bitsandbytes:カスタムバックエンドを使わず、シンプルに8ビット/4ビット化する場合
  • llama.cpp/GGUF:CPU 推論や Apple Silicon へのデプロイの場合

クイックスタート

インストール
pip install hqq

# With specific backend
pip install hqq[torch]      # PyTorch backend
pip install hqq[torchao]    # TorchAO int4 backend
pip install hqq[bitblas]    # BitBlas backend
pip install hqq[marlin]     # Marlin backend
基本的な量子化
from hqq.core.quantize import BaseQuantizeConfig, HQQLinear
import torch.nn as nn

# Configure quantization
config = BaseQuantizeConfig(
    nbits=4,           # 4-bit quantization
    group_size=64,     # Group size for quantization
    axis=1             # Quantize along output dimension
)

# Quantize a linear layer
linear = nn.Linear(4096, 4096)
hqq_linear = HQQLinear(linear, config)

# Use normally
output = hqq_linear(input_tensor)
HuggingFace でモデル全体を量子化する
from transformers import AutoModelForCausalLM, HqqConfig

# Configure HQQ
quantization_config = HqqConfig(
    nbits=4,
    group_size=64,
    axis=1
)

# Load and quantize
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8B",
    quantization_config=quantization_config,
    device_map="auto"
)

# Model is quantized and ready to use

基本概念

量子化の設定

HQQ では BaseQuantizeConfig を使って量子化パラメーターを定義します。

from hqq.core.quantize import BaseQuantizeConfig

# Standard 4-bit config
config_4bit = BaseQuantizeConfig(
    nbits=4,           # Bits per weight (1-8)
    group_size=64,     # Weights per quantization group
    axis=1             # 0=input dim, 1=output dim
)

# Aggressive 2-bit config
config_2bit = BaseQuantizeConfig(
    nbits=2,
    group_size=16,     # Smaller groups for low-bit
    axis=1
)

# Mixed precision per layer type
layer_configs = {
    "self_attn.q_proj": BaseQuantizeConfig(nbits=4, group_size=64),
    "self_attn.k_proj": BaseQuantizeConfig(nbits=4, group_size=64),
    "self_attn.v_proj": BaseQuantizeConfig(nbits=4, group_size=64),
    "mlp.gate_proj": BaseQuantizeConfig(nbits=2, group_size=32),
    "mlp.up_proj": BaseQuantizeConfig(nbits=2, group_size=32),
    "mlp.down_proj": BaseQuantizeConfig(nbits=4, group_size=64),
}
HQQLinear レイヤー

nn.Linear を置き換える、量子化の中核となるレイヤーです。

from hqq.core.quantize import HQQLinear
import torch

# Create quantized layer
linear = torch.nn.Linear(4096, 4096)
hqq_layer = HQQLinear(linear, config)

# Access quantized weights
W_q = hqq_layer.W_q           # Quantized weights
scale = hqq_layer.scale       # Scale factors
zero = hqq_layer.zero         # Zero points

# Dequantize for inspection
W_dequant = hqq_layer.dequantize()
バックエンド

HQQ は、さまざまなハードウェア向けに複数の推論バックエンドをサポートしています。

from hqq.core.quantize import HQQLinear

# Available backends
backends = [
    "pytorch",          # Pure PyTorch (default)
    "pytorch_compile",  # torch.compile optimized
    "aten",            # Custom CUDA kernels
    "torchao_int4",    # TorchAO int4 matmul
    "gemlite",         # GemLite CUDA kernels
    "bitblas",         # BitBlas optimized
    "marlin",          # Marlin 4-bit kernels
]

# Set backend globally
HQQLinear.set_backend("torchao_int4")

# Or per layer
hqq_layer.set_backend("marlin")

バックエンドの選択ガイド:

バックエンド最適な用途要件
pytorch互換性任意の GPU
pytorch_compile中程度の高速化torch>=2.0
atenバランスの良さCUDA GPU
torchao_int44ビット推論torchao のインストール
marlin4ビットで最高速度Ampere 以降の GPU
bitblas柔軟なビット幅bitblas のインストール

HuggingFace 連携

量子化済みモデルを読み込む
from transformers import AutoModelForCausalLM, AutoTokenizer

# Load HQQ-quantized model from Hub
model = AutoModelForCausalLM.from_pretrained(
    "mobiuslabsgmbh/Llama-3.1-8B-HQQ-4bit",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B")

# Use normally
inputs = tokenizer("Hello, world!", return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=50)
量子化して保存する
from transformers import AutoModelForCausalLM, HqqConfig

# Quantize
config = HqqConfig(nbits=4, group_size=64)
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8B",
    quantization_config=config,
    device_map="auto"
)

# Save quantized model
model.save_pretrained("./llama-8b-hqq-4bit")

# Push to Hub
model.push_to_hub("my-org/Llama-3.1-8B-HQQ-4bit")
混合精度量子化
from transformers import AutoModelForCausalLM, HqqConfig

# Different precision per layer type
config = HqqConfig(
    nbits=4,
    group_size=64,
    # Attention layers: higher precision
    # MLP layers: lower precision for memory savings
    dynamic_config={
        "attn": {"nbits": 4, "group_size": 64},
        "mlp": {"nbits": 2, "group_size": 32}
    }
)

vLLM 連携

vLLM で HQQ モデルをサーブする
from vllm import LLM, SamplingParams

# Load HQQ-quantized model
llm = LLM(
    model="mobiuslabsgmbh/Llama-3.1-8B-HQQ-4bit",
    quantization="hqq",
    dtype="float16"
)

# Generate
sampling_params = SamplingParams(temperature=0.7, max_tokens=100)
outputs = llm.generate(["What is machine learning?"], sampling_params)
カスタム HQQ 設定で vLLM を使う
from vllm import LLM

llm = LLM(
    model="meta-llama/Llama-3.1-8B",
    quantization="hqq",
    quantization_config={
        "nbits": 4,
        "group_size": 64
    }
)

PEFT/LoRA によるファインチューニング

量子化モデルをファインチューニングする
from transformers import AutoModelForCausalLM, HqqConfig
from peft import LoraConfig, get_peft_model

# Load quantized model
quant_config = HqqConfig(nbits=4, group_size=64)
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8B",
    quantization_config=quant_config,
    device_map="auto"
)

# Apply LoRA
lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

model = get_peft_model(model, lora_config)

# Train normally with Trainer or custom loop
QLoRA 方式のトレーニング
from transformers import TrainingArguments, Trainer

training_args = TrainingArguments(
    output_dir="./hqq-lora-output",
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,
    learning_rate=2e-4,
    num_train_epochs=3,
    fp16=True,
    logging_steps=10,
    save_strategy="epoch"
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    data_collator=data_collator
)

trainer.train()

量子化のワークフロー

ワークフロー 1:モデルをすばやく圧縮する
from transformers import AutoModelForCausalLM, AutoTokenizer, HqqConfig

# 1. Configure quantization
config = HqqConfig(nbits=4, group_size=64)

# 2. Load and quantize (no calibration needed!)
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8B",
    quantization_config=config,
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B")

# 3. Verify quality
prompt = "The capital of France is"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=20)
print(tokenizer.decode(outputs[0]))

# 4. Save
model.save_pretrained("./llama-8b-hqq")
tokenizer.save_pretrained("./llama-8b-hqq")
ワークフロー 2:推論速度を最適化する
from hqq.core.quantize import HQQLinear
from transformers import AutoModelForCausalLM, HqqConfig

# 1. Quantize with optimal backend
config = HqqConfig(nbits=4, group_size=64)
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8B",
    quantization_config=config,
    device_map="auto"
)

# 2. Set fast backend
HQQLinear.set_backend("marlin")  # or "torchao_int4"

# 3. Compile for additional speedup
import torch
model = torch.compile(model)

# 4. Benchmark
import time
inputs = tokenizer("Hello", return_tensors="pt").to(model.device)
start = time.time()
for _ in range(10):
    model.generate(**inputs, max_new_tokens=100)
print(f"Avg time: {(time.time() - start) / 10:.2f}s")

ベストプラクティス

  1. まずは4ビットから:ほとんどのモデルで品質とサイズのバランスが最適です
  2. group_size=64 を使う:バランスが良好です。極端な量子化では、より小さい値を使います
  3. バックエンドを適切に選ぶ:4ビットで Ampere 以降なら Marlin、柔軟性を重視するなら TorchAO を使います
  4. 品質を確認する:量子化後は必ず生成品質をテストしてください
  5. 混合精度:アテンションは高い精度に保ち、MLP をより強く圧縮します
  6. PEFT トレーニング:良好なファインチューニング結果を得るには LoRA r=16-32 を使います

よくある問題

量子化中にメモリ不足が発生する場合:

# Quantize layer-by-layer
from hqq.models.hf.base import AutoHQQHFModel

model = AutoHQQHFModel.from_pretrained(
    "meta-llama/Llama-3.1-8B",
    quantization_config=config,
    device_map="sequential"  # Load layers sequentially
)

推論が遅い場合:

# Switch to optimized backend
from hqq.core.quantize import HQQLinear
HQQLinear.set_backend("marlin")  # Requires Ampere+ GPU

# Or compile
model = torch.compile(model, mode="reduce-overhead")

2ビットで品質が低い場合:

# Use smaller group size
config = BaseQuantizeConfig(
    nbits=2,
    group_size=16,  # Smaller groups help at low bits
    axis=1
)

参考資料

リソース

関連スキル

  • gguf-quantization:効率的な CPU/GPU 推論のための GGUF 形式と llama.cpp の量子化。
  • gptq:AutoGPTQ と transformers を使い、グループ単位の量子化(デフォルトのグループサイズは128)で GPTQ により LLM を4ビット(3ビットにも)に量子化します。
  • quantizing-models-bitsandbytes:精度をほとんど損なわずにメモリを50~75%削減できるよう、LLM を8ビットまたは4ビットに量子化します。

コメント