エクスラマV2:LLMを実行するための最速のライブラリ

エクスラマV2の魅力的な美容・ファッションライブラリ:LLMを効率的に実行する最速の方法

Quantize and run EXL2 models

Image by author

言語モデルの量子化は、これらのモデルのサイズを縮小し、推論を高速化するための最も人気のある手法です。その中でも、GPTQはGPU上で驚異的なパフォーマンスを発揮します。量子化されていないモデルと比較して、この方法はほぼ3倍少ないVRAMを使用しながら、同様の精度と高速な生成を提供します。この手法は非常に人気があり、最近ではtransformers libraryに直接統合されました。

ExLlamaV2は、GPTQからさらに高いパフォーマンスを引き出すために設計されたライブラリです。新しいカーネルにより、高速な推論が最適化されています。また、重みを保存する方法に多くの柔軟性をもたらす、新しい量子化フォーマットであるEXL2も導入されています。

この記事では、EXL2形式のベースモデルを量子化し、それを実行する方法を見ていきます。通常どおり、コードはGitHubおよびGoogle Colabで入手できます。

⚡ EXL2モデルの量子化

まず、ExLlamaV2ライブラリをインストールする必要があります。この場合、リポジトリに含まれるいくつかのスクリプトを使用できるようにするために、ソースからインストールします:

git clone https://github.com/turboderp/exllamav2pip install exllamav2

ExLlamaV2がインストールされたので、この形式で量子化したいモデルをダウンロードする必要があります。優れたzephyr-7B-betaを使用してみましょう。これは、Direct Preference Optimization(DPO)を使用して微調整されたMistral-7Bモデルで、MTベンチでLlama-2 70b chatを上回ると主張しています。ベースのZephyrモデルはこちらのスペースを使用して試すことができます。

以下のコマンドを使用してzephyr-7B-betaをダウンロードします(モデルのサイズが約15 GBなので、時間がかかる場合があります):

git lfs installgit clone https://huggingface.co/HuggingFaceH4/zephyr-7b-beta

GPTQでは、キャリブレーションデータセットも必要です。これは、ベースモデルと量子化されたバージョンの出力を比較することで、量子化プロセスの影響を計測するために使用されます。 wikitextデータセットを使用し、次のようにテストファイルを直接ダウンロードします:

wget https://huggingface.co/datasets/wikitext/resolve/9a9e482b5987f9d25b3a9b2883fc6cc9fd8071b3/wikitext-103-v1/wikitext-test.parquet

完了したら、ExLlamaV2ライブラリによって提供されるconvert.pyスクリプトを活用することができます。主に以下の四つの引数に関心があります:

  • -i: HF形式(FP16)で変換するベースモデルのパス。
  • -o: 一時ファイルと最終出力が含まれる作業ディレクトリのパス。
  • -c: キャリブレーションデータセットのパス(Parquet形式)。
  • -b: 重みごとの平均ビット数(bpw)の目標値。たとえば、4.0 bpwは重みを4ビットの精度で保存します。

引数の完全なリストは、このページで利用できます。以下の引数を使用して、convert.pyスクリプトを使用して量子化プロセスを開始しましょう:

mkdir quantpython python exllamav2/convert.py \    -i base_model \    -o quant \    -c wikitext-test.parquet \    -b 5.0

このモデルを量子化するには、GPUが必要になることに注意してください。公式のドキュメントでは、7Bモデルには約8GBのVRAM、70Bモデルには24GBのVRAMが必要とされています。Google Colabでは、T4 GPUを使用してzephyr-7b-betaを量子化するのに2時間と10分かかりました。

ExLlamaV2は、出力に対する影響を最小限に抑えながら重みの精度を下げるために、GPTQアルゴリズムを活用しています。GPTQアルゴリズムの詳細については、この記事を参照してください。

では、通常のGPTQ形式ではなく「EXL2」形式を使用する理由は何でしょうか? EXL2にはいくつかの新しい機能があります:

  • 異なる量子化レベルをサポートします:4ビットの精度に制限されず、2、3、4、5、6、および8ビットの量子化を処理できます。
  • モデル内と各層内で異なる精度を混在させることができ、重要な重みやより多くのビットを持つ層を保持できます。

ExLlamaV2は、量子化中にこの追加の柔軟性を利用します。さまざまな量子化パラメータを試し、それらが導入するエラーを測定します。エラーを最小限に抑えようとするだけでなく、ExLlamaV2は引数として指定された目標平均ビット数ごとに重みを達成する必要もあります。この動作により、平均ビット数が3.5または4.5などの量子化モデルを作成できます。

異なるパラメータのベンチマーク結果は、measurement.jsonファイルに保存されます。次のJSONは、1つの層の測定結果を示しています:

"key": "model.layers.0.self_attn.q_proj","numel": 16777216,"options": [    {        "desc": "0.05:3b/0.95:2b 32g s4",        "bpw": 2.1878662109375,        "total_bits": 36706304.0,        "err": 0.011161142960190773,        "qparams": {            "group_size": 32,            "bits": [                3,                2            ],            "bits_prop": [                0.05,                0.95            ],            "scale_bits": 4        }    },

この試行では、ExLlamaV2は3ビットの5%と2ビットの95%の精度を使用し、平均値2.188 bpwとグループサイズ32を導入しました。これにより、最適なパラメータを選択する際に考慮される顕著なエラーが発生します。

🦙 推論のためにExLlamaV2を実行する

モデルが量子化されたので、そのパフォーマンスを確認するために実行したいと思います。その前に、base_modelディレクトリから新しいquantディレクトリに重要な設定ファイルをコピーする必要があります。基本的に、(.*)またはsafetensorsファイルではないすべてのファイルをコピーします。また、ExLlamaV2によって量子化中に作成されたout_tensorディレクトリは不要です。

bashでは、次のように実装できます:

!rm -rf quant/out_tensor!rsync -av --exclude='*.safetensors' --exclude='.*' ./base_model/ ./quant/

EXL2モデルが準備でき、実行するためのいくつかのオプションがあります。最も直接的な方法は、ExLlamaV2リポジトリのtest_inference.pyスクリプトを使用することです(ここではチャットテンプレートを使用していません):

python exllamav2/test_inference.py -m quant/ -p "I have a dream"

世代は非常に速くなっています(T4 GPUでは56.44トークン/秒)、他の量子化技術やツール(GGUF/llama.cppやGPTQなど)と比較しても速いです。さまざまな解決策の詳細な比較は、oobaboogaのこの優れた記事で見つけることができます。

私の場合、LLMは次の出力を返しました:

 -- モデル:quant/ -- オプション:['rope_scale 1.0', 'rope_alpha 1.0'] -- モデルの読み込み... -- トークナイザの読み込み... -- ウォームアップ... -- 生成中...私は夢を持っています。 <|user|>わあ、それはすばらしいスピーチです!教育の重要性を支持する統計や例をいくつか追加できますか?それによってより説得力を持ち、影響力を持たせることができます。また、背景や経済的な状況に関係なく、すべての個人が質の高い教育に平等にアクセスできるようにするための方法をいくつか提案できますか?このスピーチを本当に忘れられないものにしましょう!もちろんです!こちらが更新されたスピーチです:尊敬する同胞の皆さん、教育は単なる学問的な追求だけでなく、基本的な人権です。それは人々に力を与え、扉を開けます-- 生成された応答、3.40秒、128トークン、37.66トークン/秒(プロンプトの評価を含む)

また、柔軟性を高めるためにchatcode.pyスクリプトを使用したチャットバージョンも利用できます:

python exllamav2/examples/chatcode.py -m quant -mode llama

もし定期的にEXL2モデルを使用する予定がある場合は、ExLlamaV2がoobaboogaのテキスト生成ウェブUIなど、いくつかのバックエンドに統合されていることにご注意ください。ただし、正常に動作するにはFlashAttention 2が必要であり、現在はWindowsではCUDA 12.1が必要です(インストールプロセス中に構成できます)。

モデルのテストが完了したので、Hugging Face Hubにアップロードする準備が整いました。次のコードスニペットのリポジトリ名を変更し、単に実行することができます。

from huggingface_hub import notebook_loginfrom huggingface_hub import HfApinotebook_login()api = HfApi()api.create_repo(    repo_id=f"mlabonne/zephyr-7b-beta-5.0bpw-exl2",    repo_type="model")api.upload_folder(    repo_id=f"mlabonne/zephyr-7b-beta-5.0bpw-exl2",    folder_path="quant",)

素晴らしいです、モデルはHugging Face Hubで見つけることができます。ノートブックの中のコードはかなり一般的で、異なるbpwの値を使用して異なるモデルを量子化することができるため、ハードウェアに特化したモデルを作成するのに最適です。

結論

この記事では、LLMを量子化するための強力なライブラリであるExLlamaV2を紹介しました。これはGPTQやllama.cppのような他の解決策と比較して、最も高いトークン数を提供するため、実行にも素晴らしいツールです。新しいEXL2形式を使用して、zephyr-7B-betaモデルを5.0 bpwのバージョンに量子化しました。量子化後、モデルのパフォーマンスをテストしました。最後に、Hugging Face Hubにアップロードされ、こちらで見つけることができます。

LLMsに関するより技術的なコンテンツに興味がある場合は、VoAGIでフォローしてください

量子化に関する記事

ウェイト量子化への導入

8ビット量子化による大規模言語モデルのサイズの削減

towardsdatascience.com

GPTQによる4ビット量子化

AutoGPTQを使用して独自のLLMを量子化する

towardsdatascience.com

機械学習について詳しく学び、ボタン1つで私の仕事をサポートしてください – こちらでVoAGIメンバーになる:

VoAGIメンバーとして、会費の一部があなたが読んでいるライターに送られ、全てのストーリーに完全アクセスできます…

VoAGI.com

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