PEFT documentation
torch.compile
torch.compile
PEFTでは、torch.compileはすべての機能ではなく、一部の機能でのみ動作します。常に動作しない理由は、PEFTが特定の箇所(例えば、複数のアダプターの読み込みや切り替えなど)で非常に動的であり、これがtorch.compileに問題を引き起こす可能性があるためです。その他の箇所では、torch.compileは動作する場合がありますが、グラフの中断(graph breaks)により、期待されるほど高速にはなりません。
エラーが表示されない場合でも、torch.compileが正しく動作したとは限りません。出力は得られるものの、その内容が正しくない可能性があります。このガイドでは、torch.compileで動作するものと動作しないものを説明します。ご自身のテストには、torch.compileが絶えず改善されているため、最新のPyTorchバージョンの使用を推奨します。
特に指定がない限り、デフォルトの
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()の使用) - アンロード(つまり
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内でテストされています。特定の機能のテスト方法について詳細を確認したい場合は、そのファイルに移動し、該当するユースケースに対応するテストを確認してください。
Update on GitHub
torch.compileが PEFT と互換性があるか、あるいはないかを知っている別のユースケースがある場合は、お知らせいただくか、対象のテストケースにこのユースケースを追加する PR を開いていただくことで、貢献していただけます。