QLoRA: 定量的 LLM の効率的な微調整戦略と実践

この記事に興味があり、AI 分野の実践的なスキルについて詳しく知りたい場合は、「Technology Frenzy AI」公開アカウントをフォローしてください。ここでは、AIGC 分野の最新の注目記事や実践的な事例チュートリアルをご覧いただけます。

I.はじめに

大規模言語モデル (LLM) の分野では、微調整はパフォーマンスを向上させ、動作を調整するための重要なプロセスです。ただし、大規模なモデルの微調整には、膨大なメモリ要件があるため、非常にコストがかかる可能性があります。最近、ワシントン大学はこの問題に対する革新的な解決策、QLoRA (Quantized Low-Rank Adaptor) を発表しました。

QLoRA は、速度を維持しながらメモリを節約する大規模言語モデル (LLM) を微調整するための新しい方法です。動作原理は、最初に LLM を 4 ビットで量子化し、それによってモデルのメモリ フットプリントを大幅に削減することです。次に、量子化された LLM は、低次アダプター (LoRA) メソッドを使用して微調整されます。LoRA により、改良されたモデルは元の LLM の精度のほとんどを維持しながら、より小型で高速になります。

上記は QLoRA の簡単な紹介であり、その原理と応用については以下でさらに説明します。

2. QLoRA の概要

QLoRA は、勾配を低次アダプター (LoRA) に逆伝播することでメモリ使用量を大幅に削減する効率的な微調整方法です。単一の 48 GB GPU で 650 億のパラメーター モデルを微調整し、完全な 16 ビット微調整タスクのパフォーマンスを維持できます。

Guanaco と呼ばれる新しいモデル ファミリも発売され、Vicuna ベンチマークで良好なパフォーマンスを示し、ChatGPT パフォーマンス レベルの 99.3% に達しました。驚くべきことは、単一の GPU をわずか 24 時間の微調整でこのような優れた結果を達成できることです。これらの革新により、限られたリソースでより効率的な方法でモデルの微調整が可能になり、非常に満足のいく結果が得られます。

QLoRA は、革新的で微調整された LLM 手法であり、テキスト分類、質問応答、自然言語生成などの複数のタスクで検証され、さまざまな分野でその有効性が証明されています。この手法の登場により、より広範囲のユーザーやアプリケーションに LLM を適用するためのより便利な方法が提供され、さまざまな分野での LLM の適用がさらに促進されることが期待されます。

2.1.主要なイノベーション

従来の LoRA (低ランク アダプター) と QLoRA (量子化 LoRA) はどちらも、大規模な言語モデルを微調整し、メモリ要件を削減するための方法です。ただし、QLoRA では、パフォーマンスを維持しながらメモリ使用量をさらに削減するために、いくつかの革新が導入されています。2 つの方法の比較は次のとおりです。

ロラ:

  • - モデル全体のパラメーターを固定したまま、トレーニング可能なパラメーター (アダプター) の小さなセットを使用します。

  • - 確率的勾配降下中の勾配は、事前にトレーニングされた固定モデルの重みを介してアダプターに渡され、損失関数を最適化するために更新されます。

  • - 完全な微調整よりもメモリ効率が高くなりますが、それでもトレーニングには 16 ビットの精度が必要です。

QLoRA:

  • - 凍結された 4 ビット量子化された事前トレーニング済み言語モデルを介した、低次アダプター (LoRA) への勾配の逆伝播。

  • - 4 ビット NormalFloat (NF4) の導入。これは正規分布データに対して情報理論的に最適な量子化データ型であり、4 ビット整数や 4 ビット浮動小数点よりも優れた経験的結果を生成します。

  • - 量子化定数を量子化する方法である二重量子化を適用すると、パラメーターあたり平均約 0.37 ビットが節約されます。

  • - NVIDIA 統合メモリでページング オプティマイザを使用して、シーケンス長の長いミニバッチを処理する際の勾配チェックポイント中のメモリのスパイクを回避します。

  • - 16 ビットの完全に微調整されたベースラインと比較してメモリ要件が大幅に削減され、ランタイムや予測パフォーマンスを低下させることなく、単一の 48GB GPU で 65B パラメータ モデルの微調整が可能になります。

要約すると、QLoRA は従来の LoRA を基盤としており、4 ビット量子化、4 ビット NormalFloat データ型、二重量子化、およびページング オプティマイザーを導入して、16 ビット微調整メソッドと同等のパフォーマンスを維持しながらメモリ使用量をさらに削減します。

2.2 パフォーマンス分析

