当前位置:   article > 正文

huggingface 笔记:peft_huggingface peft

huggingface peft

1 介绍

  • PEFT 提供了参数高效的方法来微调大型预训练模型。
  • 传统的范式是为每个下游任务微调模型的所有参数,但由于当前模型的参数数量巨大,这变得极其昂贵且不切实际。
  • 相反,训练较少数量的提示参数或使用诸如低秩适应 (LoRA) 的重新参数化方法来减少可训练参数数量是更有效的

2 训练

2.1 加载并创建 LoraConfig 类

  • 每种 PEFT 方法都由一个 PeftConfig 类定义,该类存储了构建 PeftModel 的所有重要参数
  • eg:使用 LoRA 进行训练,加载并创建一个 LoraConfig 类,并指定以下参数
    • task_type:要训练的任务(在本例中为序列到序列语言建模)
    • inference_mode:是否将模型用于推理
    • r:低秩矩阵的维度
    • lora_alpha:低秩矩阵的缩放因子
    • lora_dropout:LoRA 层的丢弃概率
  1. from peft import LoraConfig, TaskType
  2. peft_config = LoraConfig(
  3. task_type=TaskType.SEQ_2_SEQ_LM,
  4. inference_mode=False,
  5. r=8,
  6. lora_alpha=32,
  7. lora_dropout=0.1)

2.2 创建 PeftModel

  • 一旦设置了 LoraConfig,就可以使用 get_peft_model() 函数创建一个 PeftModel
    • 需要一个基础模型 - 可以从 Transformers 库加载 -
    • 以及包含如何配置 LoRA 模型参数的 LoraConfig

2.2.1 加载需要微调的基础模型

  1. from transformers import AutoModel,AutoTokenizer
  2. import os
  3. import torch
  4. os.environ["HF_TOKEN"] = '*'
  5. #huggingface的私钥
  6. tokenizer=AutoTokenizer.from_pretrained('meta-llama/Meta-Llama-3-8B')
  7. model=AutoModel.from_pretrained('meta-llama/Meta-Llama-3-8B',
  8. torch_dtype=torch.bfloat16,
  9. low_cpu_mem_usage=True)

2.2.2 创建 PeftModel

将基础模型和 peft_config 与 get_peft_model() 函数一起包装以创建 PeftModel

  1. from peft import get_peft_model
  2. model = get_peft_model(model, peft_config)
  3. model.print_trainable_parameters()
  4. #了解模型中可训练参数的数量
  5. #trainable params: 3,407,872 || all params: 7,508,332,544 || trainable%: 0.0454

之后就可以train了

3保存模型

模型训练完成后,可以使用 save_pretrained 函数将模型保存到目录中。

model.save_pretrained("output_dir")

4 推理

  • 使用 AutoPeftModel 类和 from_pretrained 方法加载任何 PEFT 训练的模型进行推理
    • 对于没有明确支持 AutoPeftModelFor 类的任务,可以使用基础的 AutoPeftModel 类加载任务模型
  1. from peft import AutoPeftModelForCausalLM
  2. from transformers import AutoTokenizer
  3. import torch
  4. model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")
  5. #LORA过的模型
  6. tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")
  7. #普通的tokenizer
  8. model.eval()
  9. inputs = tokenizer("Preheat the oven to 350 degrees and place the cookie dough", return_tensors="pt")
  10. outputs = model.generate(input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=50)
  11. print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)[0])
  12. # "Preheat the oven to 350 degrees and place the cookie dough in the center of the oven. In a large bowl, combine the flour, baking powder, baking soda, salt, and cinnamon. In a separate bowl, combine the egg yolks, sugar, and vanilla."

5LoraConfig主要参数

r (int)

LoRA 注意力维度(“秩”)

【默认8】

target_modules

应用适配器的模块名称。

  • 如果指定,则仅替换具有指定名称的模块。
    • 传递字符串时,将执行正则表达式匹配。
    • 传递字符串列表时,将执行精确匹配或检查模块名称是否以传递字符串之一结尾。
    • 如果指定为 'all-linear',则选择所有线性/Conv1D 模块,排除输出层。
    • 如果未指定,将根据模型架构选择模块。
    • 如果架构未知,将引发错误
      • - 在这种情况下,应手动指定目标模块。

【默认None]

lora_alpha

LoRA 缩放的 alpha 参数

【默认8】

lora_dropout

LoRA 层的 dropout 概率

【默认0】

fan_in_fan_out

如果要替换的层存储权重为 (fan_in, fan_out),则设置为 True

例如,GPT-2 使用 Conv1D,它存储权重为 (fan_in, fan_out),因此应设置为 True

bias

LoRA 的偏置类型。可以是 'none'、'all' 或 'lora_only'。

如果是 'all' 或 'lora_only',则在训练期间将更新相应的偏置

use_rslora
  • 设置为 True 时,使用 Rank-Stabilized LoRA,将适配器缩放因子设置为 lora_alpha/math.sqrt(r),因为其效果更好。
  • 否则,将使用原始默认值 lora_alpha/r
modules_to_save除适配器层外,在最终检查点中设置为可训练和保存的模块列表
init_lora_weights

如何初始化适配器层的权重。

  • 传递 True(默认)将导致来自微软参考实现的默认初始化。
  • 传递 'gaussian' 将导致高斯初始化,按 LoRA 秩缩放。
  • 将初始化设置为 False 会导致完全随机初始化,不建议使用。
  • 传递 'loftq' 使用 LoftQ 初始化。
  • 传递 'pissa' 使用 PiSSA 初始化,收敛速度更快,性能更优。
  • 传递 pissa_niter_[number of iters]使用快速 SVD 基于 PiSSA 的初始化,其中 [number of iters] 表示执行 FSVD 的子空间迭代次数,必须为非负整数。
    • 当 [number of iters] 设置为 16 时,可以在几秒钟内完成 7b 模型的初始化,训练效果大致相当于使用 SVD。
layers_to_transform

要转换的层索引列表。

  • 如果传递一个整数列表,则将适配器应用于该列表中指定的层索引。
  • 如果传递单个整数,则在该索引处的层上应用转换。
layers_pattern层模式名称,仅在 layers_to_transform 不为 None 时使用
rank_pattern层名称或正则表达式到秩的映射
alpha_pattern层名称或正则表达式到 alpha 的映射

6举例

6.1 初始 model

  1. from transformers import AutoModel,AutoTokenizer
  2. import os
  3. import torch
  4. os.environ["HF_TOKEN"] = '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'
  5. tokenizer=AutoTokenizer.from_pretrained('meta-llama/Meta-Llama-3-8B')
  6. model=AutoModel.from_pretrained('meta-llama/Meta-Llama-3-8B',
  7. torch_dtype=torch.bfloat16,
  8. low_cpu_mem_usage=True)
  9. model

6.2 经典lora

  1. from peft import LoraConfig, TaskType
  2. peft_config = LoraConfig(
  3. r=8,
  4. lora_alpha=32,
  5. lora_dropout=0.1)
  6. from peft import get_peft_model
  7. lora_model = get_peft_model(model, peft_config)
  8. lora_model.print_trainable_parameters()
  9. lora_model

6.3 查看可训练参数

  1. for name,tensor in model.named_parameters():
  2. print(name,tensor.requires_grad)

for name,tensor in lora_model.named_parameters():
    print(name,tensor.requires_grad)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/960755
推荐阅读
相关标签
  

闽ICP备14008679号