見出し画像

AutoGPTQ と transformers によるLLMの軽量化

以下の記事が面白かったので、かるくまとめました。

Making LLMs lighter with AutoGPTQ and transformers


1. はじめに

「AutoGPTQ」を「transformers」に統合しました。これにより、「GPTQ」を使用して8、4、3、2bitの精度でモデルを量子化して実行できるようになります。4bit量子化による精度の低下は無視でき、小さいバッチサイズの推論速度はfp16ベースラインに匹敵します。この統合は、「Nvidia GPU」と「RoCm搭載AMD GPU 」の両方で利用できます。

2. AutoGPTQ

AutoGPTQ」を使用すると、transformersモデルを量子化できます。「GPTQ-for-LLaMa」「Exllama」「llama.cpp」などのコミュニティの取り組みはLlamaアーキテクチャ専用の量子化手法を実装しているのに対し、「AutoGPTQ」は幅広いtransformers アーキテクチャをスムーズにカバーすることで人気を博しました。

AutoGPTQはモデルをより広範囲にカバーしているため、LLM量子化を誰でも簡単に利用できるように、統合されたTransformers API を提供することにしました。現時点では、CUDAなどの最も一般的な最適化オプションを統合しました。「Triton 」や「fused-attention」などのより高度なオプションについては、「AutoGPTQ」をチェックしてください。

3. transformersでのGPTQのネイティブサポート

AutoGPTQ」と「optimum」 (pip install optimum) をインストールすることで、transformers で GPTQモデルを次のように簡単に実行できます。

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(
    "TheBloke/Llama-2-7b-Chat-GPTQ", 
    torch_dtype=torch.float16, 
    device_map="auto"
)

詳しくはドキュメントを参照してください。

「AutoGPTQ」の統合には多くの利点があります。

・量子化モデルはシリアル化可能であり、Hub上で共有できる。
・GPTQは、LLMを実行するためのメモリ要件を大幅に削減し、推論レイテンシは FP16 推論と同等。
・AutoGPTQは、幅広いアーキテクチャのExllamaカーネルをサポート。
・この統合には、AMD GPUのネイティブRoCmサポートが付属。
・PEFTによるファインチューニングが可能。

お気に入りのモデルがすでに量子化されているかどうかをHubで確認できます。 HuggingFaceのトップコントリビューターの1人であるTheBloke氏は、AutoGPTQ を使用して多くのモデルを量子化し、HuggingFace Hubで共有しました。これらのリポジトリが統合されて機能することを確認しています。

以下はバッチサイズ=1のベンチマークサンプルです。 ベンチマークは、単一の NVIDIA A100-SXM4-80GB GPU で実行しました。 プロンプト長512を使用し、512個の新しいトークンを生成しました。最初の行は量子化されていないfp16ベースラインであり、他の行はさまざまな AutoGPTQ カーネルを使用したメモリ消費量とパフォーマンスを示しています。

より包括的な再現可能なベンチマークは、ここから入手できます。

4. Optimumを使用したモデルの量子化

「AutoGPTQ」をtransformersにシームレスに統合するために、学習と推論の最適化のためのHuggingFaceのツールキットである「Optimum」で利用できる AutoGPTQ API の最小限のバージョンを使用しました。このアプローチに従うことで、transformers との簡単な統合を実現し、同時にユーザーが独自のモデルを量子化したい場合に Optimum API を使用できるようにしました。
詳しくはドキュメントを参照してください。

GPTQを使用したTransformersモデルの量子化は、数行で実行できます。

from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

model_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)
quantization_config = GPTQConfig(bits=4, dataset = "c4", tokenizer=tokenizer)

model = AutoModelForCausalLM.from_pretrained(
    model_id, 
    device_map="auto", 
    quantization_config=quantization_config
)

モデルの量子化には長い時間がかかる場合があります。175Bモデルの場合、大規模なデータセット (例: `"c4"``) を使用する場合、少なくとも 4 GPU 時間が必要であることに注意してください。上で述べたように、多くのGPTQモデルはすでに HuggingFace Hub で利用できるため、ほとんどのユースケースでモデルを自分で量子化する必要はありません。

5. TGIによるGPTQモデルの実行

transformers へのGPTQの統合と並行して、運用環境で大規模な言語モデルを提供することを目的として、「Text-Generation-Inference」 (TGI) にGPTQのサポートが追加されました。 GPTQは、幅広いアーキテクチャで動的バッチ処理、ページ アテンション、フラッシュ アテンションなどの機能と併用できるようになりました。

たとえば、この統合により、単一の A100-80GB GPU で 70B モデルを提供できるようになります。fp16 チェックポイントを使用すると、利用可能な GPU メモリを超えるため、これは不可能です。

詳しくはドキュメントを参照してください。

6. PEFTによる量子化モデルのファインチューニング

通常の方法では、量子化モデルをさらに学習することはできません。 ただし、「PEFT」を活用すると、アダプター上で学習できます。 これを行うには、量子化モデルのすべての層をフリーズし、学習可能なアダプターを追加します。 GPTQモデルでPEFTを使用する方法の例をいくつか示します。

Colab ノートブック
ファインチューニングスクリプト

7. サポートモデル

今回の統合では、デコーダーまたはエンコーダーのみのアーキテクチャを持つLLMのみがサポートされます。これは制限的に聞こえるかもしれませんが、「Llama」「OPT}「GPT-Neo」「GPT-NeoX」などのほとんどの最先端のLLMが含まれます。ビジョン、オーディオ、マルチモーダルモデルは現在サポートされていません。



この記事が気に入ったらサポートをしてみませんか?