HuggingFace PEFT项目中的PiSSA微调技术详解

HuggingFace PEFT项目中的PiSSA微调技术详解

【免费下载链接】peft 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning. 【免费下载链接】peft 项目地址: https://gitcode.com/gh_mirrors/pe/peft

概述

在大型语言模型(LLM)的微调领域,PiSSA(Principal Singular values and Singular vectors Adaptation)是一种创新的参数高效微调方法。作为HuggingFace PEFT(Parameter-Efficient Fine-Tuning)项目的一部分,PiSSA通过奇异值分解(SVD)技术实现了比传统LoRA更高效的模型微调方式。

PiSSA技术原理

PiSSA的核心思想是将模型中的权重矩阵W∈ℝᵐˣⁿ分解为三个部分:

  1. 两个可训练的低秩矩阵A∈ℝᵐˣʳ和B∈ℝʳˣⁿ的乘积(其中r≪min(m,n))
  2. 一个用于误差校正的残差矩阵Wʳᵉˢ∈ℝᵐˣⁿ

具体实现过程如下:

  1. 对原始权重矩阵W进行奇异值分解(SVD)
  2. 使用主奇异值和奇异向量初始化A和B矩阵
  3. 剩余奇异值和奇异向量用于初始化残差矩阵Wʳᵉˢ
  4. 在微调过程中,Wʳᵉˢ保持冻结,仅训练A和B矩阵

这种分解方式相比传统LoRA有以下优势:

  • 收敛速度更快
  • 最终性能更优
  • 量化误差更小(相比QLoRA)

快速上手指南

基础使用示例

import torch
from peft import LoraConfig, get_peft_model
from transformers import AutoTokenizer, AutoModelForCausalLM
from trl import SFTConfig, SFTTrainer
from datasets import load_dataset

# 加载基础模型
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf", 
                                           torch_dtype=torch.bfloat16, 
                                           device_map="auto")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer.pad_token_id = tokenizer.eos_token_id

# 配置PiSSA参数
lora_config = LoraConfig(
    init_lora_weights="pissa_niter_4",  # 使用快速SVD初始化PiSSA
)
peft_model = get_peft_model(model, lora_config)

# 打印可训练参数
peft_model.print_trainable_parameters()

# 准备数据集
dataset = load_dataset("imdb", split="train[:1%]")

# 配置训练参数
training_args = SFTConfig(dataset_text_field="text", max_seq_length=128)
trainer = SFTTrainer(
    model=peft_model,
    args=training_args,
    train_dataset=dataset,
    tokenizer=tokenizer,
)

# 开始训练
trainer.train()
peft_model.save_pretrained("pissa-llama-2-7b")

使用预训练PiSSA模块

import torch
from peft import PeftModel
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf", 
    torch_dtype=torch.bfloat16, 
    device_map="auto"
)
# 加载PiSSA微调后的模型
peft_model = PeftModel.from_pretrained(model, "pissa-llama-2-7b")

高级应用技巧

预处理模型的使用

为了节省每次运行时的SVD计算时间,建议直接使用预处理好的分解模型。如果需要自定义预处理,可以使用以下命令:

python preprocess.py \
    --base_model_name_or_path meta-llama/Llama-2-7b-hf \
    --init_lora_weights pissa \
    --output_dir pissa-llama-2-7b-r32-alpha-32 \
    --lora_r 32 \
    --lora_alpha 32 \
    --lora_dropout 0 \
    --bits bf16

PiSSA到LoRA的转换

PiSSA的主要优势体现在训练阶段。对于训练好的PiSSA适配器,可以将其等效转换为LoRA适配器以便使用和共享:

# 保存微调后的PiSSA适配器
peft_model.save_pretrained(output_dir) 

# 转换为LoRA格式
peft_model.save_pretrained(output_dir, 
                          path_initial_model_for_weight_conversion="pissa_init")

转换后的LoRA可以像普通LoRA一样加载使用:

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf", 
    torch_dtype=torch.bfloat16, 
    device_map="auto"
)
peft_model = PeftModel.from_pretrained(model, "pissa-llama-2-7b-lora")

4位或8位量化微调

要进行量化微调,需要先在全精度下分解原始模型,然后以4位或8位配置重新加载残差模型:

python pissa_finetuning.py \
    --residual_model_name_or_path fxmeng/pissa-llama-2-7b-r16-alpha-16 \
    --output_dir output/pissa-llama-2-7b-r16-alpha-16-metamath-10k \
    --bits nf4 \
    --data_path meta-math/MetaMathQA \
    --dataset_split train[:100000] \
    --dataset_field query response \
    --bf16 True \
    --num_train_epochs 1 \
    --per_device_train_batch_size 32 \
    --gradient_accumulation_steps 4 \
    --convert_pissa_to_lora

这种方法将高频、分布外参数保留在低秩PiSSA模块中,从而减少了残差模型量化时的误差。

技术优势分析

  1. 收敛速度:PiSSA通过SVD初始化,使模型在训练初期就接近最优解,显著加快了收敛速度。

  2. 性能表现:实验表明,PiSSA最终能达到比LoRA更优的性能指标。

  3. 量化友好:相比QLoRA,PiSSA减少了量化误差,使模型在低精度下仍能保持良好性能。

  4. 灵活性:可以方便地转换为标准LoRA格式,便于部署和共享。

适用场景

PiSSA特别适合以下场景:

  • 需要快速收敛的大模型微调任务
  • 资源受限环境下的高效微调
  • 需要量化部署的应用场景
  • 需要频繁切换不同适配器的多任务场景

总结

PiSSA作为PEFT项目中的一项创新技术,通过巧妙的矩阵分解和初始化策略,在大型语言模型微调领域提供了更高效的解决方案。无论是从收敛速度、最终性能还是量化友好性来看,PiSSA都展现出了明显的优势,是大模型微调实践中值得尝试的技术选择。

【免费下载链接】peft 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning. 【免费下载链接】peft 项目地址: https://gitcode.com/gh_mirrors/pe/peft

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值