当前位置: 首页 > article >正文

ChatGLM系列五:Lora微调

目前主流对大模型进行微调方法有三种: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进行模型训练,仅采用单一的指令进行微调时,对原来其他的指令影响不大,因此并没导致原来模型的能力丧失;

http://www.kler.cn/a/106047.html

相关文章:

  • 5个有效的华为(HUAWEI)手机数据恢复方法
  • 使用IDE实现java端远程调试功能
  • 搭建Spring gateway网关微服务
  • sql中的聚合函数
  • 游戏如何应对内存修改
  • 详细分析ip addr show 查看网络配置的命令
  • Python轮廓追踪【OpenCV形态学操作】
  • JAVA实现生活废品回收系统 开源
  • 世界经济论坛:ChatGPT等生成式AI,对全球23%岗位产生巨大影响
  • advanced installer 做包教程
  • C++学习笔记之三(标准库、标准模板库、vector类)
  • 2023高频前端面试题-浏览器
  • Python爬虫(二十四)_selenium案例:执行javascript脚本
  • RFNet模型数据集采集处理流程
  • JS清除字符串中的空格
  • 平安校园智慧安防监控摄像头的布控建议
  • 优化改进YOLOv5算法:加入ODConv+ConvNeXt提升小目标检测能力——(超详细)
  • Jenkins自动化测试
  • python把ChestX-Det-Dataset的json样本转为COCO数据集的json格式
  • C语言文件读写,文件相关操作
  • 【TES641】基于VU13P FPGA的4路FMC接口基带信号处理平台
  • AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(六):一个AWTK工程
  • Go学习第十一章——协程goroutine与管道channel
  • Windows server服务器允许多用户远程的设置
  • sourcetree Incorrect username or password (access token)
  • 小型气象站数据采集网关准确监测雨量和风速