量子化とは、デジタル信号の精度を、通常は高精度の形式から低精度の形式に下げるプロセスのことです。この手法は、信号処理、データ圧縮、機械学習など、さまざまな分野で広く使用されています。
量子化は、大規模言語モデル(LLM)内で利用される手法で、通常は32ビット浮動小数点(FP32)または16ビット浮動小数点(FP16)などの高精度データの重みとアクティベーション値を、8ビット整数(INT8)などの低精度のデータに変換します。FP32とFP16が高精度データと呼ばれるのは、一般的にこれらのデータ型を使用するモデルの精度がより高いためです。これは、データをINT8のように圧縮すると、サイズが縮小され、その結果、実質的に精度が低下するためです。これは、量子化誤差とも呼ばれます。ニューラル・ネットワークの人工ニューロンに割り当てられた数値(0から1の間)は、アクティベーション値と呼ばれます。通常は8ビット量子化を目指しますが、4ビット(INT4)以下の低ビット量子化も実現しています。基本的には、ニューラル・ネットワーク上で圧縮手法を使用する量子化プロセスでは、高いビット数から低いビット数に変換します。 1
FP32を使用してLLMを運用するためには膨大な量の計算が要求されます。求められる計算量の増加に伴い、推論(ユーザーの質問に対する応答を生成するLLMのプロセス)も遅くなります。量子化は、LLMの推論速度を向上させると同時に、計算負荷を軽減する優れた最適化ツールといえます。量子化プロセスは、モデルの処理能力をほぼ同じに保ちながら、重みをより低精度のデータ型に変換することを前提に構築されています。重みを低精度のデータ型に変換すると、モデルを実行するたびに処理が必要なビット数が少なくなるため、計算コストが削減されます。処理されるビット数が少ないほど、各質問をLLMが処理する速度も速くなります。
量子化を利用して浮動小数点のデータ型を整数に変換することで、計算をより迅速に完了できます。これにより、モデル全体の遅延が短縮され、推論の精度と速度のトレードオフが改善します。このトレードオフは、特にモバイルCPUで実行されているリアルタイム・アプリケーションにとって重要です。 2
大きな要求計算量を処理できないデバイス上で機械学習モデルを実行しようとする場合、量子化は不可欠です。量子化によって浮動小数点を整数で表すように変換すると、機械学習モデルで求められる計算量が減少します。そのため、このように量子化したモデルをノートPC、タブレット、スマートフォンでの実際の用途に利用できるようになります。2
通常、量子化モデルで要求される計算量は低くなります。したがって、量子化によりエネルギー効率が向上し、これがノートPC、タブレット、携帯電話でこれらのモデルを実行するための鍵となります。3
量子化を利用することで、整数演算を使用して現在の機械学習モデルを実行できるようになります。これにより、量子化モデルは、浮動小数点演算をサポートしていない古いプラットフォームと互換性を持つようになります。そのため、これらのモデルははるかにアクセスしやすく、コンシューマー向けGPUで実行できます。 4
FP32が取り得る値は、-3.4 1038から3.4 1038の範囲内で約40億あります。一方、INT8では、-128から128の範囲内のうち256個の値しか表示されません。後者の方が取り得る値の範囲がかなり狭いため、行列の乗算をより高速に実行できます。ディープラーニング(深層学習)ベースのモデルには莫大な計算コストがかかるため、正確で効率的なアルゴリズムが不可欠です。
量子化のプロセスは、まず32ビット浮動小数点数をINT8フィールドに投影する最適な経路を決定することから始まります。これを行うために、モデルを量子化する異なるアルゴリズムがあります。ここでは、Absolute Max QuantizationとAffine Quantizationという2つの量子化方法を取り上げます。
Absolute Max Quantizationで浮動小数点数とそれに対応するINT8の値の間のマッピングを計算するには、まずテンソルの絶対的最大値で除算してから、データ型の合計範囲で乗算する必要があります。
例えば、Absolute Max Quantizationアルゴリズムをベクトル[1.6, -0.7, -3.4,1.7, -2.9, 0.5, 2.3, 6.2]に適用するとします。その場合、Absolute Max値(6.2)を抽出します。INT8の範囲は[-127, 127]です。そのため127を6.2で割って、スケール係数として20.5を求めます。したがって、元のベクトルを乗算すると、量子化データのベクトル[33, -14, -70, 35, -59, 10, 47, 127]が得られます。これらの数値は丸められるため、精度がいくらか低下します。5
Affine Quantizationアルゴリズムを実装するためには、32ビット浮動小数点の値の範囲を[a, b]と定義します。Affine Quantizationアルゴリズムは次のとおりです。
𝑥𝑞 = round ((1/𝑆)𝑥+𝑍)
- 𝑥𝑞は、32ビット浮動小数点の値xに対応する量子化されたINT8の値です。
-Sは、FP32のスケール係数で、正の32ビット浮動小数点です。
-Zは、ゼロ点です。これは、32ビット浮動小数点フィールドの0に対応するINT8の値になります。
-roundは、結果の値を最も近い整数に丸めることを意味します。
次に、32ビット浮動小数点の値の[min, max]を設定します。このときに、外れ値を考慮する必要があります。ここで外れ値を見落とすと、最小値または最大値としてマッピングされ、量子化モデルの精度が損なわれる可能性があります。これを阻止するために、モデルをブロック単位で量子化することができます。重みを、64または128のグループに分割し、これらのグループを量子化し、外れ値を考慮すると、精度が低下するリスクが最小限に抑えられます。6
学習後に量子化するPTQは、量子化が既存のモデルに適用されるときに行われます。これにより、再学習を必要とせずに、モデルが浮動小数点表現から低精度の固定小数点表現の整数に変換されます。この手法は、学習中に量子化を行う手法ほど多くのデータを必要とせず、はるかに高速です。ただし、既存のモデルが基本的には小さなサイズに変換されるため、PTQによりパフォーマンスが低下する可能性があります。PTQを利用する例としては、既に使用しているモデルがあり、その速度と効率を向上させたい場合が挙げられます。これは、PTQがモデルの学習後に(つまり、既存のモデルに対して)行われるので、このプロセスには大量の学習データを必要としないためです。7
学習中に量子化を行うQATでは、LLMの事前学習またはファイン・チューニング中に重みの変換が行われます。これによりパフォーマンスは向上しますが、大量の計算能力を必要とし、代表となる学習データが必要です。全体として、QATは通常、高パフォーマンスのモデルを生成しますが、コストが高く、はるかに多くの計算能力が必要になります。QATを利用する例としては、十分な量の学習データとより潤沢な予算がある場合が挙げられます。なお、このプロセスはモデルの学習段階で行われるため、既に学習済みのモデルでこの手法を使用することは意味がありません。7
これら2つの手法の違いは、クリッピング範囲(しばしばキャリブレーションと呼ばれる)がどのように選択されるかです。動的量子化では、アクティベーションごとにクリッピング範囲が動的に計算されます。一般的に、このような量子化手法を使用すると精度が向上します。その名前が示すように、静的量子化はすべての入力に対して固定されたクリッピング範囲を利用します。この手法の量子化がより頻繁に使用されますが、それは、動的量子化は非常に高価になる可能性があるためです。
量子化中に重みが変換されると、量子化後の機械学習モデルで量子化された値の精度が失われることがあります。多数のパラメーターと層を持つ非常に大きなLLMを量子化する場合、量子化誤差の蓄積が大きくなるリスクがあるため、モデルのサイズを考慮する必要があります。8
機械学習モデルの大規模なトレーニングは、特に学習中に量子化を行うQATの場合、非常にコストがかかる可能性があります。そのため、学習後に量子化するPTQが費用対効果の観点から最適な選択となります。ただし、通常はQATの方がより正確なモデルを生成するため、この場合、モデルが一部の面で制限されます。9
¹ Dong Liu, Meng Jiang, Kaiser Pister, "LLMEasyQuant - An Easy to Use Toolkit for LLM Quantization", https://arxiv.org/pdf/2406.19657v2.
² Benoit Jacob, Skirmantas Kligys, Bo Chen, Menglong Zhu, Matthew Tang, Andrew Howard, Hartwig Adam, Dmitry Kalenichenko, "Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference", https://arxiv.org/pdf/1712.05877v1.
³ Ravi Kishore Kodali, Yatendra Prasad Upreti, Lakshmi Boppana, "A Quantization Approach for the Reduced Size of Large Language Models", https://ieeexplore.ieee.org/document/10499664.
⁴ Xiao Sun, Naigang Wang, Chia-yu Chen, Jia-min Ni, Ankur Agrawal, Xiaodong Cui, Swagath Venkataramani, Kaoutar El Maghraoui, Vijayalakshmi Srinivasan, "Ultra-Low Precision 4-bit Training of Deep Neural Networks", https://research.ibm.com/publications/ultra-low-precision-4-bit-training-of-deep-neural-networks
⁵ Tim Dettmers, Mike Lewis, Younes Belkada, Luke Zettlemoyer, "LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale", https://arxiv.org/pdf/2208.07339
⁶ Amir Gholami, Sehoon Kim, Zhen Dong, Zhewei Yao, Michael W. Mahoney, Kurt Keutzer, "A Survey of Quantization Methods for Efficient Neural Network Inference", https://arxiv.org/pdf/2103.13630
⁷ Hao Wu, Patrick Judd, Xiaojie Zhang, Mikhail Isaev, Paulius Micikevicius, "A Survey of Quantization Methods for Efficient Neural Network Inference", https://arxiv.org/pdf/2004.09602
⁸ Zhuocheng Gong, Jiahao Liu, Jingang Wang, Xunliang Cai, Dongyan Zhao, Rui Yan, "What Makes Quantization for Large Language Models Hard? An Empirical Study from the Lens of Perturbation", https://arxiv.org/pdf/2403.06408v1.
⁹ Sehoon Kim, Coleman Hooper, Amir Gholami, Zhen Dong, Xiuyu Li, Sheng Shen, Michael W. Mahoney, Kurt Keutzer, "SqueezeLLM: Dense-and-Sparse Quantization", https://arxiv.org/pdf/2306.07629v4.