GPTQとは?再学習なしでLLMを低ビット量子化し推論メモリを削減する技術

GPTQは、学習済みLLMの重みを再学習せず3〜4bitへ圧縮し、精度低下を抑えながら推論メモリと遅延を削減する後学習量子化手法です。仕組み、実験結果、実装時の注意点を解説します。

参考文献

GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers

Elias Frantar, Saleh Ashkboos, Torsten Hoefler, Dan Alistarh

論文を見る

今回の論文

今回取り上げるのは、Elias Frantarらの「GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers」です。2022年にarXivで公開され、ICLR 2023で発表されました。公開元はarXiv、URLは https://arxiv.org/abs/2210.17323 、研究分野はLLMの推論最適化・後学習量子化です。

選んだ理由は、LLMを運用するときの最も現実的な制約であるGPUメモリを、モデルの再学習なしで下げる方法を具体化した論文だからです。GPTQは単に重みを丸めるのではなく、丸め誤差が層の出力へ与える影響を入力データから見積もり、残りの重みで補償します。既存モデルを自前GPUや小さな推論基盤へ載せる際の、量子化方式を選ぶ基礎になります。

どんな技術か

GPTQは、学習済みTransformerの重みだけを、再学習せずに3bitまたは4bitへ変換する後学習量子化(PTQ)です。少数のキャリブレーション入力をモデルへ流し、各線形層で「丸めたあとも元の層出力に近くなる」ように重みを順番に量子化します。

重要なのは、ある重みを低ビット化して生じた誤差を、まだ量子化していない重みの小さな更新で打ち消す点です。重みを独立に最近傍へ丸めるRTN(round-to-nearest)より精度を保ちつつ、巨大モデルでも数時間で処理できるよう、二次情報の計算を共有・バッチ化しています。

課題

大規模LLMは重みの保持だけでGPUメモリを大きく消費します。例えば論文時点のOPT-175BはFP16で約326GBであり、単一GPUには収まりません。複数GPUへ分割すれば動かせますが、機材費、通信、運用の複雑さが増えます。

  • 単純な8bitや4bitの丸めは高速ですが、3〜4bitでは一部の重みの誤差が層出力に累積し、言語モデルのperplexityを大きく悪化させます。
  • 精度を重視する従来の量子化は、各重みを選択しながら逐次最適化するため、数十億〜千億パラメータへは計算時間が伸びすぎます。
  • 再学習・量子化対応ファインチューニングは有効でも、元の学習データや大規模計算資源が必要です。配布済みモデルや社内で追加学習できないモデルには適用しにくいです。

この問題は、オンプレミスRAG、顧客データを外部へ出せない業務支援、低コストな専用推論API、開発用のローカルLLMで特に顕在化します。モデルの知識を変えずに配置可能性を上げることが、GPTQの狙いです。

用語解説

後学習量子化(PTQ)
学習済みの重みを、追加学習をせず低いビット幅で表す変換です。GPTQはこの方式なので、モデルを作り直せない場合にも使えます。
量子化グリッド
連続値の重みを置き換える、有限個の離散値の集合です。bit数が少ないほど表現できる値は減り、圧縮率と誤差のトレードオフが強くなります。
キャリブレーションデータ
量子化時に各層へどのような入力が入るかを観測する少数のサンプルです。GPTQはこの入力を用いて、単なる重み差ではなく層出力の変化を小さくします。
Hessian(ヘッセ行列)
誤差関数が重みの変化にどれほど敏感か、その曲率と相互関係を表す二次情報です。GPTQでは入力の相関から近似し、どの誤差を他の重みで補償しやすいかを判断します。
perplexity
言語モデルが次の単語をどれだけ予測しにくいかを測る指標で、低いほどよい値です。量子化後の言語能力が壊れていないかを厳しく見るために使われます。

技術の仕組み

GPTQは、各線形層を一つずつ処理します。目的は、元の重み行列を W、量子化後を W_hat、キャリブレーション入力を X として、W X と W_hat X の差を小さくすることです。つまり重みの値そのものの差ではなく、実際に入力を通した出力の差を最小化します。

1. 入力の相関から誤差の重み付けを作る

各層へ少数の実例を通し、入力行列 X から X X^T を作ります。これが近似Hessianです。同じ量だけ重みを丸めても、頻繁に大きく使われる入力方向の誤差は出力へ強く表れます。GPTQはこの差を区別します。

2. 一列を量子化し、残りの重みで補償する

