ChatGLM系列五:Lora微调

文章探讨了主流的大模型微调方法,如Freeze、P-Tuning和LoRA,尤其关注LoRA在减少参数量的同时保持良好性能。LoRA通过增加低秩矩阵进行训练,适用于资源有限的情况。实验结果显示,LoRA在效果和速度上优于Freeze和部分P-Tuning策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前主流对大模型进行微调方法有三种:Freeze方法、P-Tuning方法和Lora方法

LoRA: 在大型语言模型上对指定参数(权重矩阵)并行增加额外的低秩矩阵,并在模型训练过程中,仅训练额外增加的并行低秩矩阵的参数,冻结其他参数。 当“秩值”远小于原始参数维度时,新增的低秩矩阵参数量也就很小。在下游任务tuning时,仅须训练很小的参数,但能获取较好的表现结果。
在这里插入图片描述
LoRA: 在大型语言模型上对指定参数(权重矩阵)并行增加额外的低秩矩阵,并在模型训练过程中,仅训练额外增加的并行低秩矩阵的参数,冻结其他参数。 当“秩值”远小于原始参数维度时,新增的低秩矩阵参数量也就很小。在下游任务tuning时,仅须训练很小的参数,但能获取较好的表现结果。
在这里插入图片描述

下载代码

git clone https://github.com/liucongg/ChatGLM-Finetuning

环境配置

cpm_kernels==1.0.11
deepspeed==0.9.0
numpy==1.24.2
peft==0.3.0
sentencepiece==0.1.96
tensorboard==2.11.0
tensorflow==2.13.0
torch==1.13.1+cu116
tqdm==4.64.1
transformers==4.27.1

(1)、ChatGLM单卡训练

CUDA_VISIBLE_DEVICES=0 deepspeed --master_port 520 train.py \
              --train_path data/spo_0.json \
              --model_name_or_path ChatGLM-6B \
              --per_device_train_batch_size 1 \
              --max_len 1560 \
              --max_src_len 1024 \
              --learning_rate 1e-4 \
              --weight_decay 0.1 \
              --num_train_epochs 2 \
              --gradient_accumulation_steps 4 \
              --warmup_ratio 0.1 \
              --mode glm \
              --train_type lora \
              --lora_dim 16 \
              --lora_alpha 64 \
              --lora_dropout 0.1 \
              --lora_module_name "query_key_value" \
              --seed 1234 \
              --ds_file ds_zero2_no_offload.json \
              --gradient_checkpointing \
              --show_loss_step 10 \
              --output_dir ./output-glm

(2)、ChatGLM四卡训练

CUDA_VISIBLE_DEVICES=0,1,2,3 deepspeed --master_port 520 train.py \
              --train_path data/spo_0.json \
              --model_name_or_path ChatGLM-6B \
              --per_device_train_batch_size 1 \
              --max_len 1560 \
              --max_src_len 1024 \
              --learning_rate 1e-4 \
              --weight_decay 0.1 \
              --num_train_epochs 2 \
              --gradient_accumulation_steps 4 \
              --warmup_ratio 0.1 \
              --mode glm \
              --train_type lora \
              --lora_dim 16 \
              --lora_alpha 64 \
              --lora_dropout 0.1 \
              --lora_module_name "query_key_value" \
              --seed 1234 \
              --ds_file ds_zero2_no_offload.json \
              --gradient_checkpointing \
              --show_loss_step 10 \
              --output_dir ./output-glm

(3)、ChatGLM2单卡训练

CUDA_VISIBLE_DEVICES=0 deepspeed --master_port 520 train.py \
              --train_path data/spo_0.json \
              --model_name_or_path ChatGLM2-6B \
              --per_device_train_batch_size 1 \
              --max_len 1560 \
              --max_src_len 1024 \
              --learning_rate 1e-4 \
              --weight_decay 0.1 \
              --num_train_epochs 2 \
              --gradient_accumulation_steps 4 \
              --warmup_ratio 0.1 \
              --mode glm2 \
              --train_type lora \
              --lora_dim 16 \
              --lora_alpha 64 \
              --lora_dropout 0.1 \
              --lora_module_name "query_key_value,dense_h_to_4h,dense_4h_to_h,dense" \
              --seed 1234 \
              --ds_file ds_zero2_no_offload.json \
              --gradient_checkpointing \
              --show_loss_step 10 \
              --output_dir ./output-glm2

(4)、ChatGLM2四卡训练

CUDA_VISIBLE_DEVICES=0,1,2,3 deepspeed --master_port 520 train.py \
              --train_path data/spo_0.json \
              --model_name_or_path ChatGLM2-6B \
              --per_device_train_batch_size 1 \
              --max_len 1560 \
              --max_src_len 1024 \
              --learning_rate 1e-4 \
              --weight_decay 0.1 \
              --num_train_epochs 2 \
              --gradient_accumulation_steps 4 \
              --warmup_ratio 0.1 \
              --mode glm2 \
              --train_type lora \
              --lora_dim 16 \
              --lora_alpha 64 \
              --lora_dropout 0.1 \
              --lora_module_name "query_key_value,dense_h_to_4h,dense_4h_to_h,dense" \
              --seed 1234 \
              --ds_file ds_zero2_no_offload.json \
              --gradient_checkpointing \
              --show_loss_step 10 \
              --output_dir ./output-glm2

(5)、耗费显存资源占用对比—LoRA方法:对比ChaGLM和ChaGLM2

在这里插入图片描述注意:Lora方法在模型保存时仅保存了Lora训练参数,因此在模型预测时需要将模型参数进行合并,具体参考merge_lora.py。

四种微调资源耗费比较

在这里插入图片描述

结果分析:

  • 效果为PT>Freeze>Lora>PT-Only-Embedding;
  • 速度为PT-Only-Embedding>Lora>Freeze>PT;
  • PT-Only-Embedding效果很不理想,发现在训练时,最后的loss仅能收敛到2.几,而其他机制可以收敛到0.几。分析原因为,输出内容形式与原有语言模型任务相差很大,仅增加额外Embedding参数,不足以改变复杂的下游任务;
  • 由于大模型微调都采用大量instruction进行模型训练,仅采用单一的指令进行微调时,对原来其他的指令影响不大,因此并没导致原来模型的能力丧失;
<think>好的,我现在需要回答用户关于如何使用LoRAChatGLM3-6B模型进行微调的问题。首先,我应该回顾一下用户提供的引用内容,看看有没有相关的信息。 根据引用[1],提到使用PEFT库中的PeftModel可以快速应用LoRA到任意模型。引用[2]和[4]则涉及ChatGLM2-6B的微调实践,虽然用户问的是ChatGLM3-6B,但可能步骤类似。引用[3]和[4]提到数据集构建和训练脚本的运行,这些也是微调的关键步骤。 接下来,我需要组织步骤。首先,安装必要的库,比如PEFT和Transformers。然后,加载预训练模型和Tokenizer,应用LoRA配置。之后,准备数据集,定义训练参数,使用Trainer进行训练,最后保存和加载模型。可能还需要提醒用户注意数据集格式、硬件要求和量化配置等。 需要确保回答符合用户的要求,结构清晰,步骤详细。同时,要引用相关的引用内容,比如PEFT的使用和训练脚本的运行。另外,用户可能对性能优化或应用场景有后续问题,所以需要准备相关问题。</think>### 使用LoRAChatGLM3-6B模型进行微调的步骤 #### 1. **环境准备** - 安装必要库:需安装`peft`、`transformers`和`datasets`库。 ```bash pip install peft transformers datasets ``` - 硬件要求:建议使用支持FP16/BF16混合精度训练的GPU(如NVIDIA V100/A100)[^2][^4]。 #### 2. **加载基础模型与Tokenizer** ```python from transformers import AutoModelForCausalLM, AutoTokenizer model = AutoModelForCausalLM.from_pretrained("THUDM/chatglm3-6b") tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b") ``` #### 3. **配置LoRA参数** 使用`peft.LoraConfig`定义低秩适配器参数,例如: ```python from peft import LoraConfig, get_peft_model lora_config = LoraConfig( r=8, # 低秩矩阵的秩 lora_alpha=32, # 缩放系数 target_modules=["query_key_value"], # 针对ChatGLM的注意力层进行适配 lora_dropout=0.1, task_type="CAUSAL_LM" ) model = get_peft_model(model, lora_config) ``` #### 4. **准备数据集** - 数据集格式需为文本对(输入-输出),例如分类任务可转换为: ```json {"text": "问题:... 回答:...", "label": 0} ``` - 使用`datasets`库加载并预处理数据: ```python from datasets import load_dataset dataset = load_dataset("json", data_files={"train": "path/to/train.json"}) ``` #### 5. **定义训练参数** ```python from transformers import TrainingArguments training_args = TrainingArguments( output_dir="./output", per_device_train_batch_size=4, gradient_accumulation_steps=4, learning_rate=3e-4, fp16=True, # 启用混合精度训练 num_train_epochs=3, logging_steps=100, save_strategy="epoch" ) ``` #### 6. **启动训练** ```python from transformers import Trainer trainer = Trainer( model=model, args=training_args, train_dataset=dataset["train"], data_collator=lambda data: tokenizer(data["text"], padding=True, truncation=True) ) trainer.train() ``` #### 7. **保存与加载微调后的模型** ```python model.save_pretrained("./chatglm3-6b-lora") # 加载时需合并基础模型与LoRA权重 from peft import PeftModel loaded_model = PeftModel.from_pretrained(base_model, "./chatglm3-6b-lora") ``` --- ### 关键注意事项 1. **数据集适配**:需根据任务调整数据格式(如对话格式、分类标签等)。 2. **量化训练**:若显存不足,可使用`bitsandbytes`库进行4/8比特量化。 3. **参数选择**:LoRA的秩(`r`)和缩放系数(`alpha`)需平衡效果与计算成本[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值