AI・機械学習
量子化のビジュアルガイド (2024)
A Visual Guide to Quantization (2024) (newsletter.maartengrootendorst.com)
要約
この記事は、大規模言語モデル(LLM)の圧縮技術である量子化について、50以上のビジュアルを用いて直感的に解説します。LLMはパラメータ数が多く、多くのVRAMを必要とするため、コンシューマーハードウェアでの実行が困難な場合があります。量子化は、モデルのパラメータをより少ないビット数で表現することで、モデルサイズを削減し、推論を高速化する手法です。FP32からFP16、BF16、INT8へのデータ型の変更や、対称・非対称量子化といった手法、そしてそれに伴う精度低下(量子化誤差)について、図解を交えながら説明しています。
全文翻訳
量子化のビジュアルガイド
大規模言語モデルの圧縮を解き明かす
Maarten Grootendorst
2024年7月22日
5302644
共有
翻訳 - 韓国語 - 中国語 - フランス語
その名の通り、大規模言語モデル(LLM)は、多くの場合、コンシューマーハードウェアで実行するには大きすぎます。これらのモデルは数十億のパラメータを超えることがあり、通常は推論を高速化するために大量のVRAMを持つGPUが必要です。
そのため、より良いトレーニング、アダプターなどを通じて、これらのモデルをより小さくすることにますます多くの研究が集中しています。この分野の主要な技術の1つが量子化です。
この記事では、言語モデリングの文脈で量子化の分野を紹介し、概念を1つずつ探求して、この分野についての直感を養います。さまざまな方法論、ユースケース、および量子化の背後にある原則を探求します。このビジュアルガイドには、量子化についての直感を養うのに役立つ50以上のカスタムビジュアルがあります!
Exploring Language Models をお読みいただきありがとうございます!Gen AI と書籍に関する新しい投稿を受け取るために購読してください: Hands-On Large Language Models
購読
LLMに関するより多くのビジュアルを確認し、このニュースレターをサポートするには、私がLarge Language Modelsについて書いた本をチェックしてください!
書籍の公式ウェブサイト。Amazonで注文できます。すべてのコードはGitHubにアップロードされています。
追伸: もし本をお読みになったら、簡単なレビューをいただけると大変嬉しいです。著者にとって本当に助けになります!
パート1: LLMの「問題」
LLMは、そのパラメータ数からその名前が付けられています。現在、これらのモデルは通常数十億のパラメータ(主に重み)を持っており、保存にはかなりコストがかかる場合があります。推論中、アクティベーションは入力と重みの積として作成され、同様に大きくなる可能性があります。
その結果、数十億の値を可能な限り効率的に表現し、特定の値の保存に必要なスペースを最小限に抑えたいと考えます。
最適化する前に、まず数値値がどのように表現されるかを探求することから始めましょう。
数値値を表現する方法
特定の値は、多くの場合、浮動小数点数(またはコンピュータサイエンスではフロート)として表現されます。これは、小数点を持つ正または負の数です。
これらの値は「ビット」、つまりバイナリ数字によって表現されます。IEEE-754標準は、ビットが値の表現に3つの機能のいずれかをどのように使用できるかを説明しています。符号、指数、または小数部(または仮数)。
これら3つの側面を組み合わせることで、特定のビット値のセットが与えられた値の値を計算できます。
値を表現するために使用するビットが多いほど、一般的に精度は高くなります。
メモリ制約
利用可能なビットが多いほど、表現できる値の範囲は大きくなります。
特定の表現が取りうる表現可能な数値の区間は動的範囲と呼ばれ、2つの隣接する値の間隔は精度と呼ばれます。
これらのビットの便利な機能は、デバイスが特定の値の保存に必要なメモリ量を計算できることです。メモリバイトには8ビットがあるため、ほとんどの形式の浮動小数点表現の基本的な式を作成できます。
注: 実際には、推論中に必要な(V)RAMの量には、コンテキストサイズやアーキテクチャなど、さらに多くの要因が関係します。
ここで、700億パラメータを持つモデルがあると仮定しましょう。ほとんどのモデルはネイティブに32ビット浮動小数点数(しばしばフル精度と呼ばれる)で表現されますが、これはモデルをロードするだけで280GBのメモリを必要とします。
そのため、モデルのパラメータを表現するビット数を最小限に抑えることは非常に魅力的です(トレーニング中も同様!)。しかし、精度が低下すると、モデルの精度も一般的に低下します。元のパラメータをできるだけ維持しながら、値を表現するビット数を減らしたいと考えています…ここで量子化が登場します!
パート2: 量子化の紹介
量子化は、モデルのパラメータの精度を、より高いビット幅(例: 32ビット浮動小数点数)から、より低いビット幅(例: 8ビット整数)に削減することを目的としています。
元のパラメータを表現するビット数を減らす際に、精度の低下(粒度の低下)が伴うことがよくあります。この効果を説明するために、任意の画像を取り、それを表現するために8色のみを使用できます。
画像はSlava Sidorovのオリジナルから適応。
拡大された部分が、より少ない色で表現できるため、オリジナルよりも「ザラザラ」に見えることに注意してください。
量子化の主な目標は、元のパラメータを表現するために必要なビット数(色数)を削減することであり、同時に元のパラメータの精度を可能な限り維持することです。
一般的なデータ型
まず、一般的なデータ型を見て、32ビット(フル精度またはFP32と呼ばれる)表現の代わりにそれらを使用した場合の影響を見てみましょう。
FP16
32ビットから16ビット(半精度またはFP16と呼ばれる)浮動小数点数への移行の例を見てみましょう。
FP16が取りうる値の範囲がFP32よりもかなり小さいことに注意してください。
BF16
元のFP32と同様の範囲の値を取得するために、bfloat 16が「切り捨てられたFP32」の一種として導入されました。
BF16はFP16と同じビット数を使用しますが、より広い範囲の値を取り、ディープラーニングアプリケーションでよく使用されます。
INT8
ビット数をさらに減らすと、浮動小数点数表現の領域に近づきます。例として、FP32からわずか8ビットしかないINT8に移行すると、元のビット数の4分の1になります。
ハードウェアによっては、整数ベースの計算は浮動小数点数計算よりも高速な場合がありますが、常にそうとは限りません。しかし、一般的にビット数が少ないほど計算は高速になります。ビット数の削減ごとに、元のFP32表現をより低いビットに「圧縮」するためのマッピングが行われます。
実際には、FP32の範囲 [-3.4e38, 3.4e38] 全体をINT8にマッピングする必要はありません。モデルのパラメータの範囲をINT8にマッピングする方法を見つけるだけで十分です。
一般的な圧縮/マッピング方法には、対称量子化と非対称量子化があり、線形マッピングの形態です。これらの方法を、FP32からINT8に量子化するために探求しましょう。
対称量子化
対称量子化では、元の浮動小数点値の範囲は、量子化空間のゼロを中心とした対称範囲にマッピングされます。前の例では、量子化の前後の範囲がゼロを中心に保たれていることに注意してください。
これは、浮動小数点空間でのゼロの量子化値が、量子化空間でも正確にゼロであることを意味します。
対称量子化の一形態である絶対最大値(absmax)量子化は良い例です。値のリストが与えられた場合、最大絶対値(α)を線形マッピングを実行する範囲として取ります。
値の範囲 [-127, 127] が制限された範囲を表すことに注意してください。制限されていない範囲は [-128, 127] であり、量子化方法によって異なります。
ゼロを中心に線形マッピングであるため、式は簡単です。まず、スケールファクタ(s)を次のように計算します。
bは量子化したいバイト数(8)、αは最大絶対値です。
次に、sを使用して入力xを量子化します。
値を代入すると、次のようになります。
元のFP32値を取得するには、以前に計算したスケールファクタ(s)を使用して、量子化された値を逆量子化できます。
量子化を適用し、次に逆量子化プロセスを適用して元に戻すと、次のようになります。
3.08や3.02のような値がINT8(具体的には36)に割り当てられていることがわかります。値をFP32に戻して逆量子化すると、それらは精度を失い、もはや区別できなくなります。これはしばしば量子化誤差と呼ばれ、元の値と逆量子化された値との差を見つけることで計算できます。
一般的に、ビット数が少ないほど、量子化誤差は大きくなる傾向があります。
非対称量子化
非対称量子化は、対照的に、ゼロを中心にしていません。代わりに、浮動小数点範囲の最小値(β)と最大値(α)を、量子化範囲の最小値と最大値にマッピングします。探求する手法はゼロポ...