大模型PEFT(二) 之 大模型LoRA指令微调学习记录

1.peft

1.1 微调方法批处理大小模式GPU显存速度

image.png

1.2 当前高效微调技术存在的一些问题


当前的高效微调技术很难在类似方法之间进行直接比较并评估它们的真实性能,主要的原因如下所示:

  • 参数计算口径不一致:参数计算可以分为三类: 可训练参数的数量微调模型与原始模型相比改变的参数的数量微调模型和原始模型之间差异的等级。例如,DiffPruning更新0.5%的参数,但是实际参与训练的参数量是200%。这为比较带来了困难。尽管可训练的参数量是最可靠的存储高效指标,但是也不完美。Ladder-sideTuning使用一个单独的小网络,参数量高于LoRA或BitFit,但是因为反向传播不经过主网络,其消耗的内存反而更小。
  • 缺乏模型大小的考虑:已有工作表明,大模型在微调中需要更新的参数量更小(无论是以百分比相对而论还是以绝对数量而论),因此(基)模型大小在比较不同PEFT方法时也要考虑到。
  • 缺乏测量基准和评价标准:不同方法所使用的模型/数据集组合都不一样,评价指标也不一样,难以得到有意义的结论。
  • 代码实现可读性差:很多开源代码都是简单拷贝Transformer代码库,然后进行小修小补。这些拷贝也不使用git fork,难以找出改了
    哪里。即便是能找到,可复用性也比较差(通常指定某个Transformer版本,没有说明如何脱离已有代码库复用这些方法)。

1.3 高效微调技术最佳实践

针对以上存在的问题,研究高效微调技术时,建议按照最佳实践进行实施:

  • 明确指出参数数量类型。
  • 使用不同大小的模型进行评估。
  • 和类似方法进行比较。
  • 标准化PEFT测量基准。重视代码清晰度,以最小化进行实现。

1.4 PEFT存在问题?


相比全参数微调,大部分的高效微调技术目前存在的两个问题:

  1. 推理速度会变慢;
  2. 模型精度会变差;

1.5 简单总结一下各种参数高效微调方法?

  • 增加额外参数:PrefixTuning、Prompt Tuning、Adapter Tuning及其变体。
  • 选取一部分参数更新:BitFit。
  • 引入重参数化:LoRA、AdaLoRA、QLoRA。
  • 混合高效微调:MAM Adapter、UniPELT。

2.适配器微调(Adapter-tuning)

2.1适配器微调(Adapter-tuning)思路

  • 设计了Adapter结构(首先是一个down-project层将高维度特征映射到低维特征,然后过一个非线形层之后,再用一个up-project结构将低维特征映射回原来的高维特征;同时也设计了skip-connection结构,确保了在最差的情况下能够退化为identity),并将其嵌入Transformer的结构里面;
  • 在训练时,固定住原来预训练模型的参数不变,只对新增的Adapter结构进行微调。同时为了保证训练的高效性(也就是尽可能少的引入更多参数)。

2.2 适配器微调(Adapter-tuning)特点

  • 通过在Transformer层中嵌入Adapter结构,在推理时会额外增加推理时长。

3.LoRA参数配置


# 设置超参数及配置
LORA_R =8
LORA_ALPHA = 16
LORA_DROPOUT = 0.05
TARGET_MODULES =["q_proj","v_proj",
]
config = LoraConfig(r=LORA_R,lora_alpha=LORA_ALPHA,target_modules=TARGET_MODULES,lora_dropout=LORA_DROPOUT,bias="none",task_type="CAUSAL_LM",
)

image.png

4.训练数据

用的 alpaca_gpt4_data_zh.json :https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM/blob/main/data/alpaca_gpt4_data_zh.json

image.png

注意,使用本地数据要在dataset_info.json 添加描述: https://github.com/hiyouga/LLaMA-Factory/blob/main/data/README_zh.md

image.png

在指令监督微调时,instruction 列对应的内容会与 input 列对应的内容拼接后作为人类指令,即人类指令为 instruction\ninput。而 output 列对应的内容为模型回答。

如果指定,system 列对应的内容将被作为系统提示词。

history 列是由多个字符串二元组构成的列表,分别代表历史消息中每轮对话的指令和回答。注意在指令监督微调时,历史消息中的回答内容也会被用于模型学习

[{"instruction": "人类指令(必填)","input": "人类输入(选填)","output": "模型回答(必填)","system": "系统提示词(选填)","history": [["第一轮指令(选填)", "第一轮回答(选填)"],["第二轮指令(选填)", "第二轮回答(选填)"]]}
]

