opendelta
是什么?
opendelta
是一个专注于高效微调(Delta Tuning)的大语言模型的开源库。
它提供了实现各种微调方法的模块化框架,例如:
- LoRA (Low-Rank Adaptation)
- Prefix Tuning
- Adapters
- BitFit
这些方法都属于 参数高效微调(Parameter-Efficient Fine-Tuning, PEFT) 的范畴,用于在保持预训练模型大部分参数冻结的情况下,通过调整少量参数来完成特定任务。
opendelta
的目标是简化这类方法的实现,同时提供灵活的接口以支持不同的场景和模型。
from opendelta.basemodel import DeltaBase
DeltaBase
是什么?
DeltaBase
是 opendelta
库中定义的一个基类,位于 opendelta.basemodel
模块中。
它是 所有 Delta 调整方法的基础类,为具体的 Delta 方法(例如 LoRA 或 Prefix Tuning)提供了通用的逻辑框架
DeltaBase包含哪些参数
示例:DeltaBase
如何被使用?
以下是 DeltaBase
的可能用法,结合 opendelta
库的实现进行一个简单的示例。
1. 使用 DeltaBase
创建子类(如 LoRA)
from opendelta.basemodel import DeltaBase
class LoRAModel(DeltaBase):
def __init__(self, backbone_model, lora_r, lora_alpha):
# 调用 DeltaBase 的初始化函数
super().__init__(backbone_model)
# LoRA 特定的参数
self.lora_r = lora_r
self.lora_alpha = lora_alpha
self.init_lora_parameters()
def init_lora_parameters(self):
# 在指定的位置插入 LoRA 模块(例如注意力层的 q, v 矩阵)
pass
def forward(self, x):
# 定义前向传播的逻辑
return super().forward(x)
2. 插入 Delta 模块
在主模型中插入 Delta
模块时,DeltaBase
提供了一些帮助函数,例如:
from transformers import AutoModel
from opendelta.basemodel import DeltaBase
# 加载主模型
backbone_model = AutoModel.from_pretrained("bert-base-uncased")
# 定义一个子类(如 LoRA),并插入 Delta 模块
class CustomDeltaModel(DeltaBase):
def __init__(self, backbone_model):
super().__init__(backbone_model)
def insert_delta_modules(self):
# 插入自定义的 Delta 模块,例如注意力层
print("Inserting delta modules...")
# 创建 Delta 模型
delta_model = CustomDeltaModel(backbone_model)
delta_model.insert_delta_modules()
3. 使用 DeltaBase
统一管理 Delta 调整
你可以通过 DeltaBase
的功能,统一管理模型的冻结参数和需要训练的参数。例如
delta_model.freeze_module("backbone.*") # 冻结主模型的所有参数
delta_model.unfreeze_module("delta.*") # 只解冻 Delta 模块的参数
from opendelta import BaseDeltaConfig
什么是 BaseDeltaConfig
?
BaseDeltaConfig
是 OpenDelta 中的一个配置类,用于存储和管理 Delta 微调方法(如 LoRA、Prefix Tuning 等)的相关参数和配置。
- Delta 微调方法(Delta Tuning)是一种参数高效微调技术,主要包括:
- LoRA (Low-Rank Adaptation)
- Prefix Tuning
- Adapters
- 其他 PEFT 技术
通过 BaseDeltaConfig
,可以方便地设置这些方法的参数,比如低秩矩阵的秩、dropout 比例、解冻的模块等。
该类为所有 Delta 方法提供了一个通用的配置基础,具体的方法会基于它进一步扩展。
BaseDeltaConfig
的作用
-
管理通用配置:
- 它定义了一些与 Delta 调整方法相关的通用参数(例如低秩矩阵秩
lora_r
、dropout 比例lora_dropout
等)。
- 它定义了一些与 Delta 调整方法相关的通用参数(例如低秩矩阵秩
-
支持模块化:
- 配置中可以指定哪些模块会被修改(如注意力层的
q
和v
矩阵),或者哪些模块会解冻(参与训练)。
- 配置中可以指定哪些模块会被修改(如注意力层的
-
提高代码的可读性与复用性:
- 将配置集中管理,便于后续调试和修改。
-
通用接口:
- 提供了一致的配置接口,适配不同的 Delta 方法(如 LoRA、Prefix Tuning 等)。
如何使用 BaseDeltaConfig
?
以下是一个典型的使用例子:
from opendelta import BaseDeltaConfig
# 创建一个 LoRA 的配置
config = BaseDeltaConfig(
delta_type="lora", # 使用 LoRA
modified_modules=["attn.q", "attn.v"], # 修改注意力层的 q 和 v
lora_r=4, # 低秩矩阵的秩为 4
lora_alpha=16, # LoRA 的初始化比例
lora_dropout=0.1 # Dropout 概率
)
print(config)
2. 应用到 Delta 模型
将配置应用到 Delta 模型上,例如:
from opendelta import AutoDeltaModel
# 假设有一个主模型
from transformers import AutoModel
backbone_model = AutoModel.from_pretrained("bert-base-uncased")
# 使用配置创建 Delta 模型
delta_model = AutoDeltaModel.from_config(config, backbone_model)
# 检查 Delta 模块是否正确插入
print(delta_model)
3. 训练 Delta 模块
# 冻结主模型
delta_model.freeze_module("backbone.*")
# 只训练 Delta 模块
delta_model.unfreeze_module("delta.*")
# 开始训练
for batch in dataloader:
outputs = delta_model(batch["input_ids"])
loss = loss_fn(outputs, batch["labels"])
loss.backward()
optimizer.step()