モデルのサイズとチャットボットのパフォーマンスを詳細に調査した結果、いくつかの興味深い結果が明らかになりました。メモリのオーバーヘッド制限により、従来の微調整方法は使用できません。そのため、特別な命令の微調整方法を使用して、複数のデータセット、異なるモデル アーキテクチャ、パラメーター数でトレーニングし、合計 1000 を超えるモデルをトレーニングしました。

この結果は、以前の最先端モデルよりも小さなモデルを使用した場合でも、小規模で高品質なデータセットを QLoRA で微調整することで最先端の結果を達成できることを示しています。これは、データ品質がデータ セットのサイズよりもモデルのパフォーマンスにはるかに大きな影響を与えることを示しています。この発見は、チャットボットのパフォーマンスを最適化するための重要な指針となります。

評価は、QLORA を使用して OASST1 のバリアント向けに微調整された Guanaco 65B モデルで実行されました。結果は、これが最もパフォーマンスの高いオープンソース チャットボット モデルであり、そのパフォーマンスが ChatGPT に匹敵することを示しています。GPT-4 と比較して、Guanaco 65B および 33B の期待勝率は 30% です。

  • Vicuna ベンチマークでは、Guanaco 65B は GPT-4 に次いで最高のパフォーマンスを示し、ChatGPT と比較して 99.3% のパフォーマンスを達成しました。Guanaco 33B モデルはパラメーターが多いにもかかわらず、重みで 4 桁の精度のみを使用するため、Vicuna 13B モデルよりもメモリ効率が高くなります。さらに、Guanaco 7B は最新の電話機にインストールでき、Alpaca 13B を 20 パーセント近く上回ります。

  • 結果は印象的ですが、多くのモデルは信頼区間が広く重複するパフォーマンスを示します。著者らは、この不確実性の原因を、明確なスケーリング仕様が欠如していることにあると考えています。この問題を解決するために、彼らはヒューマン・アノテーターと GPT-4 のペアごとの判断に基づく Elo ランキング手法を使用することを提案しています。

  • Elo ランキングによると、Guanaco 33B および 65B モデルは Vicuna および OA ベンチマークで GPT-4 を除くすべてのモデルを上回り、ChatGPT と同等のパフォーマンスを示します。ただし、微調整データセットの選択はパフォーマンスに大きく影響し、データセットの適合性が重要であることがわかります。

3. QLoRA を使用して GPT モデルを微調整する

3.1. QLoRA のハードウェア要件:

  • GPU: GPT-J など、パラメーターが 200 億未満のモデルの場合は、少なくとも 12 GB VRAM を備えた GPU が推奨されます。たとえば、RTX 3060 12 GB GPU が利用可能です。より大きな GPU と 24 GB VRAM がある場合は、GPT-NeoX-20b などの 200 億個のパラメータを持つモデルを使用できます。

  • RAM:少なくとも 6 GB の RAM を搭載することをお勧めします。現在、ほとんどのコンピューターがこの基準を満たしています。

  • ハード ドライブ: GPT-J および GPT-NeoX-20b は大規模なモデルであるため、ハード ドライブに少なくとも 80 GB の空き容量が必要です。

システムがこれらの基準を満たしていない場合は、Google Colab の無料インスタンスを使用できます。

3.2. QLoRA ソフトウェア要件:

  • CUDA : CUDA がコンピュータにインストールされていることを確認してください。

  • 依存関係: 依存関係:

  • bitsandbytes : このライブラリには、大規模言語モデル (LLM) を定量化するために必要なすべてのツールが含まれています。

  • Hugging Face Transformers および Accelerate : これらの標準ライブラリは、Hugging Face Hub の効率的なモデル トレーニングに使用されます。

  • PEFT : このライブラリは、少数の追加モデル パラメーターを微調整するためのさまざまなメソッドの実装を提供します。LoRA にはそれが必要です。

  • データセット: 必須ではありませんが、微調整用のデータセットを取得するためにデータセット ライブラリを使用できます。あるいは、独自のデータセットを提供することもできます。

GPT モデルの QLoRA ベースの微調整を続行する前に、必要なソフトウェアの依存関係をすべてインストールしてください。

4.QLoRAのデモンストレーション

Guanacoは研究目的で設計されたシステムであり、次のデモ アドレスを通じて体験できます。

  1. Guanaco Playground のデモ [4] にアクセスしてください。これは 33B モデルのデモであり、65B モデルは後でデモされます。

  2. 独自の Guanaco grdio デモをホストしたい場合は、これを使用できます[5]。7B および 13B モデルの場合、無料の GPU で動作します。

  3. ChatGPT とグアナコの違いについては、[6] でモデル応答を比較できます。Vicuna のヒントでは、ChatGPT とグアナコ 65B の比較を見ることができます。

5.QLoRAのインストール

Transformer と BitsandBytes を使用して 4 ビット モデルをロードするには、アクセラレータと Transformer をソースからインストールし、BitsandBytes ライブラリの現在のバージョン (0.39.0) をインストールする必要があります。次のコマンドを使用すると、上記の目的を達成できます。

pip install -q -U bitsandbytes
pip install -q -U git+https://github.com/huggingface/transformers.git
pip install -q -U git+https://github.com/huggingface/peft.git
pip install -q -U git+https://github.com/huggingface/accelerate.git

6. QLoRA の入門

qlora.py関数を使用して、さまざまなデータセットを微調整したり推論したりできます。Alpaca データセットのベースライン モデルを微調整するための基本的なコマンドは次のとおりです。

python qlora.py --model_name_or_path <path_or_name>

13B を超えるモデルの場合は、学習率を調整することをお勧めします。

python qlora.py –learning_rate 0.0001 --model_name_or_path <path_or_name>

6.1. 定量化

量子化パラメータはBitsandbytesConfig次のように制御されます。

  • を介して 4 ビットロードを有効にしますload_in_4bit

  • bnb_4bit_compute_dtype線形層の計算に使用されるデータ型。

  • ネストされた量子化は、bnb_4bit_use_double_quantを介して有効になります。

  • bnb_4bit_quant_type量子化に使用するデータ型を指定します。fp42 つの量子化データ型(4 ビット浮動小数点) とnf4(通常の 4 ビット浮動小数点)がサポートされています。nf4理論的には正規分布の重みに最適であるため、私たちはその使用を推奨します。

model = AutoModelForCausalLM.from_pretrained(
        model_name_or_path='/name/or/path/to/your/model',
        load_in_4bit=True,
        device_map='auto',
        max_memory=max_memory,
        torch_dtype=torch.bfloat16,
        quantization_config=BitsAndBytesConfig(
            load_in_4bit=True,
            bnb_4bit_compute_dtype=torch.bfloat16,
            bnb_4bit_use_double_quant=True,
            bnb_4bit_quant_type='nf4'
        ),
    )

6.2. ページングオプティマイザー

GPU がメモリ不足になる場合がある状況に対処するために、QLoRA は NVIDIA のユニファイド メモリ機能を利用するページング オプティマイザを使用します。この機能は、CPU と GPU の間で自動ページ間転送を実行し、CPU RAM と GPU 間の通常のメモリと同様に機能します。ページネーションもよく似ています。ディスク。この機能は、オプティマイザー状態にページ メモリを割り当て、GPU メモリが不足しているときにそれを CPU RAM に移動し、必要に応じて GPU メモリに戻すために使用されます。

次のパラメータを使用してページング オプティマイザーにアクセスできます。

--optim paged_adamw_32bit

7. QLoRA を使用して LLaMA 2 を微調整する

次に、単一の Google Colab 上で最新の Llama-2-7b モデルを微調整し、チャットボットに変える方法について説明します。Hugging Face エコシステムの PEFT ライブラリと QLoRA を使用して、より効率的なメモリ微調整を実現します。

7.1. PEFT またはパラメーターの効率的な微調整

PEFT (Parameter Efficient Fine-Tuning) は、Hugging Face の新しいオープンソース ライブラリであり、すべてのモデル パラメーターを微調整することなく、事前トレーニングされた言語モデル (PLM) をさまざまなダウンストリーム アプリケーションに効率的に適応させます。PEFT には現在次のテクノロジーが含まれています。

  • LoRA: 大規模言語モデルの下位適応[8]

  • プレフィックス チューニング: P-Tuning v2: スケールやタスク全体にわたるユニバーサルな微調整に匹敵する高速チューニング

  • P-Tuning: GPT も理解できる[9]

  • オンザフライチューニング: スケールの力により、パラメータの効率的なオンザフライチューニングが可能になります[10]

7.2. 開発環境のセットアップ

まず、必要な依存関係をインストールする必要があります。最新の を利用するには、、、、accelerateおよびTRLライブラリをインストールする必要がありますを使用して、基本モデルを 4 ビットに量子化します。Falcon モデルをロードするために必要なライブラリであるため、これもインストールされます。pefttransformersdatasetsSFTTrainerbitsandbyteseinops

pip install -q -U trl transformers accelerate git+https://github.com/huggingface/peft.git
pip install -q datasets bitsandbytes einops wandb

7.3. データセットの準備

AlexanderDoria/novel17_test データセットから分割された列車データセットをロードしました。このデータ セットには、フランスの小説のテキスト データが含まれており、自然言語処理タスクのトレーニングと評価に使用されます。このデータセット内のテキストは、フランスの小説に対して自然言語処理を実行するモデルをトレーニングするために使用されます。

from datasets import load_dataset

#dataset_name = "timdettmers/openassistant-guanaco" ###Human ,.,,,,,, ###Assistant

dataset_name = 'AlexanderDoria/novel17_test' #french novels
dataset = load_dataset(dataset_name, split="train")

7.4. モデルのロード

事前トレーニングされたモデルをロードし、BitsAndBytesConfig 関数を使用して量子化構成を設定し、モデルを 4 ビットとしてロードし、torch.float16 計算データ型を使用しました。from_pretrained 関数を通じて事前トレーニングされたモデルをモデル変数に読み込み、量子化構成をモデルに渡します。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, AutoTokenizer

model_name = "TinyPixel/Llama-2-7B-bf16-sharded"

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
)

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    trust_remote_code=True
)
model.config.use_cache = False

事前トレーニング済みモデルのトークナイザーをロードし、モデルを推論に使用するときにバッチ処理用のシーケンスの最後にパディング マーカーを追加するように構成します。

tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token

モデルのトレーニングと評価時に使用する PEFT 構成オブジェクトを作成します。

from peft import LoraConfig, get_peft_model

lora_alpha = 16
lora_dropout = 0.1
lora_r = 64

peft_config = LoraConfig(
    lora_alpha=lora_alpha,
    lora_dropout=lora_dropout,
    r=lora_r,
    bias="none",
    task_type="CAUSAL_LM"
)

7.5. トレーナーをロードする

TRL ライブラリを使用しますSFTTrainer。これは、TrainerPEFT アダプターを使用して命令ベースのデータセット上のモデルを簡単に微調整するためのトランスフォーマーのラッパーを提供します。まず、以下のトレーニングパラメータをロードしましょう。

from transformers import TrainingArguments

output_dir = "./results"
per_device_train_batch_size = 4
gradient_accumulation_steps = 4
optim = "paged_adamw_32bit"
save_steps = 100
logging_steps = 10
learning_rate = 2e-4
max_grad_norm = 0.3
max_steps = 100
warmup_ratio = 0.03
lr_scheduler_type = "constant"

training_arguments = TrainingArguments(
    output_dir=output_dir,
    per_device_train_batch_size=per_device_train_batch_size,
    gradient_accumulation_steps=gradient_accumulation_steps,
    optim=optim,
    save_steps=save_steps,
    logging_steps=logging_steps,
    learning_rate=learning_rate,
    fp16=True,
    max_grad_norm=max_grad_norm,
    max_steps=max_steps,
    warmup_ratio=warmup_ratio,
    group_by_length=True,
    lr_scheduler_type=lr_scheduler_type,
)

次に、最後にすべてをトレーナーに渡し、指定された言語モデルをトレーニングするためのトレーナー オブジェクトを作成します。

from trl import SFTTrainer

max_seq_length = 512

trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
    peft_config=peft_config,
    dataset_text_field="text",
    max_seq_length=max_seq_length,
    tokenizer=tokenizer,
    args=training_arguments,
)

また、トレーニングをより安定させるために、float 32 のレイヤー仕様をアップグレードしてモデルを前処理します。

for name, module in trainer.model.named_modules():
    if "norm" in name:
        module = module.to(torch.float32)

7.6. トレーニングモデル

次に、モデルのトレーニング プロセスが開始され、バックプロパゲーション アルゴリズムを通じてモデル パラメーターが更新され、モデルのパフォーマンスが向上します。

trainer.train()

トレーニング中に、モデルは以下に示すように適切に収束するはずです。

後で使用できるように、トレーニングされたモデルをローカル ファイル システムに保存します。SFTTrainerモデル全体ではなく、アダプターのみが正しく保存されます。

model_to_save = trainer.model.module if hasattr(trainer.model, 'module') else trainer.model  # Take care of distributed/parallel training
model_to_save.save_pretrained("outputs")

LoraConfig クラスを使用して、事前トレーニングされたモデルの構成情報を読み込み、それを既存のモデルと組み合わせて新しいモデルを取得します。

lora_config = LoraConfig.from_pretrained('outputs')
model = get_peft_model(model, lora_config)

事前トレーニングされたモデルを使用して新しいテキストを生成し、モデルの生成機能をテストします。

text = "Écrire un texte dans un style baroque sur la glace et le feu ### Assistant: Si j'en luis éton"
device = "cuda:0"

inputs = tokenizer(text, return_tensors="pt").to(device)
outputs = model.generate(**inputs, max_new_tokens=50)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

モデルを Hugging Face Hub にプッシュすると、他のユーザーと共有したりアクセスしたりできます。

from huggingface_hub import login
login()

model.push_to_hub("llama2-qlora-finetunined-french")

8. QLoRAの制限事項

QLoRA は LoRA (Logical Reasoning Architecture) に基づいた推論モデルですが、いくつかの側面で制限があります。以下に既知の制限をいくつか示します。

  1. 遅い推論速度: 4 桁の推論を使用する場合、QLoRA の推論速度は比較的遅くなります。現在、QLoRA の 4 ビット推論システムはまだ 4 ビット行列乗算に接続されていないため、パフォーマンスと速度に影響を与える可能性があります。

  2. トレーナー回復トレーニングの失敗: トレーナーを使用して LoRA トレーニングの実行を再開すると、失敗が発生する可能性があります。これは内部問題または不適切な構成が原因である可能性があり、さらなる調査と解決が必要です。

  3. bnb 4bit compute type='fp16'での不安定性: 現在、bnb 4bit compute type='fp16' を使用すると、不安定性が発生する可能性があります。特に 7B LLaMA タスクでは、微調整のうち 80% のみが問題なく実行されます。解決策はありますが、まだビットやバイト単位で実装されていません。

  4. tokenizer.bosトークンID を 1 に設定する: 困難を避けるために、tokenizer.bosトークンID を 1 に設定することをお勧めしますこれはおそらく、QLoRA を使用するときに開始タグ (BOS) の ID が正しく 1 に設定され、潜在的な問題を回避するためです。

9. まとめ

QLoRA は、量子化ベースの言語モデルの微調整手法であり、事前トレーニングされた言語モデルを低精度形式に量子化することで、モデルのパフォーマンスを維持しながら推論速度を向上させ、モデルのストレージ容量を削減します。

この記事では、QLoRA メソッドを使用して LLaMA 2 モデルを微調整する方法について説明します。これには、事前トレーニングされたモデルのロード、量子化構成の設定、SFTTrainer クラスを使用したトレーナー オブジェクトの作成、モデルのトレーニングが含まれます。また、BitsAndBytesConfig 関数を使用してモデルを 4 ビットに量子化し、計算に torch.float16 計算データ型を使用する方法についても説明しました。これらの操作により、モデルのパフォーマンスを維持しながら推論速度を向上させ、モデルの保存スペースを削減できるため、リソースに制約のある環境での言語モデルのデプロイと適用が可能になります。

10. 参考文献

[1]。QLoRA GitHub:

https://github.com/artidoro/qlora

[2]。QLoRAポケベル:

https://arxiv.org/abs/2305.14314

[3]。ビットとバイト (4 ビット トレーニングの場合):

https://github.com/TimDettmers/bitsandbytes

[4]。グアナコHFプレイグラウンド:

https://huggingface.co/spaces/uwnlp/guanaco-playground-tgi

[5]。 グアナコ・グラディオ・コラボ:

https://colab.research.google.com/drive/17XEqL1JcmVWjHkT-WczdYkJlNINacwG7?usp=sharing

[6]。 グアナコ vs ChatGPT コラボ:

https://colab.research.google.com/drive/1kK6xasHiav9nhiRUJjPMZb4fAED4qRHb?usp=sharing

[7]。 PEFT GitHub:

https://github.com/huggingface/peft

[8]。 LoRAポケベル:

https://arxiv.org/pdf/2106.09685.pdf

[9]。 Pチューニングページャー:

https://arxiv.org/pdf/2103.10385.pdf

[10]。 プロンプトチューニング ページャー:

https://arxiv.org/pdf/2104.08691.pdf

[11]。 SFTトレーナーHF:

https://huggingface.co/docs/trl/main/en/sft_trainer

この記事に興味があり、AI 分野の実践的なスキルについて詳しく知りたい場合は、「Technology Frenzy AI」公開アカウントをフォローしてください。ここでは、AIGC 分野の最新の注目記事や実践的な事例チュートリアルをご覧いただけます。

おすすめ

転載: blog.csdn.net/FrenzyTechAI/article/details/132686051