サイズが大きなLLM(70b、130b)を使いたい時に、大量なメモリが必要です。70bの場合は少なくとも80GB以上のメモリが必要です。(130bの場合は150GB)
例えば、A100(40GB)で計算しても、2,3台以上組み合わせて使う必要があります。
そこまでのリソースがない時には量子化という手法をよく使われてます。
今日は量子化について簡単に紹介したいと思います。
①量子化前の前提作業:シャーディング(Sharding)
ShardingはほとんどのLLMがやっていることです。
Hugging Faceでモデルをダウンロードすると、モデルファイル(.bin)が一つのファイルではなく、少なくとも十数個のファイルで構成されていることは気づけると思います。
一つのファイルをわざと数十個に分ける理由は、異なるstepでモデルの重みを分けて、メモリを節約できるからです。Shardingはacceleratorライブラリを使ってやります。
②モデルを読み込む際に量子化
LLMは、非常に多くの重みとニューロンで構成されています。
これらの重みやニューロンなどはすべて32ビットの浮動小数点数(float32)です。
この浮動小数点数のビット数を減らすと(32bit→4bit)、当然モデルのサイズが小さくなり、メモリ使用量も減少します。もちろん、ある程度の精度も落ちます。 なので、単純に4ビットに変換するのではなく、精度をできるだけ落とさないように4ビットに変換する必要があります。
それで、NF4という少し特別な4ビットの形式が提出されました。
NF4について私もよくわからないですが、簡単的に言うと、モデルの重みを平均的に分割して、4ビットでも32ビットの重みを表現できるようにする仕組みみたいです。
あとモデルが推理する時には、自動的に4ビットから32ビットへ戻る機能もあります。そうすると、精度もそこまで落ちないようにできます。量子化はbitsandbytesライブラリを使ってやります。
③量子化されたモデルを直接使う
毎回モデルを読み込む際に量子化するとかなり時間かかりますので、量子化されたモデルをそのままダウンロードして使った方がより便利です。
量子化されたモデルには主にGPTQ、GGUF、AWQの3種類があります。
1.GPTQはGPU向けに特化されたアルゴリズムです。
2.GGUFはCPU向けです。(処理速度は結構遅いですが、GPUがないか、または性能が低いGPUの場合は活用できます。)
3.AWQは先月新しく公開された、GPTQよりも高性能な量子化アルゴリズムです。
特徴としては、量子化する時に重みの重要性を判断する機能があって、重要ではないと判断された重みはスキップ(削除)して、重要な重みだけ量子化することができました。でも実際使ってみた時にはGPTQとあまり違いは感じてなかったです。
AWQ: