PEFT模型初始化:PeftModel.from_pretrained与get_peft_model的差异
两种PEFT模型初始化方式的核心差异
适用场景
PeftModel.from_pretrained(model, peft_model_id, ...):专门用来加载已训练完成的PEFT权重——不管是你自己之前微调好的,还是别人分享的LoRA/Adapter权重,用这个方法把它们挂载到基础模型上,直接就能用或者继续微调。get_peft_model(model, peft_config):用来搭建全新的PEFT训练结构——给基础模型添加PEFT可训练组件(比如LoRA层),此时PEFT权重是随机初始化的,必须经过训练才能生效,用于启动新的微调任务。
输入要求
PeftModel.from_pretrained需要传入peft_model_id:可以是本地保存PEFT权重的路径,也可以是模型仓库的PEFT模型ID,这个路径/ID里必须包含训练好的权重文件(比如adapter_model.bin)和配置文件(adapter_config.json)。另外还支持device_map、max_memory这类加载时的设备分配参数。get_peft_model需要传入peft_config:比如LoraConfig、IA3Config这类配置类,里面定义了PEFT的类型、要修改的目标层、秩大小等训练参数,框架会根据这个配置给基础模型注入对应的可训练模块。
后续使用逻辑
- 用
PeftModel.from_pretrained加载后的模型:直接就能做推理,也可以在已有PEFT权重的基础上继续微调。 - 用
get_peft_model初始化后的模型:必须先进行训练,否则PEFT模块是随机权重,推理效果和原始基础模型没区别甚至更差。
内部实现
PeftModel.from_pretrained:先解析PEFT配置文件,然后把预训练好的PEFT权重加载到对应层,基础模型的权重默认保持不动。get_peft_model:根据配置动态修改基础模型结构,注入PEFT可训练模块,并且默认把基础模型的参数设为不可训练,只让PEFT模块的参数参与训练。
内容的提问来源于stack exchange,提问作者EkoMickA
相关产品推荐
相关产品推荐

