GGML/GGUF/GPTQの違い
whisper.cppとかllama.cppとかのモデルを見てると、GGMLとかGGUFとかGPTQとか色々なフォーマットが出てくる。これまでは適当に雰囲気で選んでいたんだけど、ちゃんとを調べてみた。
GGML
ChatGPTやBardなどで利用されているチャットAIは、トレーニングだけでなく動作させるのにも数十~数百GBのVRAMなど非常に高いマシンスペックを要求するのが一般的です。そうした状況を変えるべく、GPU不要でチャットAIを動作させるライブラリ「GGML」の開発が進められています。
ggml.ai
http://ggml.ai/ggerganov/ggml: Tensor library for machine learning
https://github.com/ggerganov/ggml
GGMLの特徴は下記の通り。
・Cで記述
・16bit floatをサポート
・4bit、5bit、8bitの整数での量子化をサポート
・自動微分
・「ADAM」「L-BFGS」という最適化アルゴリズムを搭載
・Appleシリコンへの対応&最適化
・x86アーキテクチャではAVXおよびAVX2を使用
・WebAssemblyとWASM、SIMDによるウェブのサポート
・サードパーティーへの依存性なし
・動作中にメモリを使用しない
・ガイド付き言語出力をサポート
GGUF
「llama.cpp」で使われているGGMLファイルが「GGUF」という新フォーマットに変更されるとのこと。
フォーマット変更の要点
- GGUFは、GGMLよりも拡張性の高いファイルフォーマット。「.bin」から「.gguf」になる。
- これにより、Llama以外の言語モデル(falcon, rwkv, bloom, etc.)がllama.cppでサポートできるようになる。サポートするモデルは段階的に増える予定。
- その他、プロンプトフォーマットをGGUF内に設定しておけるようなったり、rope-freq-baseやgqaなどの一部パラメータが不要になる予定。
- 破壊的変更であり、既存のggmlモデルは「GGUF #2398」のマージ後は使えなくなる(有志がGGML>GGUFの変換スクリプトを作成中)
GPTQ
- ローカルLLMの量子化フォーマットとしては、llama.cpp(GGUF/GGML)とGPTQの2種類が広く使われている。
- llama.cppによる量子化は、Readmeに説明されている手順で手軽に行える(CPUのみで処理が完結)。
Transformersモデルを量子化する🤗
AutoGPTQの統合
🤗 Transformers には、言語モデルで GPTQ 量子化を実行するための optimum API が統合されています。モデルを 8、4、3、さらには 2 ビットでロードおよび量子化することで、パフォーマンスを大幅に低下させることなく、推論速度を高速化します!これは、ほとんどの GPU ハードウェアでサポートされています。
「AutoGPTQ」を使用すると、transformersモデルを量子化できます。「GPTQ-for-LLaMa」「Exllama」「llama.cpp」などのコミュニティの取り組みはLlamaアーキテクチャ専用の量子化手法を実装しているのに対し、「AutoGPTQ」は幅広いtransformers アーキテクチャをスムーズにカバーすることで人気を博しました。
量子化そのものの学習を行い、元のモデルと量子化後のモデルの性能誤差を限りなく小さくしている(量子化の最適化をしている)
量子化はざっくり言うと情報量を削減して軽量化すること
(本来であれば性能が劣化するのであるが、元のモデルとの性能差が小さくなるように最適化している)
- 雑に「量子化」の手法・モデル・フォーマットって感じで良さそう。
- 今からならGGMLは気にしなくて良さそう。
- llama.cppならGGUF、TransformerならGPTQって感じ?
でいずれのフォーマットを使うにせよ、ローカルLLM試した人は1回はここを見てるはず。
各READMEにちゃんと書いてあった(GPTQは書いてないけど);p
その他
結局雰囲気やなー
AWQというのが出てきた様子
GPTQよりも性能が高い量子化アルゴリズムっぽい。
GPTQのキャリブレーションセット
GPTQ は、量子化モデルを使用する前に重みのキャリブレーションを必要とする量子化手法です。トランスフォーマーモデルを最初から量子化する場合は、量子化モデルを作成するまでに時間がかかる場合があります (facebook/opt-350mの場合、Google colabで約 5 分)。
モデルをロードして量子化するには、GPTQConfigを作成する必要があります。ビット数、量子化をキャリブレーションするためのデータセット、データセットを準備するためのモデルのトークナイザーを渡す必要があります。
なお、独自のデータセットを文字列のリストとして渡すこともできます。しかし、GPTQ論文のデータセットを使うことを強く推奨します。
GPTQにはキャリブレーションセットなるデータセットが必要になる。例えば
stabilityaiさんが公開している、japanese-stablelm-base-gamma-7bを、 日本語のキャリブレーションセットで生成したGPTQモデルになります。
キャリブレーションセットはizumi-lab/wikipedia-ja-20230720から、 1kほどランダムサンプリングしています。
Importance Matrixは、llama.cppのikawrakow氏が取り組んでいる一連の量子化精度改善の中心的なアイディアのようで、特に2-3bitの極端な量子化においてモデルの劣化を大きく抑制する効果があるようです。
GPTQ量子化などと同じように量子化時にトレーニングデータセットを使うことで量子化の精度を改善する手法のようです。
ExLlamaV2
LlamaのスタンドアロンPython/C++/CUDA実装で、4ビットGPTQウェイトで使用され、最新のGPUで高速でメモリ効率が良いように設計されています。
一応量子化手法ということでいいのかな、exl2という呼び方になってるっぽい。