对于上述格式的数据,dataset_info.json 中的数据集描述应为:

"数据集名称": {"file_name": "data.json","columns": {"prompt": "instruction","query": "input","response": "output","system": "system","history": "history"}
}

5. 开始训练

llamafactory-cli train \--stage sft \--do_train True \--model_name_or_path ./models/Qwen1.5-0.5B\ --preprocessing_num_workers 16 \--finetuning_type lora \--template qwen \--flash_attn auto \--dataset_dir data \--dataset  alpaca_gpt4_data_zh_local\--cutoff_len 1024 \--learning_rate 5e-05 \--num_train_epochs 3.0 \--max_samples 100000 \--per_device_train_batch_size 2 \--gradient_accumulation_steps 8 \--lr_scheduler_type cosine \--max_grad_norm 1.0 \--logging_steps 5 \--save_steps 100 \--warmup_steps 0 \--optim adamw_torch \--packing False \--report_to none \--output_dir saves/Qwen1.5-0.5B_alpaca_gpt4_data_zh/lora/sft \--fp16 True \--plot_loss True \--ddp_timeout 180000000 \--include_num_input_tokens_seen True \--lora_rank 8 \--lora_alpha 16 \--lora_dropout 0 \--use_rslora True \--lora_target all 

image.png

image.png

也可以用yaml文件训练,但是注意 学习率用浮点数,用1e-5 自然对数会报错,1.0e-5就没问题

llamafactory-cli  train examples/lora_multi_gpu/llama3_lora_sft.yaml
#llama3_lora_sft.yaml
### model
model_name_or_path: ./models/Qwen1.5-0.5B\### method
stage: sft
do_train: true
finetuning_type: lora
lora_target: all### dataset
dataset: alpaca_gpt4_data_zh_local
template: qwen
cutoff_len: 1024
max_samples: 1000
overwrite_cache: true
preprocessing_num_workers: 16### output
output_dir: saves/Qwen1.5-0.5B_alpaca_gpt4_data_zh/lora/sft
logging_steps: 10
save_steps: 500
plot_loss: true
overwrite_output_dir: true### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
#learning_rate: 1.0e-4
learning_rate: 0.00001
num_train_epochs: 3.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
fp16: true### eval
val_size: 0.1
per_device_eval_batch_size: 1
eval_strategy: steps
eval_steps: 500

image.png

PS:windows 需要安装新版本的

pip uninstall bitsandbytes
pip install https://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.41.0-py3-none-win_amd64.whl

image.png

试了 学习率 0.00001、1.0e-4、1.0e-5 三个epoch, 1.0e-4loss 表现最好,又试了1.0e-4五个epoch

image.png

image.png

6. 使用训练的模型进行推理

CUDA_VISIBLE_DEVICES=7 API_PORT=8030 llamafactory-cli api \--model_name_or_path .\models\Qwen1.5-0.5B \--adapter_name_or_path .\saves/Qwen1.5-0.5B_alpaca_gpt4_data_zh/lora/sft\
--finetuning_type lora\--template qwen

image.png

image.png

image.png

image.png

image.png

补充,以下先别看,版本有变化,内容待验证更新

lora大模型指令监督微调评测

CUDA_VISIBLE_DEVICES=0 python src/evaluate.py \--model_name_or_path path_to_llama_model \--adapter_name_or_path path_to_checkpoint \--template vanilla \--finetuning_type lora \--task ceval \--split validation \--lang zh \--n_shot 5 \--batch_size 4

大模型指令监督微调预测

CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \--stage sft \--do_predict \--model_name_or_path path_to_llama_model \--adapter_name_or_path path_to_checkpoint \--dataset alpaca_gpt4_zh \--template default \--finetuning_type lora \--output_dir path_to_predict_result \--per_device_eval_batch_size 1 \--max_samples 100 \--predict_with_generate \--fp16

如果使用 fp16 精度进行 LLaMA-2 模型的预测,请使用 --per_device_eval_batch_size=1。
建议在量化模型的预测中使用 --per_device_eval_batch_size=1 和 --max_target_length 128

0、多 GPU 分布式训练

0.1 使用 Huggingface Accelerate

accelerate launch --config_file config.yaml src/train_bash.py # 参数同上

使用 Accelerate 进行 LoRA 训练的 config.yaml 示例

