Load adapters with 🤗 PEFT
Parameter-Efficient Fine Tuning (PEFT) メソッドは、事前学習済みモデルのパラメータをファインチューニング中に凍結し、その上にわずかな訓練可能なパラメータ(アダプター)を追加するアプローチです。アダプターは、タスク固有の情報を学習するために訓練されます。このアプローチは、メモリ使用量が少なく、完全にファインチューニングされたモデルと比較して計算リソースを低く抑えつつ、同等の結果を生成することが示されています。
PEFTで訓練されたアダプターは通常、完全なモデルのサイズよりも1桁小さく、共有、保存、読み込むのが便利です。
🤗 PEFTライブラリについて詳しく知りたい場合は、ドキュメンテーションをご覧ください。
Setup
🤗 PEFTをインストールして始めましょう:
pip install peft
新機能を試してみたい場合、ソースからライブラリをインストールすることに興味があるかもしれません:
pip install git+https://github.com/huggingface/peft.git
Supported PEFT models
🤗 Transformersは、いくつかのPEFT(Parameter Efficient Fine-Tuning)メソッドをネイティブにサポートしており、ローカルまたはHubに格納されたアダプターウェイトを簡単に読み込んで実行またはトレーニングできます。以下のメソッドがサポートされています:
他のPEFTメソッドを使用したい場合、プロンプト学習やプロンプト調整などについて詳しく知りたい場合、または🤗 PEFTライブラリ全般については、ドキュメンテーションを参照してください。
Load a PEFT adapter
🤗 TransformersからPEFTアダプターモデルを読み込んで使用するには、Hubリポジトリまたはローカルディレクトリに adapter_config.json
ファイルとアダプターウェイトが含まれていることを確認してください。次に、AutoModelFor
クラスを使用してPEFTアダプターモデルを読み込むことができます。たとえば、因果言語モデリング用のPEFTアダプターモデルを読み込むには:
- PEFTモデルのIDを指定します。
- それをAutoModelForCausalLM クラスに渡します。
from transformers import AutoModelForCausalLM, AutoTokenizer
peft_model_id = "ybelkada/opt-350m-lora"
model = AutoModelForCausalLM.from_pretrained(peft_model_id)
PEFTアダプターをAutoModelFor
クラスまたは基本モデルクラス(OPTForCausalLM
またはLlamaForCausalLM
など)で読み込むことができます。
また、load_adapter
メソッドを呼び出すことで、PEFTアダプターを読み込むこともできます:
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "facebook/opt-350m"
peft_model_id = "ybelkada/opt-350m-lora"
model = AutoModelForCausalLM.from_pretrained(model_id)
model.load_adapter(peft_model_id)
Load in 8bit or 4bit
bitsandbytes
統合は、8ビットおよび4ビットの精度データ型をサポートしており、大規模なモデルを読み込む際にメモリを節約するのに役立ちます(詳細については bitsandbytes
統合のガイドを参照してください)。from_pretrained() に load_in_8bit
または load_in_4bit
パラメータを追加し、device_map="auto"
を設定してモデルを効果的にハードウェアに分散配置できます:
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
peft_model_id = "ybelkada/opt-350m-lora"
model = AutoModelForCausalLM.from_pretrained(peft_model_id, quantization_config=BitsAndBytesConfig(load_in_8bit=True))
Add a new adapter
既存のアダプターを持つモデルに新しいアダプターを追加するために ~peft.PeftModel.add_adapter
を使用できます。ただし、新しいアダプターは現在のアダプターと同じタイプである限り、これを行うことができます。たとえば、モデルに既存の LoRA アダプターがアタッチされている場合:
from transformers import AutoModelForCausalLM, OPTForCausalLM, AutoTokenizer
from peft import PeftConfig
model_id = "facebook/opt-350m"
model = AutoModelForCausalLM.from_pretrained(model_id)
lora_config = LoraConfig(
target_modules=["q_proj", "k_proj"],
init_lora_weights=False
)
model.add_adapter(lora_config, adapter_name="adapter_1")
新しいアダプタを追加するには:
# attach new adapter with same config
model.add_adapter(lora_config, adapter_name="adapter_2")
~peft.PeftModel.set_adapter
を使用して、どのアダプターを使用するかを設定できます:
# use adapter_1
model.set_adapter("adapter_1")
output = model.generate(**inputs)
print(tokenizer.decode(output_disabled[0], skip_special_tokens=True))
# use adapter_2
model.set_adapter("adapter_2")
output_enabled = model.generate(**inputs)
print(tokenizer.decode(output_enabled[0], skip_special_tokens=True))
Enable and disable adapters
モデルにアダプターを追加したら、アダプターモジュールを有効または無効にすることができます。アダプターモジュールを有効にするには、次の手順を実行します:
from transformers import AutoModelForCausalLM, OPTForCausalLM, AutoTokenizer
from peft import PeftConfig
model_id = "facebook/opt-350m"
adapter_model_id = "ybelkada/opt-350m-lora"
tokenizer = AutoTokenizer.from_pretrained(model_id)
text = "Hello"
inputs = tokenizer(text, return_tensors="pt")
model = AutoModelForCausalLM.from_pretrained(model_id)
peft_config = PeftConfig.from_pretrained(adapter_model_id)
# to initiate with random weights
peft_config.init_lora_weights = False
model.add_adapter(peft_config)
model.enable_adapters()
output = model.generate(**inputs)
アダプターモジュールを無効にするには:
model.disable_adapters() output = model.generate(**inputs)
Train a PEFT adapter
PEFTアダプターはTrainerクラスでサポートされており、特定のユースケースに対してアダプターをトレーニングすることができます。数行のコードを追加するだけで済みます。たとえば、LoRAアダプターをトレーニングする場合:
Trainerを使用したモデルの微調整に慣れていない場合は、事前トレーニング済みモデルの微調整チュートリアルをご覧ください。
- タスクタイプとハイパーパラメータに対するアダプターの構成を定義します(ハイパーパラメータの詳細については
~peft.LoraConfig
を参照してください)。
from peft import LoraConfig
peft_config = LoraConfig(
lora_alpha=16,
lora_dropout=0.1,
r=64,
bias="none",
task_type="CAUSAL_LM",
)
- モデルにアダプターを追加する。
model.add_adapter(peft_config)
- これで、モデルを Trainer に渡すことができます!
trainer = Trainer(model=model, ...) trainer.train()
保存するトレーニング済みアダプタとそれを読み込むための手順:
< > Update on GitHub