get_peft_model

get_peft_model 是 PEFT (Parameter-Efficient Fine-Tuning) 框架中的一个核心函数,通常用于加载或创建一个可以高效微调的模型,尤其适合在低资源场景或小型数据集上进行模型微调。PEFT 框架支持的技术包括 LoRA (Low-Rank Adaptation)、Prefix Tuning、Prompt Tuning 等。

下面是如何使用 get_peft_model 的示例:

安装所需库

 

bash

复制代码

pip install peft transformers

示例代码

 

python

复制代码

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import get_peft_model, LoraConfig, TaskType

# 加载基础模型和分词器
model_name = "gpt2"  # 可替换为其他模型,例如 "bert-base-uncased"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 配置 PEFT 微调(以 LoRA 为例)
peft_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,  # 任务类型(如文本生成、分类等)
    inference_mode=False,          # 是否仅用于推理
    r=8,                           # LoRA 矩阵的秩
    lora_alpha=32,                 # LoRA 缩放因子
    lora_dropout=0.1               # Dropout 概率
)

# 应用 PEFT 配置到模型
peft_model = get_peft_model(model, peft_config)

# 检查模型结构
print(peft_model)

# 示例微调
input_text = "Hello, how are you?"
input_ids = tokenizer(input_text, return_tensors="pt").input_ids
labels = input_ids.clone()
outputs = peft_model(input_ids=input_ids, labels=labels)
loss = outputs.loss
print(f"Loss: {loss.item()}")

# 保存微调后的模型
peft_model.save_pretrained("peft_lora_model")

参数说明

  • task_type: 指定任务类型,例如 TaskType.CAUSAL_LM(因果语言建模)、TaskType.SEQ_CLS(序列分类)等。
  • r: LoRA 的秩,通常设为 4 或 8。
  • lora_alpha: 调整 LoRA 参数对模型输出的影响。
  • lora_dropout: 避免过拟合的 Dropout 概率。

PEFT 优势

  1. 参数高效:只更新少量新增参数,减少计算和存储开销。
  2. 低资源需求:适合小型数据集和低计算资源环境。
  3. 灵活性强:支持多种任务和模型。

如果有更具体的需求(例如其他 PEFT 方法或特定模型支持),可以进一步调整配置。

[WARNING|logging.py:329] 2025-03-04 21:16:20,919 >> Unsloth: Dropout = 0 is supported for fast patching. You are using dropout = 0.01. Unsloth will patch all other layers, except LoRA matrices, causing a performance hit. Unsloth: Offloading input_embeddings to disk to save VRAM Traceback (most recent call last): File "/root/miniconda3/bin/llamafactory-cli", line 8, in <module> sys.exit(main()) ^^^^^^ File "/root/autodl-tmp/ai/LLaMA-Factory/src/llamafactory/cli.py", line 112, in main run_exp() File "/root/autodl-tmp/ai/LLaMA-Factory/src/llamafactory/train/tuner.py", line 93, in run_exp _training_function(config={"args": args, "callbacks": callbacks}) File "/root/autodl-tmp/ai/LLaMA-Factory/src/llamafactory/train/tuner.py", line 67, in _training_function run_sft(model_args, data_args, training_args, finetuning_args, generating_args, callbacks) File "/root/autodl-tmp/ai/LLaMA-Factory/src/llamafactory/train/sft/workflow.py", line 52, in run_sft model = load_model(tokenizer, model_args, finetuning_args, training_args.do_train) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/root/autodl-tmp/ai/LLaMA-Factory/src/llamafactory/model/loader.py", line 169, in load_model model = init_adapter(config, model, model_args, finetuning_args, is_trainable) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/root/autodl-tmp/ai/LLaMA-Factory/src/llamafactory/model/adapter.py", line 299, in init_adapter model = _setup_lora_tuning( ^^^^^^^^^^^^^^^^^^^ File "/root/autodl-tmp/ai/LLaMA-Factory/src/llamafactory/model/adapter.py", line 235, in _setup_lora_tuning model = get_unsloth_peft_model(model, model_args, peft_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/root/autodl-tmp/ai/LLaMA-Factory/src/llamafactory/model/model_utils/unsloth.py", line 79, in get_unsloth_peft_model return FastLanguageModel.get_peft_model(**peft_kwargs, **unsloth_peft_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/root/miniconda3/lib/python3.12/site-packages/unsloth/models/llama.py", line 2377, in get_peft_model offload_input_embeddings(model, temporary_location) File "/root/miniconda3/lib/python3.12/site-packages/unsloth/models/_utils.py", line 767, in offload_input_embeddings offloaded_W = offload_to_disk(model.get_input_embeddings(), model, "input_embeddings", temporary_location) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/root/miniconda3/lib/python3.12/site-packages/unsloth/models/_utils.py", line 760, in offload_to_disk offloaded_W = torch.load(filename, map_location = "cpu", mmap = True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/root/miniconda3/lib/python3.12/site-packages/torch/serialization.py", line 1470, in load raise pickle.UnpicklingError(_get_wo_message(str(e))) from None _pickle.UnpicklingError: Weights only load failed. In PyTorch 2.6, we changed the default value of the `weights_only` argument in `torch.load` from `False` to `True`. Re-running `torch.load` with `weights_only` set to `False` will likely succeed, but it can result in arbitrary code execution. Do it only if you got the file from a trusted source. Please file an issue with the following so that we can make `weights_only=True` compatible with your use case: WeightsUnpickler error: Unsupported operand 149 Check the documentation of torch.load to learn more about types accepted by default with weights_only https://pytorch.org/docs/stable/generated/torch.load.html.
03-08
<think>好的,我现在要帮用户分析他们遇到的这个错误。首先,看看错误信息。用户在使用Unsloth和LLaMA-Factory进行模型训练时遇到了问题。日志里有几个关键点需要注意: 首先,有一个警告信息提到Unsloth支持dropout=0,但用户使用的是0.01,所以除了LoRA矩阵外,其他层会被打补丁,可能影响性能。这部分可能不是导致错误的主要原因,但需要注意是否应该调整dropout参数。 然后,主要错误出现在加载输入嵌入层时,尝试将input_embeddings卸载到磁盘以节省VRAM,结果触发了_pickle.UnpicklingError。错误信息指出在PyTorch 2.6中,torch.load的weights_only参数默认从False改为True,而当前操作可能不支持这种模式,导致加载失败,并建议尝试将weights_only设为False,但要注意安全风险。 接下来,我需要考虑可能的解决方案。首先,用户使用的PyTorch版本可能比较新(2.6或更高),而Unsloth的代码可能还没有适配这个变化。错误发生在torch.load时,尝试加载磁盘上的嵌入权重文件,但由于weights_only=True无法解析某些操作符,所以失败。 可能的解决步骤包括: 1. 检查PyTorch版本,如果用户使用的是2.6及以上,可能需要降级到2.5或更低版本,因为weights_only的默认值变化可能导致兼容性问题。 2. 修改Unsloth的代码,在调用torch.load时显式设置weights_only=False,但需要确保文件来源可信。 3. 检查是否有Unsloth或LLaMA-Factory的更新版本,可能已经修复了这个问题。 4. 调整模型加载的配置,避免触发输入嵌入层的卸载,比如增加VRAM或调整模型参数减少内存占用。 然后,我需要验证这些步骤的可行性。比如,降级PyTorch可能有效,但需要用户确认环境管理的可行性。修改第三方库的代码虽然可行,但可能影响后续维护。检查更新版本是最安全的做法,但可能用户已经使用最新版。调整配置参数可能需要用户了解训练设置的细节。 另外,用户可能不太熟悉PyTorch版本更新带来的变化,需要解释清楚问题的根源。同时,提醒用户注意安全,如果选择设置weights_only=False,必须确保文件来源可靠,避免执行恶意代码。 总结下来,应该分步骤建议用户先尝试降级PyTorch,或者检查库的更新。如果不行,再考虑修改代码中的torch.load参数,并强调安全注意事项。此外,也可以建议用户调整模型加载选项,比如关闭offload_input_embeddings,或者增加可用内存,避免触发卸载操作。</think>这个错误信息表明在使用Unsloth和LLaMA-Factory进行模型训练时遇到了PyTorch的权重加载问题。以下是分步骤的解决方案分析: --- ### **错误原因分析** 1. **PyTorch版本兼容性问题** - PyTorch 2.6及以上版本将`torch.load()`的`weights_only`参数默认值从`False`改为`True` - 当尝试加载通过`offload_input_embeddings`卸载到磁盘的嵌入权重时,触发了不支持的操作符错误(Unsupported operand 149) 2. **Unsloth的内存优化机制** - Unsloth试图将输入嵌入层(input_embeddings)卸载到磁盘以节省显存 - 此操作依赖的`torch.load`调用因PyTorch版本变更而失败 --- ### **解决方案** #### **方法1:降级PyTorch版本** ```bash # 将PyTorch降级到2.5.0或更低版本 pip install torch==2.5.0 torchvision==0.15.0 torchaudio==2.5.0 ``` #### **方法2:修改Unsloth源码** 1. 定位文件:`/root/miniconda3/lib/python3.12/site-packages/unsloth/models/_utils.py` 2. 修改第760行: ```python # 原代码 offloaded_W = torch.load(filename, map_location = "cpu", mmap = True) # 修改为(显式设置weights_only=False) offloaded_W = torch.load(filename, map_location="cpu", mmap=True, weights_only=False) ``` ⚠️ **注意**:需确保加载的权重文件来源可信,避免执行恶意代码 #### **方法3:禁用输入嵌入卸载** 在训练命令中添加参数禁用Unsloth的显存优化: ```bash --disable_unsloth_offloading # 禁止嵌入层卸载 --disable_unsloth_check # 跳过Unsloth的兼容性检查 ``` #### **方法4:调整内存配置** 尝试通过以下方式减少显存占用: 1. 降低`batch_size` 2. 使用梯度累积(gradient_accumulation_steps) 3. 启用混合精度训练(fp16/bf16) --- ### **补充说明** 1. **关于Dropout的警告** ```bash [WARNING] Unsloth: Dropout = 0 is supported for fast patching. You are using dropout = 0.01. ``` - 建议将Dropout设为0以获得最佳性能(需在训练参数中设置`--dropout 0`) 2. **PyTorch版本兼容性建议** - 推荐使用PyTorch 2.0.x ~ 2.5.x版本 - 可通过`conda list torch`检查当前版本 --- 如果问题仍未解决,建议: 1. 检查LLaMA-Factory和Unsloth的最新版本 2. 在社区提交完整的训练配置参数和复现步骤 3. 尝试在NVIDIA官方Docker环境(如`nvidia/cuda:12.2.0-base-ubuntu22.04`)中复现问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值