重み行列の列を固定順序で量子化します。ある列を量子化グリッドの最寄り値へ丸めると誤差が生じるため、Hessianの逆行列に由来する係数を使って、まだFP16の残りの列を更新します。これにより、後続の列が先の丸め誤差を吸収します。

元になったOBQでは重みごとに量子化順を選びますが、GPTQは大きな層では任意の固定順でも精度差が小さいと観察しました。全行で同じ列順を使うことで、二次情報の更新を共有でき、巨大層へスケールします。

3. GPU向けに128列ずつ更新する

列ごとの細かな更新をその都度全行列へ反映すると、演算よりメモリアクセスが支配的になります。GPTQは128列のブロック内で量子化・補償を進め、ブロック完了時にまとめて全体を更新します。理論上の演算量を大きく変えずに、GPUの行列演算を使いやすくする工夫です。

さらに、繰り返しの逆行列更新で数値誤差が蓄積しないよう、Cholesky分解を用いて必要な情報を事前計算します。対角へ平均値の1%を加えるdampeningも使い、大規模層での不安定化を抑えます。

4. グループ化で精度と保存量を調整する

量子化の尺度・ゼロ点を行全体で共有する代わりに、連続する128個や1024個の重みごとに持たせることもできます。グループを小さくすると外れ値に対応しやすく精度は上がりますが、尺度などのメタデータと実装コストが増えます。GPTQはこのグループ設定と相性がよく、推論環境に合わせて選べます。

実験と結果

論文はOPT(125M〜175B)とBLOOM(560M〜176B)を主対象とし、WikiText2、Penn Treebank、C4のperplexity、LAMBADA、ARC、PIQAなどで検証しました。比較対象は、同じ行単位の量子化グリッドで最近傍丸めするRTNです。量子化時間は単一NVIDIA A100で測定されています。

3〜4bitでの言語モデル品質

WikiText2において、OPT-175BのFP16のperplexityは8.34でした。4bit GPTQは8.37、3bit GPTQは8.68であり、強い圧縮でも悪化を小さく抑えました。一方、4bit RTNは10.54、3bit RTNは約7300まで悪化しました。BLOOM-176Bでも、FP16が8.11に対して4bit GPTQは8.21、3bit GPTQは8.64でした。

これは、3bitが常に安全という意味ではありません。小さいモデルほど量子化が難しく、同じ設定でもperplexityの悪化が大きくなります。少数ビットでは「単に丸める」より、入力依存の誤差補償が重要だという結果です。

量子化の所要時間

OPT-175Bの全量子化は約4.2時間、BLOOM-176Bは約3.8時間でした。OPT-13Bは約20.9分、BLOOM-7.1Bは約10分です。これはモデルを再学習する時間ではなく、キャリブレーションと重み変換の時間です。巨大モデルでも一回のオフライン処理として実行できる範囲に収めた点が実用上の成果です。

推論メモリと遅延

3bit OPT-175Bは、埋め込みと出力層をFP16のまま残しても約63GB、2048トークン分のKVキャッシュを加えても約9GBで、80GB A100一枚に収まりました。論文独自の量子化行列×FP16ベクトルカーネルでは、128トークン生成・バッチ1の平均トークン遅延がA100で230msから71ms(3.24倍)、A6000で589msから130ms(4.53倍)になりました。

ただしこの速度結果は専用カーネル込みです。重みだけをGPTQ形式にしても、利用するサーバーが効率的な復号カーネルを持たなければ、主にメモリ削減だけが得られる場合があります。

何に使える?

社内RAGを単一GPUへ載せる

検索・プロンプト構築はそのままに、回答生成モデルの重みを4bit化する用途です。生成モデルの常駐メモリを下げられるため、小さなGPUノードへ分割したり、同一GPUに埋め込み・リランカーを同居させたりしやすくなります。検索品質は量子化対象ではないため、まず生成品質だけを評価できます。

モデル選択を容量制約から解放する

VRAM上限に合わせて小さいモデルを選んでいたローカル開発環境で、より大きいモデルを試せます。論文の175Bの例ほど大きくなくても、重みを16bitから4bitへ下げる設計は、モデル本体の保存量を概ね4分の1へ近づけます。実際の総量には尺度・ゼロ点、KVキャッシュ、実行時バッファが加わるため、事前に計測する必要があります。

専用タスクの推論API

問い合わせ分類、要約、コード補完など、同じモデルを多数回呼ぶサービスにも向きます。量子化後に代表入力・長い入力・ツール呼び出しを含む回帰セットを回せば、コストを下げながら、サービスに重要な挙動が保たれたモデルだけを採用できます。

開発や事業へのヒント

「最初に量子化、次に評価」を配備工程へ入れる

オープンモデルを採用する際は、FP16版を基準に、4bit GPTQ版を候補として同じ入力セットで比較する工程を作るとよいです。一般ベンチマークの点数だけではなく、正解性、JSON形式、引用、長文、レイテンシ、VRAMのそれぞれを記録します。GPTQの考え方は、圧縮をモデル変更ではなく配備最適化として扱うことです。

キャリブレーションは本番入力に寄せる

GPTQは層入力 X を使うため、キャリブレーションデータの分布が大切です。論文の結果をそのまま自社ドメインへ一般化するのではなく、個人情報を除いた代表的な質問、指示、文書長を用意するのが安全です。特に日本語、表形式、コード、長いコンテキストを扱う場合は、その形式を含めて評価します。

速度はファイル形式ではなく実行スタックで決まる

事業設計では「4bitだから4倍速い」とは置けません。GPTQの速度向上は、低ビット重みを読み出す量と、それを活かすGPUカーネルの組み合わせで生じます。候補サーバーの対応形式、バッチサイズ、コンテキスト長、KVキャッシュの使用量を含めて、目標負荷で比較することが重要です。

限界

GPTQは重み量子化であり、KVキャッシュ、活性値、入力トークン、attention計算を直接小さくする手法ではありません。長い会話やRAGではKVキャッシュが支配的になるため、重みだけ圧縮してもメモリ不足が解消しないことがあります。

また、キャリブレーション入力への依存があります。一般テキストだけで変換したモデルが、専門領域の長文、コード、複雑な出力形式で同程度に保たれる保証はありません。低ビット・小グループほど精度を保ちやすい一方、変換時間、メタデータ、対応カーネルとのトレードオフが増えます。

論文の速度測定はOPT-175Bと当時のA100/A6000向け専用カーネルに基づきます。現行のモデル構造、GPU、推論エンジンでは結果が変わります。さらに、perplexityや少数のゼロショット評価が保たれても、事実性、指示追従、毒性、特定業務の失敗率まで保たれるとは限りません。導入時はFP16版とのタスク別比較とロールバック手段を用意すべきです。

よくある質問

Q. GPTQはモデルを再学習する必要がありますか?

A. 必要ありません。少数のキャリブレーション入力を通して各層の入力相関を観測し、既存重みを一度だけ変換します。ただし、変換後に自社タスクで品質検証を行うことは必要です。

Q. 4bit GPTQなら、どのLLMでもFP16と同じ精度になりますか?

A. 同じにはなりません。論文では大きなOPT・BLOOMで小さい悪化に抑えられましたが、モデルサイズ、層の外れ値、データ分布、グループ設定で差が出ます。FP16を基準に、実際のプロンプトで比較してください。

Q. GPTQにすれば必ず推論が速くなりますか?

A. 必ずではありません。GPUメモリ削減は主な効果ですが、遅延短縮には低ビット重みを効率よく読む推論エンジン・カーネルが必要です。対応形式と目標のバッチサイズで実測することが重要です。

Q. キャリブレーションデータには学習データが必要ですか?

A. 完全な学習データは不要です。量子化時の層入力を代表できる少数サンプルが必要です。本番に近い文章長、言語、指示形式を含め、秘匿情報は除外した評価用データを使うのが実務的です。

Q. GPTQとKVキャッシュ量子化はどちらを先に検討すべきですか?

A. 常駐モデルの重みがVRAMの主因ならGPTQ、長いコンテキスト・多数セッションのKVキャッシュが主因ならKVキャッシュ最適化も必要です。実運用のVRAM内訳を計測して、両者を別の問題として扱うと判断しやすくなります。

今日の学び

この論文は、巨大LLMを低ビット化すると単純な丸めでは言語能力が壊れやすい課題を扱いました。GPTQは、キャリブレーション入力から得る二次情報を使い、量子化誤差を未変換の重みで補償しながら、GPU向けのブロック処理で変換を高速化します。

得られるヒントは、量子化を「精度を少し犠牲にする圧縮」と決めつけず、対象ワークロードで検証可能な配備設計として扱うことです。重み・KVキャッシュ・カーネルを分けて測り、代表入力で品質とコストの境界を決めると、より大きなモデルを現実的な構成へ載せやすくなります。