概述
OpenDelta 是一个用于高效参数调优的方法工具包(我们称之为 delta tuning),用户可以通过该工具灵活地分配(或添加)少量参数进行更新,同时保持大部分参数不变。利用 OpenDelta,用户可以轻松实现前缀调优、适配器、Lora 或任何其他类型的 delta 调优,并与首选的 PTM 搭配使用。
-
OpenDelta 的最新版本已在 Python==3.8.13、PyTorch==1.12.1、transformers==4.22.2 上测试通过。其他版本也可能支持。如果在使用自己的包版本时遇到问题,请提出 issue,我们会尽快处理。
-
使用 OpenDelta 修改 PLM(例如 BART)的演示。
新闻
- 2022.10.25 发布 v0.3.2。支持 BMTrain!改进文档。添加检查工具。
- 2022.10.14 发布 v0.3.0。我们使每种 delta 调优方法的默认配置(即附带位置)的使用更加友好!如果自定义模型具有我们支持的子模块模型,默认配置也可用。其他关键更改见 更新日志
- 2022.10.10 将长期开发的分支 v0.2.4 合并到主分支中。关键更新包括(1)统一 delta 调优范式和 prompt 调优范式的示例;(2)支持 Delta Center,其网页仍在建设中。详细信息见 更新日志
- 2022.03.24 我们注意到 Soft Prompt Tuning 和 Prefix Tuning 中有几个 bug,主要是由于需要自定义 attention ids 和 token_type_ids。我们正在修复!目前,请使用其他方法,因为它们更加稳定且性能更好。
- 2022.03.20 添加 Colab 示例 以说明高效训练和节省空间的多任务服务。
- 2022.03.20 发布新的 pip 版本。
- 2022.02.16 支持 正则表达式 在基于名称的寻址中。
安装
- 创建一个虚拟环境(可选)
conda create -n opendelta_env python=3.8
conda activate opendelta_env
- 安装最新版本
pip install git+https://github.com/thunlp/OpenDelta.git
或 安装最新的 pip 版本(更稳定)
pip install opendelta
或 从源代码构建
git clone git@github.com:thunlp/OpenDelta.git
cd OpenDelta
python setup.py install
# 如果希望对代码进行修改用于研究,可以使用:
# python setup.py develop
必须尝试
以下代码和评论介绍了 OpenDelta 的关键功能。这些内容也可以在 must_try.py 和 Colab 中的 must_try.ipynb 中找到。
# 像往常一样使用 transformers。
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
t5 = AutoModelForSeq2SeqLM.from_pretrained("t5-large")
t5_tokenizer = AutoTokenizer.from_pretrained("t5-large")
# 一个运行示例
inputs_ids = t5_tokenizer.encode("Is Harry Potter written by J.K. Rowling", return_tensors="pt")
t5_tokenizer.decode(t5.generate(inputs_ids)[0])
# >>> '<pad><extra_id_0>? Is it Harry Potter?</s>'
# 使用现有 delta 模型
from opendelta import AutoDeltaModel, AutoDeltaConfig
# 从 DeltaCenter 使用现有 delta 模型
delta = AutoDeltaModel.from_finetuned("thunlp/Spelling_Correction_T5_LRAdapter_demo", backbone_model=t5)
# 冻结整个 backbone model,只留 delta 模型更新。
delta.freeze_module()
# 可视化变化
delta.log()
t5_tokenizer.decode(t5.generate(inputs_ids)[0])
# >>> <pad> Is Harry Potter written by J.K. Rowling?</s>
# 现在仅保存 delta 模型,而不是整个 backbone model,到 tmp/ 目录
delta.save_finetuned(".tmp")
import os; os.listdir(".tmp")
# >>> 状态字典大小为 1.443 MB
# >>> 我们鼓励用户将最终和公开的模型推送到 delta center,与社区共享!
# 从本地 URL 重新加载模型并将其添加到预训练 T5.
t5 = AutoModelForSeq2SeqLM.from_pretrained("t5-large")
delta1 = AutoDeltaModel.from_finetuned(".tmp", backbone_model=t5)
import shutil; shutil.rmtree(".tmp") # 不要忘记删除临时文件。
t5_tokenizer.decode(t5.generate(inputs_ids)[0])
# >>> <pad> Is Harry Potter written by J.K. Rowling?</s>
# 分离 delta 模型后,模型返回到未修改状态。
delta1.detach()
t5_tokenizer.decode(t5.generate(inputs_ids)[0])
# >>> '<pad><extra_id_0>? Is it Harry Potter?</s>'
# 对具有 PLMs 的自定义包装模型使用默认配置。这是用户的常见需求。
import torch.nn as nn
class WrappedModel(nn.Module):
def __init__(self, inner_model):
super().__init__()
self.inner = inner_model
def forward(self, *args, **kwargs):
return self.inner(*args, **kwargs)
wrapped_model = WrappedModel(WrappedModel(t5))
# 比如我们使用 LoRA
delta_config = AutoDeltaConfig.from_dict({"delta_type":"lora"})
delta2 = AutoDeltaModel.from_config(delta_config, backbone_model=wrapped_model)
delta2.log()
# >>> root
# -- inner
# -- inner
# ...
# ... lora_A:[8,1024], lora_B:[1024,8]
delta2.detach()
# 使用非默认配置
# 比如我们在 t5 解码器的最后四层添加 lora,lora 等级=5
delta_config3 = AutoDeltaConfig.from_dict({"delta_type":"lora", "modified_modules":["[r]decoder.*((20)|(21)|(22)|(23)).*DenseReluDense\.wi"], "lora_r":5})
delta3 = AutoDeltaModel.from_config(delta_config3, backbone_model=wrapped_model)
delta3.log()
已验证的默认配置
-
您可以尝试在 任何 基于 PyTorch 的 backbone model 上使用 OpenDelta。
-
但由于背板模型子模块的接口可能不被支持,因此有小概率不兼容。因此,我们验证了 OpenDelta 确认支持的一些常见使用模型。
-
我们将继续测试更多新兴模型。
-
如果您成功应用 OpenDelta 至您的 backbone model,欢迎提交 pull requests。
引用
@article{hu2023opendelta,
title={OpenDelta: A Plug-and-play Library for Parameter-efficient Adaptation of Pre-trained Models},
author={Hu, Shengding and Ding, Ning and Zhao, Weilin and Lv, Xingtai and Zhang, Zhen and Liu, Zhiyuan and Sun, Maosong},
journal={arXiv preprint arXiv:2307.03084},
year={2023}
}
@article{ding2022delta,
title={Delta tuning: A comprehensive study of parameter efficient methods for pre-trained language models},
author={Ding, Ning and Qin, Yujia and Yang, Guang and Wei, Fuchao and Yang, Zonghan and Su, Yusheng and Hu, Shengding and Chen, Yulin and Chan, Chi-Min and Chen, Weize and others},
journal={arXiv preprint arXiv:2203.06904},
year={2022}
}