compute_environment: LOCAL_MACHINE
debug: false
distributed_type: MULTI_GPU
downcast_bf16: 'no'
gpu_ids: all
machine_rank: 0
main_training_function: main
mixed_precision: fp16
num_machines: 1
num_processes: 4
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false

推荐使用 Accelerate 进行 LoRA 训练。

0.2 使用 DeepSpeed

deepspeed --num_gpus 8 src/train_bash.py \--deepspeed ds_config.json \... # 参数同上

使用 DeepSpeed ZeRO-2 进行全参数训练的 ds_config.json 示例

{"train_batch_size": "auto","train_micro_batch_size_per_gpu": "auto","gradient_accumulation_steps": "auto","gradient_clipping": "auto","zero_allow_untested_optimizer": true,"fp16": {"enabled": "auto","loss_scale": 0,"loss_scale_window": 1000,"initial_scale_power": 16,"hysteresis": 2,"min_loss_scale": 1},"bf16": {"enabled": "auto"},"zero_optimization": {"stage": 2,"allgather_partitions": true,"allgather_bucket_size": 5e8,"overlap_comm": true,"reduce_scatter": true,"reduce_bucket_size": 5e8,"contiguous_gradients": true,"round_robin_gradients": true}
}

更多训练脚本请查看 examples

合并 LoRA 权重并导出模型

CUDA_VISIBLE_DEVICES=0 python src/export_model.py \--model_name_or_path path_to_llama_model \--adapter_name_or_path path_to_checkpoint \--template default \--finetuning_type lora \--export_dir path_to_export \--export_size 2 \--export_legacy_format False

尚不支持量化模型的 LoRA 权重合并及导出。
仅使用 --model_name_or_path path_to_export 来加载导出后的模型。
合并 LoRA 权重之后可再次使用 --export_quantization_bit 4 和 --export_quantization_dataset data/c4_demo.json 基于 AutoGPTQ 量化模型。


参考

原文:非一般程序员第三季——大模型PEFT(二) 之 大模型LoRA指令微调实践
peft 笔记
适配器微调笔记
如何使用peft中的LoRA

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/25536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springcloud gateway扩展支持多版本灰度

改造要求 需要在原有的调度策略中通过客户端header中的version进行1个服务多实例下进行二次分组,让指定的version在指定的版本实例下进行轮训调度。 需要改造的点 1.业务服务在发布到naocs中的元数据需要指定版本号 2.网关的调度策略中需要增加版本的区分 3.无…

第二届黄河流域团队赛个人wp

个人wp web 两个题都几乎是网上的原题,不想多说了,放个链接,重点记录一下自己第一次遇到的misc 冰蝎流量分析 web1 https://blog.csdn.net/qq_51768842/article/details/125153850 web2 https://blog.csdn.net/m0_73512445/article/detai…

二维鱼游CFD代码

最近学了会Julia,参考了原作者的shark,做一下基于airfoils 2D的鱼游,暂时没想好有什么需要深入研究的,代码公开如下: 鱼身是naca0016,然后一些参数可以参考我以前发的论文。 using WaterLily, StaticArra…

牛客网刷题 | BC117 逆序输出

目前主要分为三个专栏,后续还会添加: 专栏如下: C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 描述 输入10个整数&…

表格状态码转换,其他索引串转成名字

1.问题分析 原数据库 关联指标为数字串的形式,每个小数对应的是另一张表index的属性,我们想知道对应指标的名称,怎么在这里下面这种形式呢? 两种思路: 1.修改在后端处理,把后端关联指标部分修改成图二的…

【Qt】Qt常见的数据类型

思维导图 学习目标 一、基础类型 因为Qt是一个C的框架,因此C的语法和数据类型在Qt中都是被支持的,但是Qt中也是定义了一些属于自己的数据类型,不过,好多数据类型都是对C的数据类型进行封装,下面来简要介绍一下这些基…

对称加密系统解析

目录​​​​​​​ 1.概述 2. 对称密码类型 3. 对称加密优缺点 4. 对称加密算法 4.1 DES 4.2 3DES 4.3 AES ​​​​​​4.4 SM1 4.5 SM4 1.概述 对称加密,是指在加密和解密时使用同一秘钥的方式。秘钥的传送和保存的保护非常重要,务必不要让秘…

突破网络屏障:掌握FRP内网穿透技术

1.FRP介绍 1.frp是什么 frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 I…

LeetCode | 1.两数之和

这道题,很容易想到的是暴力解,直接一个双重循环,对于数组中的每一个数,都去遍历其他数字,看能不能找到数字等于target-nums[i]的数字,时间复杂度为 O ( n 2 ) O(n^2) O(n2) 但是通过其他题目,我…

计算机毕业设计 | SpringBoot宠物医院管理 宠物商城购物系统(附源码)

写在前面 Le Dao宠物医院管理系统是一个超大型的,完成度很高的,集宠物医疗、宠物美容、宠物交易、宠物周边等各种功能于一身的,权限涵盖普通用户、医生、化验师、美容师、仓库主管、采购员等多种角色于一体的大型宠物医疗,购物系…

AI大模型在健康睡眠监测中的深度融合与实践案例

文章目录 1. 应用方案2. 技术实现2.1 数据采集与预处理2.2 构建与训练模型2.3 个性化建议生成 3. 优化策略4. 应用示例:多模态数据融合与实时监测4.1 数据采集4.2 实时监测与反馈 5. 深入分析模型选择和优化5.1 LSTM模型的优势和优化策略5.2 CNN模型的优势和优化策略…

java版多语言抢单系统 多语言海外AEON抢单可连单加额外单源码 抢单平台搭建开发 抢单开挂的软件

此套是全新开发的java版多语言抢单系统。 后端java,用的若依框架,这套代码前后端是编译后的,测试可以正常使用,语言繁体,英文,日语 源码大小:155M 源码下载:https://download.csd…

图像处理方向信息

前言 Exif 规范 定义了方向标签,用于指示相机相对于所捕获场景的方向。相机可以使用该标签通过方向传感器自动指示方向,也可以让用户通过菜单开关手动指示方向,而无需实际转换图像数据本身。 在图像处理过程中,若是原图文件包含…

Layui弹框中设置输入框自动获取焦点无效/Layui设置Input框自动获取焦点无效,怎么办?

1、问题概述? 有时候为了用户体验,期望当弹框打开的时候,指定的输入框能自动的获取焦点,用户就可以直接输入了。提升了用户体验。但有时候设置的时候没有效果。 2、正常的设置自动获取焦点方式 【input框设置方式】 使用关键字autofocus <input type="text&quo…

Zemax中FFT PSF和惠更斯PSF的区别?

在Zemax“分析”选项卡中&#xff0c;有PSF&#xff08;“点扩散函数”&#xff09;图&#xff0c;主要包括如下两种计算方式&#xff1a; 1. FFT PSF&#xff0c;快速傅里叶变换&#xff08;fast fourier transform&#xff0c;FFT&#xff09; 该方法可以看做是以下点扩散函…

心链14-----项目功能完善补坑+自动跳转登录页 + 重复加入队伍问题(分布式锁) 并发请求问题解决 + 项目部署上线

心链 — 伙伴匹配系统 一、todo 1、强制登录&#xff0c;自动跳转到登录页 解决&#xff1a;axios 全局配置响应拦截、并且添加重定向 1.在myAxios里配置响应拦截 这里我们要改变history 模式的实现&#xff0c;在main.ts里修改 当登录成功后&#xff0c;重定向到个人用户页…

Cyber Weekly #10

赛博新闻 1、最强开源大模型面世&#xff1a;阿里发布Qwen2 6月7日凌晨&#xff0c;阿里巴巴通义千问团队发布了Qwen2系列开源模型。该系列模型包括5个尺寸的预训练和指令微调模型&#xff1a;Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B、Qwen2-57B-A14B以及Qwen2-72B。据Qwen官方博客…

Vitis HLS 学习笔记--循环边界包含变量

目录 1. 简介 2. 分析与详解 2.1 未优化 2.2 LOOP_TRIPCOUNT 优化指令 2.3 重写变量循环边界 3. 总结 1. 简介 在硬件设计中&#xff0c;循环的迭代次数通常需要是固定的&#xff0c;因为这有助于资源的预分配和时序分析。 循环边界包含变量意味着循环的迭代次数不是固…

Java进阶_抽象类与方法

抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 抽象类除了不能实例化对象之…

按键精灵安装有乱码并且不能启动的解决办法

在国外购了电脑&#xff0c;系统是英文版 Windows 11&#xff0c;按键精灵死活都装不上去&#xff0c;打开exe的安装文件后出现乱码&#xff0c;安装完了后还是乱码&#xff0c;并且启动不了&#xff0c;以下是解决办法&#xff1a; 进入控制面板&#xff0c;并且点 Region&am…