#
Load adapters with 🤗 PEFT

Parameter-Efficient Fine Tuning (PEFT) メソッドは、事前学習済みモデルのパラメータをファインチューニング中に凍結し、その上にわずかな訓練可能なパラメータ（アダプター）を追加するアプローチです。アダプターは、タスク固有の情報を学習するために訓練されます。このアプローチは、メモリ使用量が少なく、完全にファインチューニングされたモデルと比較して計算リソースを低く抑えつつ、同等の結果を生成することが示されています。

PEFTで訓練されたアダプターは通常、完全なモデルのサイズよりも1桁小さく、共有、保存、読み込むのが便利です。

Hubに格納されているOPTForCausalLMモデルのアダプター重みは、モデルの全体サイズの約6MBで、モデル重みの全サイズは約700MBです。

🤗 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に格納されたアダプターウェイトを簡単に読み込んで実行またはトレーニングできます。以下のメソッドがサポートされています：

- Low Rank Adapters
- IA3
- AdaLoRA

他のPEFTメソッドを使用したい場合、プロンプト学習やプロンプト調整などについて詳しく知りたい場合、または🤗 PEFTライブラリ全般については、ドキュメンテーションを参照してください。

##
Load a PEFT adapter

🤗 TransformersからPEFTアダプターモデルを読み込んで使用するには、Hubリポジトリまたはローカルディレクトリに `adapter_config.json` ファイルとアダプターウェイトが含まれていることを確認してください。次に、`AutoModelFor` クラスを使用してPEFTアダプターモデルを読み込むことができます。たとえば、因果言語モデリング用のPEFTアダプターモデルを読み込むには：

1. PEFTモデルのIDを指定します。
2. それを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

    peft_model_id = "ybelkada/opt-350m-lora"
    model = AutoModelForCausalLM.from_pretrained(peft_model_id, device_map="auto", 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を使用したモデルの微調整に慣れていない場合は、事前トレーニング済みモデルの微調整チュートリアルをご覧ください。

1. タスクタイプとハイパーパラメータに対するアダプターの構成を定義します（ハイパーパラメータの詳細については`~peft.LoraConfig`を参照してください）。

    from peft import LoraConfig

    peft_config = LoraConfig(
        lora_alpha=16,
        lora_dropout=0.1,
        r=64,
        bias="none",
        task_type="CAUSAL_LM",
    )

2. モデルにアダプターを追加する。

    model.add_adapter(peft_config)

3. これで、モデルを Trainer に渡すことができます！

    trainer = Trainer(model=model, ...)
    trainer.train()

保存するトレーニング済みアダプタとそれを読み込むための手順：