PEFT
PEFT(Parameter-Efficient Fine-Tuning)是一种参数高效的微调方法,用于在预训练的深度学习模型上进行微小的参数调整以适应特定任务。
目前与openMind Library联动使用时,该生态库只支持PyTorch框架。
环境及配置
安装peft:
pip install peft==0.12.0
如果想尝试最新的特性,可以从源代码安装:
pip install git+https://github.com/huggingface/peft.git
openMind Library支持的微调方式
权重、数据集和微调脚本
本次指南以如下权重、数据集和脚本作为示例。
| 类别 | 链接 |
|---|---|
| 权重 | PyTorch-NPU/open_llama_7b |
| 数据集 | alpaca_data |
| 微调脚本 | train_sft.py |
PEFT微调
以下是基于LoRA、AdaLoRA和IA3的配置示例,该配置一般会在模型被加载后使用,请将以下模型代码内容加在train_sft.py中,放置位置如下:
model = openmind.AutoModelForCausalLM.from_pretrained(
model_args.model_name_or_path,
cache_dir=training_args.cache_dir,
trust_remote_code=True
)
### 请在此处添加代码
### 代码为LoRA、AdaLoRA或IA3相关配置代码
LoRA
LoRA是一种用于高效训练大型语言模型的技术。它通过引入两个低秩矩阵A和B来减少训练参数的数量。原始的大型语言模型可能需要训练数百万到数十亿个参数,而LoRA只训练这两个矩阵,从而大幅减少了参数数量。LoRA的一个关键优点是,降低了训练资源的消耗,显著加快模型的训练速度。
from peft import LoraConfig, get_peft_model, TaskType
# 定义LoRA配置
lora_config = LoraConfig(
r=16,
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.1,
bias="none",
)
# 添加LoRA adaptor
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
AdaLoRA
AdaLoRA是LoRA的一个变体,它进一步改进了LoRA的参数效率。AdaLoRA通过考虑LoRA矩阵的奇异值作为其重要性的指标,来动态地为不同的适配器分配不同的秩。这意味着AdaLoRA可以为模型的不同部分分配更多或更少的训练资源,从而提高模型对特定任务的适应性。AdaLoRA的这种自适应方法使得模型在保持参数总数不变的情况下,能够更有效地分配参数,提高训练效率和模型性能。
from peft import AdaLoraConfig, get_peft_model
# 定义AdaLoRA配置
config = AdaLoraConfig(
r=8,
init_r=12,
tinit=200,
tfinal=1000,
deltaT=10,
target_modules=["q_proj", "v_proj"]
)
# 添加AdaLoRA adaptor
model = get_peft_model(model, config)
model.print_trainable_parameters()
IA3
IA3是一种先进的参数高效微调方法,它通过学习向量来对激活层加权进行缩放,从而获得更强的性能,同时仅引入相对少量的新参数。IA3使用学习向量重新调整内部激活。 这些学习到的向量被注入到典型的基于transformer的架构中的attention和feedforward模块中。原始权重保持冻结,这些学习到的向量是微调期间唯一可训练的参数。与学习LoRA更新低秩权重矩阵不同,处理学习向量可以大量减少可训练参数。
from peft import IA3Config, get_peft_model
# 定义IA3配置
peft_config = IA3Config(target_modules=["q_proj", "v_proj"])
# 添加IA3 adaptor
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
微调
运行以下shell代码即可通过LoRA, AdaLoRA或IA3的方式微调训练。
if [ -d ./test/output ];then
rm -rf ./test/output
mkdir -p ./test/output
else
mkdir -p ./test/output
fi
# master_port参数需用户根据实际情况进行配置
torchrun --nproc_per_node=8 --master_port=xxx train_sft.py \
--model_name_or_path "PyTorch-NPU/open_llama_7b" \
--data_path alpaca_data.json \
--bf16 True \
--output_dir ./test/output \
--max_steps 2000 \
--per_device_train_batch_size 1 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 3000 \
--save_total_limit 1 \
--learning_rate 2e-5 \
--weight_decay 0. \
--warmup_ratio 0.03 \
--lr_scheduler_type "cosine" \
--seed 1234 \
--logging_steps 1 > ./test/output/train.log 2>&1