官方解释🔗
target_modules ( Optional[Union[List[str], str]] )
— 要应用适配器的模块的名称。如果指定,则仅替换具有指定名称的模块。传递字符串时,将执行正则表达式匹配。传递字符串列表时,要么执行精确匹配,要么检查模块名称是否以任何传递的字符串结尾。如果指定为“全线性”,则选择所有线性/Conv1D 模块,不包括输出层。如果未指定,将根据模型架构选择模块。如果架构未知,则会引发错误 - 在这种情况下,您应该手动指定目标模块。
不同模型的target_modules设置
来自于peft/utils/constants.py 。如果你本地安装了peft安装包,则可以在以下位置看到
C:\Users\chris\AppData\Local\Programs\Python\Python312\Lib\site-packages\peft\utils\constants.py
TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING = {
"t5": ["q", "v"],
"mt5": ["q", "v"],
"bart": ["q_proj", "v_proj"],
"gpt2": ["c_attn"],
"bloom": ["query_key_value"],
"blip-2": ["q", "v", "q_proj", "v_proj"],
"opt": ["q_proj", "v_proj"],
"gptj": ["q_proj", "v_proj"],
"gpt_neox": ["query_key_value"],
"gpt_neo": ["q_proj", "v_proj"],
"bert": ["query", "value"],
"roberta": ["query", "value"],
"xlm-roberta": ["query", "value"],
"electra": ["query", "value"],
"deberta-v2": ["query_proj", "value_proj"],
"deberta": ["in_proj"],
"layoutlm": ["query", "value"],
"llama": ["q_proj", "v_proj"],
"chatglm": ["query_key_value"],
"gpt_bigcode": ["c_attn"],
"mpt": ["Wqkv"],
"RefinedWebModel": ["query_key_value"],
"RefinedWeb": ["query_key_value"],
"falcon": ["query_key_value"],
"btlm": ["c_proj", "c_attn"],
"codegen": ["qkv_proj"],
"mistral": ["q_proj", "v_proj"],
"mixtral": ["q_proj", "v_proj"],
"stablelm": ["q_proj", "v_proj"],
"phi": ["q_proj", "v_proj", "fc1", "fc2"],
"gemma": ["q_proj", "v_proj"],
"qwen2": ["q_proj", "v_proj"],
}
可以看到TRANSFORMERS_MODELS_TO_VERA_TARGET_MODULES_MAPPING
针对了部分预制的大语言模型,定义了默认的target_modules
值。如果我们采用的是未在实现定义的大语言模型列表内,因此必须手动显示指定target_modules
。
而如何找到可以学习的参数呢,我们在加载模型后,直接打印可学习的参数名:
from transformers import AutoTokenizer,AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("Qwen2-0.5B-Instruct")
for name,param in model.named_parameters():
print(name)