PEFT汇总

简单使用

  • 模型训练

from transformers import AutoModelForSeq2SeqLM
from peft import LoraConfig, TaskType, get_peft_model
​
###############
# 这里只关注下面的几行代码,也就是peft简单使用
peft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)
model = AutoModelForSeq2SeqLM.from_pretrained("bigscience/mt0-large")
model = get_peft_model(model, peft_config)
###############
​
training_args = TrainingArguments(...)
training_args = TrainingArguments(...)
model.save_pretrained("your/path")
  • 模型推断

from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
import torch
​
model = AutoPeftModelForCausalLM.from_pretrained("your/path")
tokenizer = AutoTokenizer.from_pretrained("model match tokenizer")
​
model = model.to("cuda")
model.eval()
inputs = tokenizer("Preheat the oven to 350 degrees and place the cookie dough", return_tensors="pt")
​
outputs = model.generate(input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=50)
print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)[0])

综述

使用步骤

  • 目的:快速使用高效微调方法微调模型

  • 如何实现目的:得到peftModel

  • 如何得到peftModel:需要两个组件,一个方法

    • 高效微调配置文件

    • 原始的模型

    • get_peft_model方法

  • 便捷之处:可以直接和transformers等库相兼容

微调方法

微调方法也就是说我们要如何指定配置文件,首先需要先知道有peft支持哪几种微调方法

  • Prompt-base methods

  • Lora methods

  • IA3

主要对象

Configuration

配置类的组织方式

  • PeftConfigMixin

    • PeftConfig

      • PromptLearningConfig(soft prompt方法的父类)

      • LoraConfig

      • ...

注意:什么方法需要传入什么参数去官网进行查看

PEFT types

包含peft支持的适配器(adapters )以及peft支持的任务类型

适配器任务类型
PROMPT_TUNINGSEQ_CLS(文本分类)
P_TUNINGSEQ_2_SEQ_LM(语言到语言建模)
PREFIX_TUNINGCAUSAL_LM(因果关系模型)
LORATOKEN_CLS(标记分类)
ADAPTION_PROMPTQUESTION_ANS(问题回答)
...FEATURE_EXTRACTION(特征提取)

PEFT model

这个对象是我们使用get_peft_model函数得到的peft_model对象

子类

  • PeftModelForSequenceClassification

  • PeftModelForTokenClassification

  • PeftModelForCausalLM

  • PeftModelForSeq2SeqLM

  • PeftModelForFeatureExtraction

属性

属性作用限制
model返回基础的transformer模型
peft_configpeft模型的配置
modules_to_save要保存的子模块列表名称
prompt_encoderprompt编码器PromptLearningConfig
prompt_tokens虚拟的prompt tokenPromptLearningConfig
transformer_backbone_name基础模型中主干模型名称PromptLearningConfig
word_embeddings基础模型中的词嵌入PromptLearningConfig

方法

  • add_adapter(adapter_name: str, peft_config: PeftConfig,low_cpu_mem_usage: bool = False)

    • 向模型中添加peft_config的适配器

    • 新添加的这个适配器是没有经过任何训练的

    • adapter_name应该是唯一的

    • 默认添加的这个适配器是没有自动被激活的,需要使用set_adapter()函数激活

  • load_adapter(model_id, adapter_name, is_trainable)

    • 将一个训练好的适配器放入模型

    • 这个适配器的名字不能和模型中已经存在的适配器名字一样

  • set_adapter(adapter_name)

    • 将名字为adapter_name的适配器激活

    • 一次只能有一个适配器处于激活的状态

  • save_pretrained(save_directory)

    • 将适配器模型以及适配器的配置文件存储到目标文件夹

  • from_pretrained(model, adapter_name, is_trainable)

    • 使用peft权重去实例化一个预训练模型

    • 原始的预训练模型结构可能会发生变化

  • disable_adapter()

    • 上下文管理器去禁止使用适配器

    • 在这个上下文管理器中model使用的是原始的model

  • get_base_model()

    • 返回原始模型

  • get_nb_trainable_parameters()

    • 返回模型可训练参数的数量以及模型参数数量

  • print_trainable_parameters()

    • 返回模型中的可训练参数

    • 和get_nb_trainable_parameters()方法返回的有所差别

  • get_prompt(batch_size)

    • 返回peft模型使用的虚拟prompt

    • 只有在使用prompt learning的时候才可以使用

  • get_prompt_embedding_to_save()

    • 返回存储模型是要保存的prompt编码

    • 只有在使用prompt learning的时候才可以使用

  • get_model_status()

    • 获取模型优化器状态

  • get_layer_status()

    • 获取模型中每个适配器层的状态

注意:还有一个PeftMixedModel方法没有介绍,他是一种特殊的peft模型,可以混合不同类型的适配器

Utilities

  • peft.cast_mixed_precision_params(model, dtype)

    • 将模型的所有不可训练参数转换为给定的数据类型

  • peft.get_peft_model(model, peft_config, adapter_name:str="default")

    • 从基础模型和配置中得到一个peft模型

  • peft.inject_adapter_in_model(peft_config, model, adapter_name)

    • 创造适配器并且将其注入到模型中

    • 不支持prompt learning 和 adaption prompt

  • peft.get_peft_model_state_dict(model)

    • 返回peft模型的状态字典

  • peft.prepare_model_for_kbit_training(model)

    • 这个方法仅是支持transformers模型

  • peft.get_layer_status(model)

    • 获取模型优化器状态

  • peft.get_model_status(model)

    • 获取模型中每个适配器层的状态

