「HuggingFaceを使用したLlama 2 7B Fine-TunedモデルのGPTQ量子化」

HuggingFaceを使用したLlama 2 7B Fine-TunedモデルのGPTQ量子化

LLMの量子化に関する簡単なガイド

UnsplashのMilad Fakurianによる画像

前回の記事では、Meta AIによってリリースされた新しいLlama 2モデルをファインチューニングして、わずか数行のコードでPythonコードジェネレータを構築する方法を紹介しました。今回は、このモデルをtransformersと統合したGPTQ量子化を使用して量子化する方法について説明します。

Hugging Faceは先週、transformersライブラリをAutoGPTQライブラリと互換性があることを発表しました。これにより、GPTQの方法を使用して、2ビット、3ビット、または4ビットで大規模な言語モデルを量子化することができます。

GPTQ:生成モデルにおける事後トレーニング量子化

画期的な論文[1]で、研究者たちはGPTQという画期的な事後トレーニング量子化手法を発表しました。この手法は、言語モデルの圧縮の世界を再構築する可能性を持っています。GPTQは、数百億ものパラメータを持つモデルに適用できるだけの効率性を持ち、重要な精度の低下を伴わずにこれらのモデルをわずか2ビット、3ビット、または4ビットのパラメータに圧縮することができます。

この先端技術は、OPT-175BやBLOOM-176Bなどの大規模なモデルをわずかなGPU時間で量子化する能力を示しています。これらの圧縮モデルを生成タスクに効率的に運用するための実行ハーネスも開発されています。驚くべきことに、研究者たちは、圧縮されたOPT-175Bモデルを単一のNVIDIA A100 GPUで実行するというマイルストーンを達成しました。また、圧縮に最適化された専用のGPUカーネルにより、著しい高速化が実現され、これらの圧縮モデルの実用性がさらに向上しています。

GPTQの特徴は、数百億のパラメータを持つ言語モデルを3〜4ビット/コンポーネントの範囲に量子化できることです。これは大きな進歩です。従来の手法では8ビット以下の精度を維持することが難しく、通常はより小さなモデルに焦点を当てていました。ただし、この研究は、圧縮によって引き起こされる困難なトレードオフ、つまりパープレキシティ、ビット幅、およびモデルサイズの複雑な関係を強調しています。ただし、これには制約事項もあります。GPTQは現在、メインストリームのアーキテクチャで混合精度オペランドのハードウェアサポートがないため、実際の乗算の高速化を提供していません。また、現在の結果にはアクティベーションの量子化も含まれていませんが、別の手法で対処することができます。

要約すると、GPTQは非常に正確な言語モデルを前例のないレベルで圧縮する能力により、機械学習と言語モデリングの分野で重要なマイルストーンを築いています。これにより、これらの巨大なモデルのより効率的でアクセス可能なアプリケーションへの道が開かれ、モデルの圧縮に関するさらなる研究の可能性が示唆されています。

機械学習における量子化手法は、独自の利点を持つ2つの異なるアプローチに分類できます:

  1. 事後トレーニング量子化(PTQ):PTQでは、事前にトレーニングされたモデルをキャリブレーションデータセットと数時間の計算時間など、比較的限られたリソースを使用して量子化します。この方法は、完全な再トレーニングやファインチューニングがコスト的に制約がある大規模なモデルに特に有益です。
  2. 量子化対応トレーニング(QAT):一方、QATでは、モデルのトレーニング前またはその後のファインチューニング時に量子化が適用されます。

GPTQの革新的なアプローチ:GPTQはPTQのカテゴリーに属し、巨大なモデルにとって魅力的な選択肢となっています。GPTQの特徴的な点は、混合int4/fp16量子化スキームの採用です。ここでは、モデルの重みはint4で量子化され、アクティベーションはfloat16で保持されます。推論時には、重みが動的に非量子化され、実際の計算はfloat16で行われます。

この革新的なアプローチにより、int4量子化によるメモリの節約が約4倍になり、重みに使用される帯域幅の低下による高速化の可能性が生まれます。実際には、GPTQは既にファインチューニングされて展開の準備が整ったモデル向けの量子化手法です。この手法は、モデルの重みの精度を4ビットまたは3ビットに減らすのに特に効果的ですが、主に4ビットの量子化に使用されます。

GPTQの主な特徴の1つは、モデル全体をメモリに読み込む必要なく、モデルを量子化する能力です。代わりに、モジュールごとにモデルを量子化し、量子化プロセス中のメモリ要件を大幅に削減します。ただし、キャリブレーションには少量のデータが必要であり、典型的なコンシューマーGPUでは1時間以上かかる場合があります。

Auto-GPTQパッケージのPythonfixからの画像

GPTQの詳細な説明については、Towards Data Scienceで公開されたMaxime Labonne氏の素晴らしい記事「GPTQによる4ビット量子化」を読むことをお勧めします。この記事では、このプロセスの詳細を理解したい人のために、より技術的な側面に深く踏み込んでいます。

また、Benjamin Marie氏による便利な記事「GPTQまたはbitsandbytes:LLMsに使用する量子化方法—Llama 2を例にした比較」も強くお勧めします。そこでは、GPTQとbitsandbytesの量子化、その利点と欠点の比較が示されており、それぞれの技術を適用する際の適切なタイミングをよりよく理解することができます。

GPTQを使用すべきタイミング

この質問の答えは、各具体的なケースや使用するベースモデルによって異なりますが、HuggingFaceや前述の記事が示すアプローチは次のとおりです:

  • bitsandbytesを使用して元のLLMモデルを4ビットのnf4およびQLoRaで微調整します。
  • アダプタを元のモデルに統合します。
  • 結果のモデルをGPTQで4ビットに量子化します。

私は以前の記事[3]で最初の2つのステップを実行しました。そして、AutoGPTライブラリがHuggingfaceエコシステムと統合されたことにより、3番目のステップを非常に簡単に実行することができるようになりました。

Hugging Face transformersとの統合

AutoGPTQライブラリは、効率的なGPTQメソッドを使用してTransformerモデルを量子化するための強力なツールとして登場しています。GPTQ-for-LLaMa、Exllama、llama.cppなどのような取り組みは、Llamaアーキテクチャの量子化に焦点を当てていますが、AutoGPTQはさまざまなトランスフォーマーアーキテクチャの完全なサポートを提供することで異なっています。

Hugging Faceチームは、GPTQへのアクセシビリティを向上させるための重要なステップを踏みました。彼らは包括的なTransformers APIを統合し、より広範なユーザーにとってLow-Level Model (LLM)の量子化プロセスを簡素化しています。この統合には、CUDAカーネルなどの重要な最適化オプションが含まれており、一般的なユースケースに対応しています。

より高度な量子化オプションを求めるユーザーにとって、Auto-GPTQライブラリは貴重なリソースであり、Tritonカーネルや融合注意互換性などの機能を提供し、トランスフォーマーモデルの量子化において柔軟性と適応性を確保しています。

AutoGPTQの統合には次のような多くの利点があります:

量子化モデルは直列化され、ハブで共有することができます。

GPTQはLLMの実行に必要なメモリ要件を劇的に削減し、推論の遅延はFP16推論と同等です。

AutoGPTQはさまざまなアーキテクチャに対してExllamaカーネルをサポートしています。

統合には、AMD GPU向けのネイティブRoCmサポートが含まれています。

PEFTによる微調整が可能です。

Huggingfaceのブログ記事「AutoGPTQとtransformersでLLMsを軽量化する」[5]から抜粋しました。

このタスクへのアプローチ

まず、追加のRAMを備えたT4を使用して、ColabセッションでファインチューンされたLlama 2 7B 4ビットPythonコーダのモデルをロードします。モデルはbitsandbytesを使用して4ビットでロードされ、その後、推論時間を測定するために約12の例を実行します。推論時間のパフォーマンスを単純に評価するために、入力テキストが500文字以上の例を選んだので、量子化の影響をよりよく把握できるでしょう。

モデルの説明で、このモデルをロードするためのコードを抽出することができます。ハギングフェイスハブのモデルの説明に記載されています。このノートブックでは、具体的な例を使って推論を行う方法について説明します。

auto-gptq、🤗 transformers、optimumを使用してモデルを量子化する

GPTQ量子化は、多くのGPU VRAMを消費します。そのため、A100 GPUをColabで実行する必要があります。モデルの量子化には約45分かかり、Colabでは$1未満です。このノートブックのコードは、私のリポジトリで見つけることができます。

まず、Hugging Faceのチュートリアルで推奨されている通り、ライブラリをインストールする必要があります:

!pip install -q -U transformers peft accelerate optimum!pip install auto-gptq --extra-index-url https://huggingface.github.io/autogptq-index/whl/cu117/# 今のところ、AutoGPTQの次のリリースまで、ソースからライブラリをビルドします!

トレーニングと推論の最適化のためのHugging FaceのツールキットであるOptimumライブラリは、AutoGPTQをTransformersに統合します。

