[翻訳] Hugging faceのPEFTのクイックツアー

[Quicktour](https://huggingface.co/docs/peft/quicktour)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

🤗 PEFTには、大規模な事前学習済みモデルのトレーニングに対するパラメーター効率の高いファインチューニングのメソッドが含まれています。従来のパラダイムでは、それぞれの後段のタスクごとにモデルのパラメーターすべてをファインチューニングしていましたが、現在のモデルには膨大な数のパラメーターが存在するため過度なコストを必要とし、現実的ではありません。代わりに、少数のプロンプトパラメーターをトレーニングしたり、トレーニング可能なパラメーターの数を削減するためのlow-rank adaptation (LoRA)のような再パラメーター化のような手法を使用する方が効率的です。

このクイックツアーでは、🤗 PEFTの主要な機能を説明し、コンシューマーデバイスでは通常アクセスできない大規模な事前学習済みモデルをトレーニングするお手伝いをします。分類ラベルを生成し、推論に活用できるように、LoRAを用いて1.2Bパラメーターの[bigscience/mt0\-large](https://huggingface.co/bigscience/mt0-large)をどのようにトレーニングするのかを説明します。

# PeftConfig

🤗 PEFTメソッドのそれぞれは、[PeftModel](https://huggingface.co/docs/peft/main/en/package_reference/peft_model#peft.PeftModel)を構築する際に重要なパラメーターすべてを格納する[PeftConfig](https://huggingface.co/docs/peft/main/en/package_reference/config#peft.PeftConfig)クラスによって定義されます。

LoRAを使用するので、[LoraConfig](https://huggingface.co/docs/peft/main/en/package_reference/tuners#peft.LoraConfig)クラスをロード、作成する必要があります。`LoraConfig`では、以下のパラメーターを指定します：

- `task_type`、この場合はsequence-to-sequence language modelingです。
- `inference_mode`ではモデルを推論に使用するかどうかを指定します。
- `r`はlow-rankマトリクスの次元数です。
- `lora_alpha`はlow-rankマトリクスのスケーリングファクターです。
- `lora_dropout`はLoRAレイヤーのドロップアウト確率です。

```py:Python
from peft import LoraConfig, TaskType

peft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)
```

:::note
調整可能な他のパラメーターの詳細については[LoraConfig](https://huggingface.co/docs/peft/main/en/package_reference/tuners#peft.LoraConfig)リファレンスをご覧ください。
:::

# PeftModel

[PeftModel](https://huggingface.co/docs/peft/main/en/package_reference/peft_model#peft.PeftModel)は`get_peft_model()`関数で作成されます。これは🤗 Transformersライブラリからロードできるベースモデルと、固有の🤗 PEFTメソッドにモデルをどのように設定するのかの指示を含む[PeftConfig](https://huggingface.co/docs/peft/main/en/package_reference/config#peft.PeftConfig)を受け取ります。

ファインチューンしたいベースモデルをロードすることからスタートします。

```py:Python
from transformers import AutoModelForSeq2SeqLM

model_name_or_path = "bigscience/mt0-large"
tokenizer_name_or_path = "bigscience/mt0-large"
model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)
```

[PeftModel](https://huggingface.co/docs/peft/main/en/package_reference/peft_model#peft.PeftModel)を作成するには、`get_peft_model`関数でベースモデルと`peft_config`をラップします。モデルでトレーニング可能なパラメーター数の感覚を掴むには、`print_trainable_parameters`メソッドを使用します。このケースでは、モデルのパラメーターの0.19%のみをトレーニングします！🤏

```py:Python
from peft import get_peft_model

model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
"output: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282"
```

これですべてです🎉！これで、🤗 Transformersの[Trainer](https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.Trainer)、🤗 Accelerate、その他の任意のカスタムPyTorchトレーニングループを用いてモデルをトレーニングすることができます。

# モデルの保存とロード

モデルのトレーニングが完了した後は、[save\_pretrained](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.PreTrainedModel.save_pretrained)関数を用いてディレクトリにモデルを保存することができます。また、[push\_to\_hub](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.PreTrainedModel.push_to_hub)関数を用いて、Hubにモデルを保存することができます(最初にHugging Faceアカウントにログインしていることを確認してください)。

```py:Python
model.save_pretrained("output_dir")

# if pushing to Hub
from huggingface_hub import notebook_login

notebook_login()
model.push_to_hub("my_awesome_peft_model")
```

これは、トレーニングされたインクリメンタルな🤗 PEFTの重みのみを保存し、格納、転送、ロードが非常に効率的であることを意味します。例えば、RAFT [dataset](https://huggingface.co/datasets/ought/raft)のサブセットである[twitter\_complaints](https://huggingface.co/datasets/ought/raft/viewer/twitter_complaints/train)に対してLoRAを用いてこの[bigscience/T0\_3B](https://huggingface.co/smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM)をトレーニングすると、二つのファイルのみが含まれます：`adapter_config.json`と`adapter_model.bin`です。後者はたった19MBです！

[from\_pretrained](https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.PreTrainedModel.from_pretrained)関数を用いて推論のためにモデルを容易にロードします：

```py:Python
  from transformers import AutoModelForSeq2SeqLM
+ from peft import PeftModel, PeftConfig

+ peft_model_id = "smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM"
+ config = PeftConfig.from_pretrained(peft_model_id)
  model = AutoModelForSeq2SeqLM.from_pretrained(config.base_model_name_or_path)
+ model = PeftModel.from_pretrained(model, peft_model_id)
  tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path)

  model = model.to(device)
  model.eval()
  inputs = tokenizer("Tweet text : @HondaCustSvc Your customer service has been horrible during the recall process. I will never purchase a Honda again. Label :", return_tensors="pt")

  with torch.no_grad():
      outputs = model.generate(input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=10)
      print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)[0])
  'complaint'
```

# 次のステップ

ここまでで🤗 PEFTメソッドを用いてどのようにモデルをトレーニングするのかを見たことになり、プロンプトチューニングのように他のメソッドのいくつかを試してみることをお勧めします。ステップはこのクイックスタートで説明したものと非常に似ています。🤗 PEFTメソッドの[PeftConfig](https://huggingface.co/docs/peft/main/en/package_reference/config#peft.PeftConfig)を準備し、設定とベースモデルから[PeftModel](https://huggingface.co/docs/peft/main/en/package_reference/peft_model#peft.PeftModel)を作成するために`get_peft_model`を使用します。そして、お好きなようにトレーニングすることができます！

また、セマンティックセグメンテーション、多言語自動スピーチ認識、DreamBooth、トークン分類のような固有のタスクに対する🤗 PEFTメソッドを用いたモデルのトレーニングに興味があるのであれば、ご自由にタスクガイドをご覧ください。