torch.compile
在 PEFT 中,torch.compile 对某些功能有效,但对其他功能无效。它并非总是有效的原因是,PEFT 在某些地方具有高度动态性(例如,加载和切换多个适配器),这可能会导致 torch.compile
出现问题。在其他地方,torch.compile
可能有效,但由于图中断,速度不会如预期那样快。
如果你没有看到错误,并不一定意味着 torch.compile
正确运行。它可能会给你一个输出,但输出不正确。本指南描述了 torch.compile
有效和无效的地方。
除非另有说明,否则使用默认 torch.compile
设置。
使用 torch.compile 进行训练和推理
这些功能与 torch.compile
兼容。以下列出的所有内容均已使用因果语言模型进行测试。
- 使用 🤗 transformers 的
Trainer
进行训练 - 使用自定义 PyTorch 循环进行训练
- 推理
- 生成
以下适配器已成功测试
- AdaLoRA
- BOFT
- IA³
- 层归一化调优
- LoHa
- LoRA
- LoRA + DoRA
- OFT
- VeRA
- HRA
以下适配器在使用 torch.compile
进行训练或推理时无法正常工作
- LoKr
- 针对嵌入层的 LoRA
使用 torch.compile 的高级 PEFT 功能
以下是与 torch.compile
兼容的一些更高级的 PEFT 功能。它们都已使用 LoRA 进行测试。
modules_to_save
(例如config = LoraConfig(..., modules_to_save=...)
)- 合并适配器(一个或多个)
- 将多个适配器合并为一个适配器(例如调用
model.add_weighted_adapter(...)
)
一般来说,我们可以预期,如果一个功能与 LoRA 正确兼容,并且也受到其他适配器类型的支持,那么它也应该适用于该适配器类型。
以下更高级的 PEFT 功能与 torch.compile
不兼容。测试使用 LoRA 进行。
- 将 PEFT 适配器与量化(bitsandbytes)一起使用
- 使用多个适配器进行推理
- 卸载(例如调用
model.merge_and_unload()
) - 禁用适配器(例如使用
with model.disable_adapter()
) - 混合适配器批次(例如调用
model(batch, adapter_names=["__base__", "default", "other", ...])
)
测试用例
上面列出的所有用例都在 peft/tests/test_torch_compile.py
中进行了测试。如果您想更详细地查看我们如何测试某个功能,请访问该文件并查看与您的用例相对应的测试。
如果您还有其他用例,您知道 torch.compile
是否与 PEFT 兼容,请通过告诉我们或打开 PR 将此用例添加到已覆盖的测试用例中来贡献。