GPTQアルゴリズムでは、量子化されたモデルの量子化された重みを推論しながらキャリブレーションする必要があります。auto-gptqを使用してモデルを量子化するには、データセットを量子化器に渡す必要があります。これは、サポートされているデフォルトのデータセット([‘wikitext2′,’c4′,’c4-new’,’ptb’,’ptb-new’])のいずれか、またはカスタムデータセットのリストを渡すことで実現できます。

今、通常のtransformersと同様に、GPTQ設定を使用してモデルをロードするだけです。非常に簡単です:

from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfigimport torch# モデルの設定hf_model_repo='edumunozsala/llama-2-7b-int4-python-code-20k'# トークナイザーのロードtokenizer = AutoTokenizer.from_pretrained(hf_model_repo, use_fast=True)# 量子化の設定quantization_config = GPTQConfig(     bits=4,     group_size=128,     dataset="c4",     desc_act=False,     tokenizer=tokenizer)# HFからモデルのロードquant_model = AutoModelForCausalLM.from_pretrained(hf_model_repo,                 quantization_config=quantization_config, device_map='auto')

先述の通り、このコードの実行には約45分かかり、GPU VRAMのピーク時に32 GB消費します。「モデルを量子化するにはGPUが必要です。モデルをCPUに置き、モジュールをGPUに移動して量子化します。CPUオフロードを使用しながらGPUの使用率を最大化したい場合は、device_map = "auto"を設定できます」とHugging Faceのドキュメント[6]に記載されています。

パラメータは自己説明的です。4ビットの量子化、C4データセット、および量子化中に使用するトークナイザーです。残りの2つのパラメータはデフォルト値を取ります:

  • group_size:量子化に使用するグループサイズ。推奨値は128で、-1は列ごとの量子化を使用します。
  • desc_act:活性化サイズの減少順に列を量子化するかどうか。これをFalseに設定すると、推論の速度が大幅に向上しますが、困惑度はわずかに悪くなる場合があります。また、act-orderとも呼ばれます。

モデルを量子化したら、Huggin Face Hubにアップロードしてコミュニティと共有する時が来ました。

quant_model.push_to_hub("edumunozsala/llama-2-7b-int4-GPTQ-python-code-20k")tokenizer.push_to_hub("edumunozsala/llama-2-7b-int4-GPTQ-python-code-20k")

GPTQを使用した実験では、モデルサイズの削減が顕著です。「私のファインチューニングされたLlama 2 7Bモデルは、重みが4ビットで13.5 GBでしたが、量子化後はわずか3.9 GBに大幅に削減されました」と述べています。元のサイズの3分の1です。大規模な言語モデルを展開する際に非常に魅力的な機能です。

Hugging Face HubからGPTQモデルをロードし、推論を行う

おそらく、皆さんはそれをやり方を知っているかもしれませんが、他のモデルよりもこれがより「トリッキー」になるかもしれないと思う場合に備えて、通常通りであることを示します。

覚えておいてください、optimum、accelerate、そしてもちろん、auto-gptqを含むすべてのライブラリをロードする必要があります。

!pip install -q -U transformers peft accelerate optimum!pip install auto-gptq

次に、Google ColabのT4 GPUにトークナイザとモデルをアップロードできます:

import torchfrom transformers import AutoModelForCausalLM, AutoTokenizermodel_id = "edumunozsala/llama-2-7b-int4-GPTQ-python-code-20k"tokenizer = AutoTokenizer.from_pretrained(model_id)model = AutoModelForCausalLM.from_pretrained(model_id,                   torch_dtype=torch.float16, device_map="auto")

今、GPUのメモリを確認して、実際にモデルが5,053 GBを占有していることを確認できます。

先ほど述べたパフォーマンス評価を繰り返し、長い例を推論して元のモデルと比較します。両方の推論プロセスはT4 GPU上で実行され、ベースモデルは推論ごとに約17-19秒かかり、量子化モデルは約8-9秒で実行されます、半分の時間です。

すべてのコードと例は、私のリポジトリのノートブックで詳しく説明されています。ご意見やバグ修正は歓迎です。

参考文献

[1] ICLR 2023論文「GPTQ: Accurate Post-Training Quantization for Generative Pre-Trained Transformers」

[2] Benjamin Marieによる「GPTQまたはbitsandbytes:LLMsに使用する量子化方法- Llama 2の例」

[3] Eduardo Muñozによる「Pythonコード生成用のLlama 2 7Bモデルのファインチューニング」

[4] Huggingfaceの元のファインチューニングモデル「edumunozsala/llama-2–7b-int4-python-code-20k」

[5] Hugging Faceブログ記事「AutoGPTQとtransformersでLLMsを軽量化する」

[6] Hugging Face公式ドキュメント「GPTQConfigについて」

[7] Maxime Labonneによる「GPTQによる4ビットの量子化」

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more