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

2024-06-10 08:12

本文主要是介绍大模型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

这篇关于大模型PEFT(二) 之 大模型LoRA指令微调学习记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047621

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss