SmoothQuantとは?LLMをW8A8量子化して推論を高速化する技術

SmoothQuantは、活性値の外れ値を重み側へオフラインで移し、LLMのW8A8量子化を実用化する技術です。仕組み、実験結果、推論最適化への使い道を日本語で解説します。

参考文献

SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models

Guangxuan Xiao, Ji Lin, Mickael Seznec, Hao Wu, Julien Demouth, Song Han

論文を見る

今回の論文

今回取り上げるのは、Guangxuan Xiao、Ji Lin、Mickael Seznec、Hao Wu、Julien Demouth、Song Han による論文「SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models」です。2022年11月18日に arXiv で公開され、その後 ICML 2023 で採択されています。公開元は arXiv / ICML、研究分野は LLM 推論最適化、量子化、モデル圧縮です。URL は https://doi.org/10.48550/arXiv.2211.10438 です。

この論文を選んだ理由は、LLM を軽くする話の中でも、特に実装へ落とし込みやすいからです。SmoothQuant は「量子化すると精度が落ちる」という問題を、再学習ではなく重みと活性値のスケーリング設計で解きます。推論コストを下げたい開発者にとって、考え方そのものがそのまま設計指針になります。

どんな技術か

SmoothQuant は、LLM の線形演算を INT8 で回しやすくするための post-training quantization 手法です。特に重要なのは、重みだけでなく活性値も 8bit 化する W8A8 量子化を、精度をほぼ落とさずに成立させることです。

LLM の量子化が難しい理由は、重みよりも活性値のほうにあります。重みは比較的なだらかな分布を持つ一方で、活性値には一部のチャネルだけ極端に大きい値、つまり outlier が出やすいです。この outlier があると、INT8 の量子化レンジがそこに引っ張られ、多くの通常値が粗く丸められてしまいます。

SmoothQuant はここで、活性値側の難しさをそのまま受け止めるのではなく、チャネルごとのスケーリングで一部の難しさを重み側へ移します。しかもこの変形は数学的に等価なので、モデルの関数自体は変えません。要するに SmoothQuant は、モデルを再訓練せずに「量子化しやすい表現へ並べ替える」技術です。

課題

この技術が解決しようとしているのは、LLM の推論を安く速くしたいのに、単純な INT8 量子化では精度が大きく壊れてしまう問題です。

何が難しいのかというと、LLM では活性値の外れ値が大規模化とともに目立ってくるからです。論文では、6.7B を超える規模になると systematic outliers が現れ、これが活性量子化の誤差を大きくすると説明しています。重みだけを 8bit 化するなら比較的うまくいっても、活性値まで INT8 にしようとすると急に難しくなります。

既存手法の限界も明確です。たとえば LLM.int8() は outlier 部分だけを FP16 に残す混合精度分解で精度を守りますが、そのぶんハードウェア実装が複雑になり、必ずしも速くなりません。逆に、単純な W8A8 量子化はカーネル効率はよいものの、OPT-175B のような大規模モデルでは精度が大きく崩れます。

なぜこの課題を解く必要があるのかというと、推論コストがそのまま事業コストに跳ね返るからです。大規模モデルはモデルサイズだけで数百 GB 級になり、FP16 のままでは GPU 台数、メモリ、帯域、レイテンシのすべてが重くなります。API 提供でも社内運用でも、速くて安い推論基盤を作れるかどうかは、かなり本質的な競争力になります。

実際の AI システムでは、チャット、検索、RAG、エージェント、コード補完、社内アシスタントなど、推論回数が多いほどこの問題が効きます。1 回の推論が少し軽くなるだけでも、ピークトラフィック時の GPU 台数や同時実行数に直結するためです。

用語解説

Post-Training Quantization(PTQ)
学習済みモデルを再訓練せず、後処理として低ビット化する手法です。SmoothQuant は追加学習なしで適用できるため、既存モデルをそのまま配備したい実務と相性がよいです。
W8A8 量子化
重みを 8bit、活性値も 8bit にする量子化設定です。重みだけの量子化より高速化しやすい一方で、活性値の量子化誤差が問題になりやすく、SmoothQuant の中心課題でもあります。
活性値の outlier
一部チャネルにだけ現れる極端に大きな活性値です。LLM の量子化では、この outlier が量子化レンジを支配し、多くの通常値の表現精度を落としてしまうため、最重要のボトルネックになります。
INT8 GEMM
8bit 整数で行う行列積です。GPU や CPU の整数演算カーネルを活かせるため、高速化の本命ですが、うまく使うには重みと活性値の両方をハードウェア向きの形で量子化する必要があります。
Calibration
少数のサンプルを使って活性値のスケール統計を取る工程です。SmoothQuant ではこの統計からチャネルごとの smoothing factor を決めるため、再学習の代わりにこの前処理品質が効きます。

技術の仕組み

SmoothQuant の肝は、活性値の量子化の難しさを、そのまま mixed precision で逃がすのではなく、重みとの間で再配分することです。ここを理解すると、この論文の価値が見えやすくなります。

基本アイデア

論文の観察はシンプルです。LLM では重みは比較的量子化しやすい一方で、活性値は一部チャネルの outlier によって量子化しづらくなります。さらに、その outlier はトークンごとにランダムに暴れるのではなく、同じチャネルに継続的に出やすい傾向があります。

この性質を使うと、チャネルごとに活性値を割り、代わりに対応する重みを同じ分だけ掛ければ、線形層の出力を変えずに活性値だけをなだらかにできます。論文ではこれを per-channel smoothing factor s によって実現しています。

数学的に何をしているのか

線形層の出力を Y = XW とすると、SmoothQuant はこれを

Y = (X diag(s)^-1) (diag(s) W)

の形へ変形します。つまり、入力活性値 X はチャネルごとに縮小し、そのぶん重み W をチャネルごとに拡大します。積としては同じなので、理論上の関数は変わりません。

ここで重要なのは、推論時に毎回重い補正計算を入れるのではなく、この変換を offline で吸収できる点です。前段の線形層や LayerNorm へスケールを畳み込めるため、ランタイムに余計なカーネル呼び出しを増やしません。この設計が、精度だけでなく速度面でも効いています。

なぜ活性値が量子化しづらいのか

INT8 量子化では、テンソル内の最大絶対値に量子化レンジが引っ張られます。活性値の一部チャネルに非常に大きな値があると、他の多くの小さな値が少ないビット幅で表現されることになり、実効的な量子化段数が極端に減ります。

論文では、OPT 系モデルで per-tensor や per-token の活性量子化は大きく精度を落とす一方、理想的な per-channel 活性量子化なら FP16 に近い精度を保てることを示しています。ただし、per-channel 活性量子化は INT8 GEMM と相性が悪く、ハードウェア効率が出ません。SmoothQuant は、この理想に近い振る舞いをハードウェアフレンドリーな形で近似する発想です。

smoothing factor はどう決めるのか

極端に言えば、活性値の各チャネル最大値をそのまま打ち消すようにスケーリングすれば、活性値はかなり平坦になります。ただし、それをやり切ると今度は重み側に外れ値が移りすぎて、重み量子化が壊れます。

そこで SmoothQuant は migration strength α を導入し、重みと活性値のどちらへどれだけ難しさを寄せるかを調整します。論文の式では、チャネル j に対して smoothing factor を

s_j = max(|X_j|)^α / max(|W_j|)^(1-α)

で決めます。α が大きいほど活性値を強く平滑化し、そのぶん重み側へ負担を移します。論文では多くの OPT と BLOOM で α = 0.5 がよいバランスで、GLM-130B のように outlier がより強いモデルではより大きい α が有効だと報告しています。

学習方法

この手法は学習を必要としません。既存の学習済みモデルに対して calibration サンプルを流し、チャネルごとの活性値スケールを推定して smoothing factor を求め、その後に量子化します。

つまり、LoRA や QAT のように再最適化する手法ではなく、あくまで推論前の変換です。ここが実務的に大きく、公開モデルや既存社内モデルへ後付けしやすい理由です。

推論方法

SmoothQuant 自体は推論アルゴリズムを変えません。変えるのは表現形式だけです。オフライン変換後のモデルでは、計算量の大きい線形層や BMM を INT8 で回せるようになります。

論文では、効率レベルとして O1 から O3 を用意しています。O1 は活性値 per-token、重み per-tensor の動的量子化、O2 は両方 per-tensor の動的量子化、O3 は両方 per-tensor の静的量子化です。一般に O3 が最も高速ですが、量子化粒度が粗いぶん、精度とのトレードオフを見ます。

実装上の重要な工夫

この論文の重要な工夫は 3 つあります。

1. outlier を削除せず移送する

外れ値を単純に clipping するのではなく、数学的等価性を保ったまま重みへ移すので、モデルの表現力を壊しにくいです。

2. ハードウェアが得意な量子化粒度へ寄せる

理想的な per-channel activation quantization をそのまま実装するのではなく、INT8 GEMM と相性のよい形へ落としているのが実運用上の強みです。

3. calibration ベースで済ませる

追加学習なしで済むため、モデル資産の再利用性が高いです。とくに大規模モデル配備では、再学習コストの回避自体が大きな価値になります。

実験と結果

論文では、SmoothQuant が本当に精度を保てるのか、そして実際に速くて軽くなるのかを、複数の大規模 LLM で検証しています。

何を検証したのか

検証の主眼は 2 つあります。1 つ目は、OPT-175B や BLOOM-176B、GLM-130B のような 100B 超級モデルでも W8A8 量子化で精度を維持できるかです。2 つ目は、PyTorch 実装と FasterTransformer 実装の両方で、実測のレイテンシとメモリ使用量がどこまで改善するかです。

評価指標としては、精度面では WinoGrande、HellaSwag、PIQA、LAMBADA などを使い、言語モデルの perplexity も見ています。速度面では context stage と decoding stage のレイテンシ、ピークメモリ使用量を測っています。実験環境は NVIDIA A100 80GB GPU サーバーです。

精度はどれだけ保てたのか

大きな結果は、100B 超級モデルでも W8A8 で精度をかなり保てたことです。たとえば OPT-175B では、FP16 の平均精度が 71.6% だったのに対し、単純な W8A8 は 32.3% と大きく崩れました。一方で SmoothQuant-O1 は 71.2%、O2 と O3 も 71.1% で、ほぼ FP16 と同等です。

BLOOM-176B でも FP16 が 68.2%、SmoothQuant-O1 が 68.3%、O2 が 68.4% と維持できています。GLM-130B は量子化しづらいモデルですが、それでも SmoothQuant-O1 は 73.7% で FP16 の 73.8% にかなり近いです。つまり SmoothQuant は、単純量子化が壊れるケースでも、実用精度まで戻せることを示しています。

最近のモデル群でも通じるのか

論文の更新版と公式実装では、Llama-2、Falcon、Mistral、Mixtral でも評価されています。WikiText-2 の perplexity では、たとえば Llama-2-13B が FP16 で 4.950、SmoothQuant W8A8 で 4.929、Mistral-7B は 5.253 に対して 5.277、Mixtral-8x7B は 3.842 に対して 3.893 でした。

この結果は、SmoothQuant が OPT 系専用のハックではなく、アーキテクチャが少し違っても転用しやすいことを示しています。量子化の実装基盤として見たときに、この汎用性はかなり重要です。

速度とメモリはどこまで改善したのか

PyTorch 実装では、OPT-30B の context stage で最大 1.51 倍の高速化、最大 1.96 倍のメモリ削減が報告されています。対照的に LLM.int8() は精度を守れても、多くの条件で FP16 より遅くなりました。ここは SmoothQuant の価値をよく表しています。精度がよいだけではなく、整数カーネルに素直に乗るので本当に速いわけです。

FasterTransformer 実装では、OPT-13B と OPT-30B で最大 1.56 倍の高速化が出ています。さらに大きい OPT-66B と OPT-175B では、FP16 と同等またはそれ以上のレイテンシを保ちながら、必要 GPU 数を半分にできました。論文では OPT-175B を FP16 の 8 GPU ではなく 4 GPU で回せる例も示しています。

530B モデルでも成立したのか

MT-NLG 530B でも SmoothQuant は動作しました。論文では、16 GPU の FP16 構成に対して、8 GPU の INT8 構成でほぼ同等の精度を保ちつつ、メモリを約半分にできると示しています。これは単に速いというより、「今まで 1 ノードに載らなかったモデルが載る」という意味で、配備可能性を変える結果です。

結果から何が言えるのか

この論文から言えるのは、LLM 量子化の本質的な敵は重みではなく活性値の outlier だということです。そして、その問題を mixed precision や再学習に頼らず、スケール再配置でかなり解けるとわかりました。

もう 1 つ重要なのは、量子化の良し悪しはビット幅だけでは決まらないことです。同じ W8A8 でも、スケール設計とハードウェア実装の整合性が取れているかで、精度も速度も大きく変わります。ここは実装系の論文としてかなり示唆的です。

何に使える?

SmoothQuant は研究用途だけでなく、LLM を実際に運用する現場でかなり広く使い道があります。

自前 LLM サービスの推論コスト削減

もっとも直接的なのは、チャット API や社内アシスタントの推論基盤です。重みだけでなく活性値も INT8 化できると、GPU メモリ消費と行列演算コストの両方が下がるため、同じハードウェアでより大きいモデルを載せたり、同時実行数を増やしたりしやすくなります。

RAG やエージェントの長時間運用

RAG やエージェント系システムは、1 回の問い合わせで複数ターンの推論を重ねることがあります。このとき 1 トークンあたりの decoding コストが効いてきます。SmoothQuant のような推論最適化は、品質を保ちながら応答コストを下げる現実的な手段になります。

オンプレミスや閉域環境への配備

金融、医療、製造のようにクラウド外へ出しづらい領域では、限られた GPU 台数でモデルを動かせるかが重要です。SmoothQuant は「精度を保ったまま、より少ない GPU で回す」という方向の改善なので、閉域配備と相性がよいです。

エッジ寄りのローカル推論基盤

SmoothQuant 自体は 4bit 軽量化ほど極端ではありませんが、W8A8 を堅実に成立させる中間地点として使えます。まずは 8bit で安全にメモリを半減し、その後に AWQ や GPTQ など低ビット化の検討へ進む、という段階設計にも向いています。

推論エンジンや MLOps 基盤の最適化

論文でも FasterTransformer、後続では ONNX Runtime や TensorRT-LLM などへの統合が進んでいます。つまり SmoothQuant は、個別モデルの工夫というより、推論スタック側へ組み込める技術です。社内 serving 基盤を持つチームなら、かなり直接的に効きます。

開発や事業へのヒント

この論文から得られるヒントは、推論最適化は単なるインフラ節約ではなく、プロダクト設計そのものに影響するということです。

まず「モデル変更」より「表現変換」を検討する

AI アプリを改善するとき、ついモデルの入れ替えや蒸留を先に考えがちです。ただ、既存モデルを保ったまま量子化しやすい形へ変換するだけで、かなりのコスト改善が取れる場合があります。SmoothQuant は、その代表例です。

精度を守る鍵は outlier 管理にある

自分で推論基盤を作るなら、単に bit 数を下げるより、どこが量子化誤差を生んでいるかを見たほうがよいです。SmoothQuant は、活性 outlier という原因に直接手を入れています。これは KV cache 圧縮、長文推論、MoE 最適化など別テーマにも通じる考え方です。

小規模プロダクトでも十分応用できる

175B や 530B の話だけを見ると遠い技術に見えますが、実際には 7B や 13B クラスの self-hosted モデルでも意味があります。社内チャット、FAQ ボット、コード補助、文書要約など、トークン消費が多いプロダクトなら、W8A8 化だけで運用ラインが変わる可能性があります。

今後注目すべき方向性

今後は、SmoothQuant のような「量子化しやすい形へ並べ替える」前処理と、推論エンジン側の fused kernel 最適化が一体で進むはずです。また、W8A8 を土台にして W4A8 や混合精度へ広げる流れも強まると考えられます。量子化を単独の圧縮技術ではなく、配備アーキテクチャの一部として見る視点が重要です。

限界

SmoothQuant にも限界はあります。まず、これは万能な低ビット化ではなく、主に INT8 を現実的にする技術です。4bit やそれ以下まで攻めたい場合は、別の工夫や後続手法が必要になります。

また、calibration サンプルへの依存もあります。活性値スケールは校正データから推定するため、実運用の入力分布と大きくずれると、静的量子化の精度が落ちる可能性があります。論文でも、より粗い O3 設定ではその影響が少し見えます。

実装面では、理論上の変換が簡単でも、実際に速くするには推論エンジン側の INT8 kernel 対応が必要です。つまり SmoothQuant を適用しただけで必ず高速化するわけではなく、TensorRT-LLM や ONNX Runtime のような実装基盤との相性も重要です。

さらに、モデルごとに最適な α は少し変わります。論文では 0.4 から 0.6 付近が sweet spot になりやすいとしていますが、outlier の強いモデルではより大きい値が必要でした。完全なノーチューニングというよりは、軽い校正設計が要る技術と見たほうが正確です。

最後に、この技術は推論時の効率化が主目的であり、学習コストやアライメント品質を直接改善するものではありません。プロダクト全体の最適化では、目的を切り分けて使う必要があります。

よくある質問

Q. SmoothQuant は LLM.int8() と何が違うのですか?

A. LLM.int8() は outlier 部分を FP16 に逃がす mixed precision 寄りの方法です。SmoothQuant は、活性値の難しさを重みへ再配分して、計算の中心を W8A8 の整数演算へ寄せます。そのため、精度維持だけでなく実測速度でも有利になりやすいです。

Q. なぜ重みではなく活性値が問題になるのですか?

A. LLM では重み分布は比較的なだらかですが、活性値は一部チャネルだけ極端に大きくなりやすいからです。INT8 量子化では最大値にレンジが引っ張られるため、その外れ値が全体の表現精度を下げてしまいます。

Q. 再学習なしで本当に使えますか?

A. 論文の主張はその点にあります。SmoothQuant は PTQ なので、学習済みモデルに calibration をかけてスケールを推定し、その後に量子化します。追加の fine-tuning が要らないため、既存モデルへ導入しやすいです。

Q. 自社の 7B や 13B モデルにも意味はありますか?

A. あります。論文でも小さめの OPT や、後続実装では Llama-2 や Mistral まで評価されています。推論を継続的に回すサービスなら、メモリ半減や 1.5 倍前後の高速化でも十分に大きな差になります。

Q. SmoothQuant だけで十分ですか?

A. 用途次第です。まず安全に INT8 化したいなら有力ですが、さらに小さいメモリや端末配備を狙うなら、4bit 系手法や kernel 最適化、KV cache 圧縮などと組み合わせる余地があります。SmoothQuant は堅実な第一歩と考えるのがよいです。

今日の学び

この論文は、LLM の W8A8 量子化が活性値 outlier のせいで壊れやすいという課題を扱いました。そこに対して、活性値の量子化しづらさを重み側へオフラインで移す SmoothQuant という変換を使い、精度をほぼ保ったまま高速化と省メモリ化を実現しました。

ここから得られるヒントは、推論最適化では「何bitにするか」だけでなく、「どこに量子化の難しさがあるか」を見抜くことが重要だということです。モデルを変えず、表現の持ち方を変えるだけで配備可能性が大きく変わるのは、実装にも事業にもかなり応用しやすい考え方です。

関連記事