Marlin GPTQ カーネル(マーリンジーピーティーキューカーネル)
GPTQ INT4量子化×FP16行列乗算に特化したNVIDIA CUDA最適化カーネル。Ampere/Hopper GPUのTensor Coreを活用し、非量子化FP16比で2倍以上のスループットを達成する。
Marlin GPTQ カーネルとは
MarlinはGPTQの著者であるElias Frankle・Mark Kurtz・Dan Alistarh らが2024年に発表した、GPTQ INT4量子化モデル向けのNVIDIA GPU専用推論カーネル。論文タイトルは「MARLIN: Mixed-Precision Auto-Regressive Parallel Inference on Large Language Models」。NVIDIA Ampere(A100・RTX 30xx)・Hopper(H100)アーキテクチャのTensor Coreを最大活用するよう手書きで最適化されたCUDAカーネルで、FP16×FP16比で2〜2.5倍のスループット向上を実現する。
なぜINT4推論は遅かったか
量子化前の期待:
INT4 は FP16 の 1/4 メモリ → VRAM帯域 4倍 → 4倍速になるはず
現実:
GPU は INT4 GEMM カーネルが最適化されていない
→ FP16にデクオンタイズしてからGEMM → VRAM節約のみ、速度は出ない
Marlin は INT4重みを専用フォーマットでTensor Coreに直接投入し、非同期メモリアクセスでデクオンタイズと行列演算をパイプライン実行することでこの問題を解決する。
スループット比較
A100(40GB)・バッチサイズ1・Llama 2 70B:
| カーネル | 形式 | tokens/sec |
|---|---|---|
| cuBLAS FP16 | FP16 | 12 tok/s |
| GPTQ(naive deq) | INT4 | 10 tok/s |
| ExLlamaV2 | INT4 | 25 tok/s |
| Marlin | INT4 | 30 tok/s |
| Marlin (H100) | INT4 | 55+ tok/s |
FP16比で2.5倍のスループット(A100)。
バッチサイズ依存性
| バッチサイズ | FP16 (cuBLAS) | Marlin INT4 | 比率 |
|---|---|---|---|
| 1 | 12 tok/s | 30 tok/s | 2.5× |
| 16 | 170 tok/s | 320 tok/s | 1.9× |
| 64 | 550 tok/s | 720 tok/s | 1.3× |
大バッチでは比率が低下。シングルユーザーのサービング(バッチ1-4)で最も効果が大きい。
vLLM との統合
from vllm import LLM, SamplingParams
llm = LLM(
model="TheBloke/Llama-3-70B-Instruct-GPTQ",
quantization="gptq",
)
sampling_params = SamplingParams(temperature=0.7, max_tokens=256)
outputs = llm.generate(["以下を要約:"], sampling_params)
vLLM v0.4以降でMarlinが自動適用される。
Sparse Marlin(拡張版)
2024年後半に発表された Sparse Marlin は2:4構造的スパース性とINT4量子化を組み合わせる:
- 2:4スパース(NVIDIA Ampere nativeサポート)+ INT4 GPTQ
- FP16比で最大5.3倍のスループット(H100)
よくある質問(FAQ)
Q1: RTX 30xx/40xx でも Marlin は使える? A: RTX 3090(Ampere)以降は対応。RTX 4090(16GB帯域)では効果的。
Q2: Marlin を使うために特別な設定は必要?
A: vLLM 0.4以降なら quantization="gptq" 指定だけでMarlinが自動的に選択される(対応GPUの場合)。
Q3: INT8量子化(LLM.int8())との比較は? A: Marlin INT4は精度(INT4)が低い代わりにスループットが大きく上。精度重視ならINT8だが、VRAM効率はINT4の方が有利。実用では4bit量子化の精度劣化は通常1%未満のため、Marlin INT4が主流。