「AutoGPTQとtransformersを使ってLLMsを軽量化する」
Using AutoGPTQ and transformers to lightweight LLMs.
大規模な言語モデルは、人間のようなテキストの理解と生成能力を示し、さまざまなドメインでのアプリケーションを革新しています。しかし、訓練と展開における消費者ハードウェアへの要求は、ますます困難になっています。
🤗 Hugging Faceの主なミッションは、良い機械学習を民主化することであり、これには大規模モデルを可能な限りアクセスしやすくすることも含まれます。bitsandbytesコラボレーションと同じ精神で、私たちはTransformersにAutoGPTQライブラリを統合しました。これにより、ユーザーはGPTQアルゴリズム(Frantar et al. 2023)を使用して8、4、3、または2ビット精度でモデルを量子化して実行できるようになりました。4ビットの量子化ではほとんど精度の低下はなく、推論速度は小規模なバッチサイズの場合にはfp16
ベースラインと比較可能です。GPTQメソッドは、校正データセットのパスを必要とする点で、bitsandbytesによって提案された事後トレーニング量子化手法とは若干異なります。
この統合はNvidiaのGPUとRoCm-powered AMDのGPUの両方で利用可能です。
目次
- リソース
- GPTQ論文の簡潔な要約
- AutoGPTQライブラリ – LLMの効率的なGPTQの活用のためのワンストップライブラリ
- 🤗 TransformersでのGPTQモデルのネイティブサポート
- Optimumライブラリを使用したモデルの量子化
- テキスト生成推論を介したGPTQモデルの実行
- PEFTを使用した量子化モデルの微調整
- 改善の余地
- サポートされているモデル
- 結論と最終的な言葉
- 謝辞
リソース
このブログ投稿とリリースには、GPTQ量子化を始めるためのいくつかのリソースが用意されています:
- 元の論文
- 基本的な使用方法のGoogle Colabノートブック – このノートブックでは、GPTQメソッドを使用してトランスフォーマーモデルを量子化する方法、推論を行う方法、および量子化モデルでの微調整を行う方法を示しています。
- Transformersの統合ドキュメント
- Optimumの統合ドキュメント
- 互換性のあるGPTQモデルを持つThe Blokeリポジトリ。
GPTQ論文の簡潔な要約
量子化手法は通常、次の2つのカテゴリに分類されます:
- 事後トレーニング量子化(PTQ):キャリブレーションデータセットと数時間の計算など、中程度のリソースを使用して事前にトレーニングされたモデルを量子化します。
- 量子化意識トレーニング(QAT):トレーニングまたはさらなる微調整の前に量子化が行われます。
GPTQはPTQカテゴリに属し、特に完全なモデルのトレーニングや微調整が非常に高価な場合に興味深いです。
具体的には、GPTQは混合int4/fp16量子化スキームを採用しており、重みはint4で量子化され、活性化はfloat16のままです。推論時には、重みはオンザフライで非量子化され、実際の計算はfloat16で行われます。
このスキームの利点は次の2つです:
- int4量子化によるメモリの節約(重みの非量子化はグローバルメモリではなく、融合したカーネル内のコンピュートユニットの近くで行われるため)。
- 重みに使用されるビット幅の低下によるデータ通信にかかる時間の節約による潜在的な高速化。
GPTQ論文は、レイヤーごとの圧縮問題に取り組んでいます:
重み行列WlW_{l}Wlとレイヤー入力XlX_{l}Xlを持つレイヤーlllが与えられた場合、平均二乗誤差(MSE)を最小化する量子化重みW^l\hat{W}_{l}W^lのバージョンを見つけたいとします:
W^l∗=argminWl^∥WlX−W^lX∥22{\hat{W}_{l}}^{*} = argmin_{\hat{W_{l}}} \|W_{l}X-\hat{W}_{l}X\|^{2}_{2}W^l∗=argminWl^∥WlX−W^lX∥22
一度これが各層ごとに解決されると、層ごとの解の組み合わせによってグローバルな問題の解が得られます。
この層ごとの圧縮問題を解決するために、著者はOptimal Brain Quantizationフレームワーク(Frantar et al 2022)を使用しています。OBQメソッドは、上記の式をWlW_{l}Wlの各行に対する二乗誤差の和として表すことができることから始まります。
これは、各行を独立して量子化することができることを意味します。これはパーチャンネル量子化と呼ばれます。各行Wl[i,:]W_{l[i,:]}Wl[i,:]について、OBQは1つの重みを一度に量子化し、常にまだ量子化されていない重みすべてを更新して、単一の重みを量子化することによって発生するエラーを補償します。選択された重みのアップデートには、ヘシアン行列を利用したクローズドフォームの公式があります。
GPTQ論文は、このフレームワークを改善し、量子化アルゴリズムの複雑さを減らしながらモデルの精度を保持する一連の最適化を導入しています。
OBQと比較して、GPTQでは量子化ステップ自体も高速です。OBQではBERTモデル(336M)の量子化に2時間のGPU時間がかかりますが、GPTQではBloomモデル(176B)の量子化に4時間未満のGPU時間がかかります。
正確なアルゴリズムとパープレキシティと速度のさまざまなベンチマークについて詳しくは、元の論文をご覧ください。
AutoGPTQライブラリ – LLMにGPTQを効率的に活用するためのワンストップライブラリ
AutoGPTQライブラリを使用すると、GPTQメソッドを使用して🤗 Transformersモデルを量子化することができます。GPTQ-for-LLaMa、Exllama、llama.cppなどの並列コミュニティの取り組みは、Llamaアーキテクチャに厳密に量子化メソッドを実装していますが、AutoGPTQは幅広いトランスフォーマーアーキテクチャをスムーズにカバーすることで人気を集めました。
AutoGPTQライブラリはトランスフォーマーモデルのカバレッジが広いため、LLMの量子化をよりアクセスしやすくするために統合🤗 Transformers APIを提供することにしました。現時点では、CUDAカーネルなどの最も一般的な最適化オプションを統合しています。Tritonカーネルや融合注意力互換などのより高度なオプションについては、AutoGPTQライブラリをご覧ください。
🤗 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")
すべての機能について詳しくは、Transformersのドキュメントをご覧ください。
AutoGPTQ統合には多くの利点があります:
- 量子化されたモデルはシリアライズ可能で、Hubで共有することができます。
- GPTQはLLMの実行に必要なメモリ要件を大幅に削減し、推論のレイテンシはFP16推論と同等です。
- AutoGPTQは、幅広いアーキテクチャに対してExllamaカーネルをサポートしています。
- 統合にはAMD GPUのネイティブRoCmサポートがあります。
- PEFTを使用したファインチューニングが利用可能です。
お気に入りのモデルが既に量子化されているかどうかは、Hubで確認できます。Hugging FaceのトップコントリビューターであるTheBlokeは、AutoGPTQを使用して多くのモデルを量子化し、Hugging Face Hubで共有しました。私たちは一緒に作業して、これらのリポジトリが当社の統合と問題なく動作するようにしました。
これはバッチサイズ= 1の場合のベンチマークサンプルです。ベンチマークは単一のNVIDIA A100-SXM4-80GB GPUで実行されました。プロンプトの長さは512で、正確に512の新しいトークンが生成されました。最初の行は量子化されていないfp16
のベースラインで、他の行は異なるAutoGPTQカーネルを使用したメモリ使用量とパフォーマンスを示しています。
より包括的な再現可能なベンチマークはこちらで入手できます。
Optimumライブラリを使用したモデルの量子化
AutoGPTQをTransformersにシームレスに統合するために、OptimumというHugging Faceのトレーニングおよび推論最適化ツールキットに使用可能なAutoGPTQ APIの最小バージョンを使用しました。このアプローチにより、Transformersとの簡単な統合が実現され、自分自身のモデルを量子化したい場合にはOptimum APIを使用できるようになりました!自分自身のLLMを量子化したい場合は、Optimumのドキュメントを参照してください。
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モデルはすでにHugging Face Hubで利用可能であり、ほとんどのユースケースでは自分自身でモデルを量子化する必要はありません。ただし、特定のドメインに適した独自のデータセットを使用してモデルを量子化することもできます。
GPTQモデルをテキスト生成推論に使用する
GPTQをTransformersに統合すると同時に、大規模な言語モデルを本番環境で提供するために開発されたText-Generation-Inferenceライブラリ(TGI)にもGPTQサポートが追加されました。GPTQは、動的バッチ処理、ページ化されたアテンション、フラッシュアテンションなどの機能と併用して、さまざまなアーキテクチャに使用できます。
例えば、この統合により、70Bモデルを単一のA100-80GB GPUで提供することが可能になります!これは利用可能なGPUメモリを超えるため、fp16チェックポイントを使用することはできません。
GPTQのTGIでの使用方法については、ドキュメンテーションを参照してください。
TGIに統合されたカーネルは、大きなバッチサイズにはあまりスケーリングしません。このアプローチはメモリを節約しますが、大きなバッチサイズでは遅延が予想されます。
PEFTを使用して量子化モデルを微調整する
通常の方法では量子化モデルをさらにトレーニングすることはできませんが、PEFTライブラリを活用することで、トップにアダプターをトレーニングすることができます!そのためには、量子化モデルのすべてのレイヤーをフリーズし、トレーニング可能なアダプターを追加します。GPTQモデルとPEFTの使用方法については、コラボノートブックとファインチューニングスクリプトを参照してください。
改善の余地
AutoGPTQの統合は、予測品質のわずかな低下という小さなコストで印象的な利点をもたらします。量子化技術とカーネルの実装の両方には、まだ改善の余地があります。
まず、AutoGPTQは(私たちの知る限りでは)最もパフォーマンスの高いW4A16カーネル(重みをint4、活性化をfp16として)と統合されていますが、カーネルのさらなる改善の余地があります。Kimらによる他の有望な実装やMIT Han Labによる実装など、他の有望な実装が存在します。また、内部のベンチマークからは、Tritonで書かれたオープンソースのパフォーマンスの高いW4A16カーネルはまだ存在しないようですが、これは探索する方向性となるかもしれません。
量子化の側面では、この方法は重みのみを量子化します。LLMの量子化には、重みと活性化の両方を量子化することができるLLM-QATなど、予測品質のわずかなコストで混合int4/int8スキームを使用するなど、他のアプローチが提案されています。また、キーバリューキャッシュの量子化も可能です。この技術の強力な利点の1つは、実際の整数演算を使用できることです。たとえば、Nvidia Tensor Coresはint8演算をサポートしています。ただし、私たちの知る限りでは、オープンソースのW4A8量子化カーネルは存在しないようですが、これも探索する興味深い方向性となる可能性があります。
カーネル側でも、大きなバッチサイズのためのパフォーマンスの良いW4A16カーネルの設計は未解決の課題です。
サポートされているモデル
この初期実装では、デコーダまたはエンコーダのみのアーキテクチャを持つ大規模な言語モデルのみがサポートされています。これは少し制約があるかもしれませんが、Llama、OPT、GPT-Neo、GPT-NeoXなどの最先端のLLMを含んでいます。
非常に大きなビジョン、音声、およびマルチモーダルモデルは現在サポートされていません。
結論と最終的な言葉
このブログポストでは、AutoGPTQライブラリをTransformersに統合し、LLMをGPTQメソッドで量子化してコミュニティ内の誰でも利用しやすくし、LLMを使用したエキサイティングなツールやアプリケーションを構築することが可能になりました。
この統合は、Nvidia GPUとRoCm搭載のAMD GPUの両方で利用できるようになっており、より広範なGPUアーキテクチャのための量子化モデルの民主化に向けた大きな進歩です。
AutoGPTQチームとの協力は非常に実り多く、このライブラリに対する彼らのサポートと彼らの取り組みに非常に感謝しています。
この統合が皆さんのアプリケーションでLLMの使用をより簡単にすることを願っており、皆さんがそれを活用して何を構築するかを楽しみにしています!
GPTQ量子化の統合に関する理解を深めるために、上記で共有された有用なリソースをお見逃しなく。
- オリジナル論文
- 基本的な使用方法のGoogle Colabノートブック – このノートブックでは、GPTQメソッドを使用してトランスフォーマーモデルを量子化する方法、推論を行う方法、および量子化モデルでのファインチューニングを行う方法を示しています。
- Transformers統合ドキュメント
- Optimum統合ドキュメント
- 互換性のあるGPTQモデルを備えたThe Blokeリポジトリ。
謝辞
Williamさんには、素晴らしいAutoGPTQライブラリへのサポートと取り組み、統合へのご協力に感謝いたします。また、TheBlokeさんには、AutoGPTQを使用して多くのモデルを量子化し、Hubで共有してくださったこと、および統合へのご協力に感謝いたします。さらに、次のバージョンのAutoGPTQでリリースされるCPU用のライブラリの拡張に取り組んでくださったqwopqwop200さんにも感謝いたします。
最後に、このブログポストの執筆にご協力いただいたPedro Cuencaさんに感謝いたします。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles