# torch.compile

PEFTでは、[torch.compile](https://pytorch.org/tutorials/intermediate/torch_compile_tutorial.html)はすべての機能ではなく、一部の機能でのみ動作します。常に動作しない理由は、PEFTが特定の箇所（複数のアダプターの読み込みや切り替えなど）で非常に動的であるため、`torch.compile`に問題を引き起こす可能性があるためです。その他の箇所では、`torch.compile`は動作する場合がありますが、グラフの中断により、期待されるほど高速にはなりません。

エラーが表示されない場合、`torch.compile`が正しく動作したとは限りません。出力は得られるものの、その内容が正しくない可能性があります。このガイドでは、`torch.compile`で動作するものと動作しないものを説明します。ご自身のテストには、`torch.compile`が絶えず改善されているため、最新のPyTorchバージョンの使用を推奨します。

> [!TIP]
> 特に指定がない限り、デフォルトの`torch.compile`設定が使用されました。

## `torch.compile`による学習と推論

これらの機能は`torch.compile`と**動作**します。以下に列挙した内容はすべて、causal LMでテストされました:

- 🤗 transformers の `Trainer` による学習
- カスタムPyTorchループでの学習
- 推論
- 生成

以下のアダプターが正常にテストされました:

- AdaLoRA
- BOFT
- IA³
- Layer Normのチューニング
- LoHa
- LoKr
- LoRA
- LoRA + DoRA
- 埋め込み層に適用されたLoRA
- OFT
- VeRA
- HRA

## `torch.compile`による高度なPEFT機能

以下は、**動作する**より高度なPEFT機能の一部です。これらはすべてLoRAでテストされました。

- `modules_to_save` (i.e. `config = LoraConfig(..., modules_to_save=...)`)
- アダプター（1つまたは複数）のマージ
- 複数のアダプターを1つのアダプターにマージする（つまり、`model.add_weighted_adapter(...)`を呼び出す）
- bitsandbytes による量子化と PEFT アダプターの使用
- アダプターの無効化（`with model.disable_adapter()`の使用）
- Unloading （つまり、`model.merge_and_unload()`を呼び出すこと）
- ミックスされたアダプターバッチ（つまり、`model(batch, adapter_names=["__base__", "default", "other", ...])`を呼び出すこと）
- 複数のアダプターでの推論（`model.add_adapter`または`model.load_adapter`を使用して1つ以上のアダプターを読み込む場合）。この場合、すべてのアダプターを読み込んだ_後_にのみ`torch.compile`を呼び出してください

一般的に、ある機能がLoRAで正しく動作し、かつ他のアダプタータイプでもサポートされている場合、そのアダプタータイプでも動作すると期待できます。

## テストケース

上記に列挙されたすべてのユースケースは、[`peft/tests/test_torch_compile.py`](https://github.com/huggingface/peft/blob/main/tests/test_torch_compile.py)内でテストされています。特定の機能のテスト方法について詳細を確認したい場合は、そのファイルに移動し、該当するユースケースに対応するテストを確認してください。

> [!TIP]
> `torch.compile` が PEFT と互換性があるか、あるいはないかを知っている別のユースケースがある場合は、お知らせいただくか、対象のテストケースにこのユースケースを追加する PR を開いていただくことで、貢献していただけます。

