PEFT 文档

torch.compile

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

torch.compile

在 PEFT 中,torch.compile 适用于部分而非全部功能。它并非总是有效的原因是 PEFT 在某些地方是高度动态的(例如加载和切换多个适配器),这可能会给 `torch.compile` 带来麻烦。在其他地方,`torch.compile` 可能可以工作,但由于图中断(graph breaks)而不会像预期那样快。

如果你没有看到错误,并不一定意味着 `torch.compile` 正确工作了。它可能会给你一个输出,但输出是不正确的。本指南描述了哪些功能可以与 `torch.compile` 一起使用,哪些不可以。对于你自己的测试,我们建议使用最新的 PyTorch 版本,因为 `torch.compile` 正在不断改进。

除非另有说明,否则均使用默认的 `torch.compile` 设置。

使用 torch.compile 进行训练和推理

这些功能 **可以** 与 `torch.compile` 一起使用。下面列出的所有功能都已通过因果语言模型(causal LM)进行了测试。

  • 使用 🤗 Transformers 的 `Trainer` 进行训练
  • 使用自定义的 PyTorch 循环进行训练
  • 推理
  • 生成

以下适配器已成功测试:

  • AdaLoRA
  • BOFT
  • Bone
  • IA³
  • Layer Norm 调优
  • LoHa
  • LoKr
  • LoRA
  • LoRA + DoRA
  • 应用于嵌入层的 LoRA
  • OFT
  • VeRA
  • HRA

使用 torch.compile 的高级 PEFT 功能

以下是一些 **可以** 工作的更高级的 PEFT 功能。它们都已通过 LoRA 进行了测试。

  • modules_to_save (即 config = LoraConfig(..., modules_to_save=...))
  • 合并适配器(单个或多个)
  • 将多个适配器合并为一个适配器(即调用 model.add_weighted_adapter(...)
  • 将 PEFT 适配器与量化(bitsandbytes)结合使用
  • 禁用适配器(即使用 with model.disable_adapter()
  • 卸载(即调用 model.merge_and_unload()
  • 混合适配器批次(即调用 model(batch, adapter_names=["__base__", "default", "other", ...])
  • 使用多个适配器进行推理(即使用 model.add_adaptermodel.load_adapter 加载超过 1 个适配器);为此,请仅在加载所有适配器 **之后** 调用 `torch.compile`。

总的来说,我们可以预期,如果一个功能与 LoRA 正常工作,并且也受到其他适配器类型的支持,那么它也应该适用于该适配器类型。

测试用例

上面列出的所有用例都在 peft/tests/test_torch_compile.py 文件中进行了测试。如果你想更详细地了解我们是如何测试某个特定功能的,请转到该文件并检查与你的用例相对应的测试。

如果你有其他 `torch.compile` 与 PEFT 可以或不可以正常工作的用例,请通过告知我们或提交一个 PR 将该用例添加到已覆盖的测试用例中来做出贡献。

< > 在 GitHub 上更新