不足

  • 一些最底层的基类没有介绍,因为我还没有涉及到自己去设计一种实现方法
<think>好的,我现在需要解决用户遇到的ImportError: libcudart.so.12无法找到的问题。用户之前可能升级或更换了CUDA版本,导致动态链接库路径不正确。首先,我应该回顾类似的问题,比如用户引用中提到的libcudart.so.10.1和libcublas.so.9.0的错误,这些通常是因为CUDA安装或环境变量配置不当引起的。 首先,确认用户是否正确安装了CUDA 12。用户可能安装了CUDA 12,但系统仍然在寻找旧版本。需要检查CUDA的安装路径,通常是/usr/local/cuda-12.x,并确保PATH和LD_LIBRARY_PATH环境变量指向正确的版本。例如,引用[2]中提到设置PATH和LD_LIBRARY_PATH到cuda的bin和lib64目录。 接下来,检查软链接是否正确。如果用户之前安装过其他版本的CUDA,可能需要更新软链接,使/usr/local/cuda指向12.x版本。此外,运行ldconfig更新共享库缓存,如引用[4]中提到的使用sudo ldconfig命令。 然后,考虑PyTorch或其他深度学习框架是否与CUDA 12兼容。用户可能需要重新安装支持CUDA 12的框架版本,例如通过pip或conda安装对应的包。例如,使用conda安装时指定cudatoolkit=12.x。 另外,用户可能没有正确设置环境变量。需要确保在.bashrc或.zshrc中添加正确的路径,并source使其生效。引用[2]中的环境变量设置是一个例子,但需要调整到CUDA 12的路径。 最后,如果问题仍然存在,可能需要检查系统是否有多个CUDA版本残留,或者某些应用程序硬编码了旧版本的路径。这时候,彻底清理旧版本并重新安装CUDA 12可能会有帮助。 总结步骤应该是:验证CUDA安装、配置环境变量、更新软链接和缓存、检查框架兼容性,必要时重新安装框架。同时参考用户提供的类似问题的解决方案,比如引用[1]中的修改环境变量和软连接方法,引用[4]中的ldconfig使用。</think>### 解决 `ImportError: libcudart.so.12` 问题的分步指南 此错误通常是由于CUDA动态链接库路径未正确配置或CUDA版本不兼容导致。以下是具体解决步骤: --- #### **1. 确认CUDA 12是否已正确安装** - **检查CUDA安装路径** 默认安装路径为 `/usr/local/cuda-12.x`(具体版本号替换为实际安装的版本,如`12.0`、`12.1`)。 执行以下命令验证: ```bash ls /usr/local | grep cuda-12 ``` 如果未找到对应目录,需重新安装CUDA 12[^1]。 - **验证CUDA版本** 运行以下命令查看CUDA版本是否匹配: ```bash nvcc --version ``` 若输出未显示CUDA 12.x,说明当前环境变量可能指向旧版本。 --- #### **2. 配置环境变量** - **修改`PATH`和`LD_LIBRARY_PATH`** 在用户配置文件(如`~/.bashrc`或`~/.zshrc`)中添加以下内容: ```bash export PATH=/usr/local/cuda-12.x/bin${PATH:+:${PATH}} export LD_LIBRARY_PATH=/usr/local/cuda-12.x/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} ``` 替换`cuda-12.x`为实际安装的版本号。保存后执行: ```bash source ~/.bashrc # 或 source ~/.zshrc ``` - **验证环境变量** 运行以下命令检查路径是否生效: ```bash echo $PATH echo $LD_LIBRARY_PATH ``` --- #### **3. 更新系统共享库缓存** 执行以下命令刷新动态链接库缓存[^4]: ```bash sudo ldconfig ``` --- #### **4. 检查CUDA软链接** 如果系统默认使用`/usr/local/cuda`作为CUDA路径,需确保其指向CUDA 12: ```bash sudo rm /usr/local/cuda # 删除旧链接(如有) sudo ln -s /usr/local/cuda-12.x /usr/local/cuda ``` --- #### **5. 验证PyTorch/TensorFlow等框架的CUDA兼容性** - **确认框架版本支持CUDA 12** 例如,PyTorch需使用预编译的CUDA 12版本: ```bash # PyTorch安装命令示例(CUDA 12.1) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 ``` - **重新安装框架** 如果已安装的框架不支持CUDA 12,需卸载后重新安装: ```bash pip uninstall torch pip install torch --upgrade --no-cache-dir ``` --- #### **6. 检查残留的旧版本CUDA** 如果系统中存在多个CUDA版本,需彻底清理旧版本: ```bash sudo apt purge cuda-10.1 # 示例:删除CUDA 10.1 sudo apt autoremove ``` --- ### **相关问题** 1. 如何检查系统中已安装的CUDA版本? 2. 如何在同一台机器上管理多个CUDA版本? 3. PyTorch如何指定使用特定CUDA版本? --- ### **引用说明** : 若CUDA未正确安装,需从[NVIDIA官网](https://developer.nvidia.com/cuda-toolkit)下载对应版本。 [^2]: 环境变量配置需指向实际安装路径,否则会导致库文件无法加载。 : `ldconfig`用于更新共享库缓存,确保系统能找到新添加的库路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值