赞
踩
在上一期内容中介绍了RAG的大模型定制方案以及具体实现的demo,这一期将对finetune进行简单介绍。
目录
LLM的下游应用中,增量预训练和指令跟随是经常会用到的两种微调模式。两者的区别在于增量预训练往往是让基座模型学习到一些新知识,例如某个垂类领域的常识,训练数据往往是无监督的文章、书籍、代码等自然语言。而指令跟随以及监督微调主要目的是让模型学会对话模板,根据人类指令进行对话。在实际应用中,仅通过此阶段也能注入一定量的垂类知识。其训练数据集是有标签的监督高质量的对话和问答数据。与增量预训练不太一样的一点在于,此阶段对数据的质量要求较高,而对数据集的大小没有过多要求。
在实际对话时,通常会有三种角色 System给定一些上下文信息,比如“你是个安全的 A 助手”实际用户, User 会提出一些问题,比如“世界第一高峰是?” 根据 User 的输入,Assistant结合 System 的上下文信息,做出答,比如“珠穆朗玛峰”。需要注意的是,不同的开源大模型的模板不一样,尤其是special token的设置方面。在训练时需要严格匹配。
此阶段使用的是无监督的语料数据,在处理上往往将system和input字段留空而只使用assistant字段进行训练。为了让 LLM 知道什么时候开始一段话,什么时候结束一段话实际训练时需要对数据添加起始符 (BOS) 和结束符(EOS)大多数的模型都是使用<s> 作为起始符,</s> 作为结束符。
LoRA由论文 Lora: Low-rank adaptation of large language models 提出,QLoRA在LoRA的基础上主要增加了大模型的量化技术,由论文 Qlora: Efficient finetuning of quantized llms 提出:
简单来说,LoRA是通过在原本的模型权重之外增加一个支路,这个支路包含两个小的部分A,B,这个新增的旁路成为Adapter。Aghajanyan的研究表明:预训练模型拥有极小的内在维度(instrisic dimension),即存在一个极低维度的参数,微调它和在全参数空间中微调能起到相同的效果。同时Aghajanyan发现在预训练后,越大的模型有越小的内在维度,这也解释了为何大模型都拥有很好的few-shot能力。
全参数微调、LoRA微调、QLoRA对比如图:
QLORA包含两个组件:4-bit NormalFloat量化和Double Quantization。其中:4-bit NormalFloat数据类型是基于Quantile Quantization技术开发的,通过估计输入张量的分位数来保证每个量化区间分配相等的值。Double Quantization是将额外的量化常数进行量化以减小内存开销的过程。论文的另外一个贡献是合页优化器 (Paged Optimizer) 即gpu显存满了可以将一部分参数移到cpu内存里面计算 (Offload) ,进一步降低了显存开销。
XTuner适配多种生态,可以从HuggingFace、ModelScope等库加载模型和数据集,同时支持多款开源大模型;InternLM、Llama、Qwen、Baichuan、ChatGLM、Mistral (MoE) 等等。具体内容可以参考具体的github页面。目前支持的内置配置:
- baichuan2_13b_base_qlora_alpaca_e3
- baichuan2_13b_base_qlora_alpaca_enzh_e3
- baichuan2_13b_base_qlora_alpaca_enzh_oasst1_e3
- baichuan2_13b_base_qlora_alpaca_zh_e3
- baichuan2_13b_base_qlora_arxiv_gentitle_e3
- baichuan2_13b_base_qlora_code_alpaca_e3
- baichuan2_13b_base_qlora_colorist_e5
- baichuan2_13b_base_qlora_lawyer_e3
- baichuan2_13b_base_qlora_oasst1_512_e3
- baichuan2_13b_base_qlora_oasst1_e3
- baichuan2_13b_base_qlora_open_platypus_e3
- baichuan2_13b_base_qlora_sql_e3
- baichuan2_13b_chat_qlora_alpaca_e3
- baichuan2_13b_chat_qlora_alpaca_enzh_e3
- baichuan2_13b_chat_qlora_alpaca_enzh_oasst1_e3
- baichuan2_13b_chat_qlora_alpaca_zh_e3
- baichuan2_13b_chat_qlora_code_alpaca_e3
- baichuan2_13b_chat_qlora_lawyer_e3
- baichuan2_13b_chat_qlora_oasst1_512_e3
- baichuan2_13b_chat_qlora_oasst1_e3
- baichuan2_13b_chat_qlora_open_platypus_e3
- baichuan2_7b_base_qlora_alpaca_e3
- baichuan2_7b_base_qlora_alpaca_enzh_e3
- baichuan2_7b_base_qlora_alpaca_enzh_oasst1_e3
- baichuan2_7b_base_qlora_alpaca_zh_e3
- baichuan2_7b_base_qlora_arxiv_gentitle_e3
- baichuan2_7b_base_qlora_code_alpaca_e3
- baichuan2_7b_base_qlora_colorist_e5
- baichuan2_7b_base_qlora_lawyer_e3
- baichuan2_7b_base_qlora_oasst1_512_e3
- baichuan2_7b_base_qlora_oasst1_e3
- baichuan2_7b_base_qlora_open_platypus_e3
- baichuan2_7b_base_qlora_sql_e3
- baichuan2_7b_chat_qlora_alpaca_e3
- baichuan2_7b_chat_qlora_alpaca_enzh_e3
- baichuan2_7b_chat_qlora_alpaca_enzh_oasst1_e3
- baichuan2_7b_chat_qlora_alpaca_zh_e3
- baichuan2_7b_chat_qlora_code_alpaca_e3
- baichuan2_7b_chat_qlora_lawyer_e3
- baichuan2_7b_chat_qlora_oasst1_512_e3
- baichuan2_7b_chat_qlora_oasst1_e3
- baichuan2_7b_chat_qlora_open_platypus_e3
- baichuan_13b_base_qlora_alpaca_e3
- baichuan_13b_base_qlora_alpaca_enzh_e3
- baichuan_13b_base_qlora_alpaca_enzh_oasst1_e3
- baichuan_13b_base_qlora_alpaca_zh_e3
- baichuan_13b_base_qlora_arxiv_gentitle_e3
- baichuan_13b_base_qlora_code_alpaca_e3
- baichuan_13b_base_qlora_colorist_e5
- baichuan_13b_base_qlora_lawyer_e3
- baichuan_13b_base_qlora_medical_e1
- baichuan_13b_base_qlora_moss_sft_all_e1
- baichuan_13b_base_qlora_moss_sft_all_e2_gpu8
- baichuan_13b_base_qlora_moss_sft_plugins_e1
- baichuan_13b_base_qlora_oasst1_512_e3
- baichuan_13b_base_qlora_oasst1_e3
- baichuan_13b_base_qlora_open_platypus_e3
- baichuan_13b_base_qlora_openorca_e1
- baichuan_13b_base_qlora_sql_e3
- baichuan_13b_base_qlora_tiny_codes_e1
- baichuan_13b_chat_qlora_alpaca_e3
- baichuan_13b_chat_qlora_alpaca_enzh_e3
- baichuan_13b_chat_qlora_alpaca_enzh_oasst1_e3
- baichuan_13b_chat_qlora_alpaca_zh_e3
- baichuan_13b_chat_qlora_arxiv_gentitle_e3
- baichuan_13b_chat_qlora_code_alpaca_e3
- baichuan_13b_chat_qlora_colorist_e5
- baichuan_13b_chat_qlora_lawyer_e3
- baichuan_13b_chat_qlora_medical_e1
- baichuan_13b_chat_qlora_oasst1_512_e3
- baichuan_13b_chat_qlora_oasst1_e3
- baichuan_13b_chat_qlora_open_platypus_e3
- baichuan_13b_chat_qlora_openorca_e1
- baichuan_13b_chat_qlora_sql_e3
- baichuan_13b_chat_qlora_tiny_codes_e1
- baichuan_7b_qlora_alpaca_e3
- baichuan_7b_qlora_alpaca_enzh_e3
- baichuan_7b_qlora_alpaca_enzh_oasst1_e3
- baichuan_7b_qlora_alpaca_zh_e3
- baichuan_7b_qlora_arxiv_gentitle_e3
- baichuan_7b_qlora_code_alpaca_e3
- baichuan_7b_qlora_colorist_e5
- baichuan_7b_qlora_lawyer_e3
- baichuan_7b_qlora_medical_e1
- baichuan_7b_qlora_moss_sft_all_e1
- baichuan_7b_qlora_moss_sft_all_e2_gpu8
- baichuan_7b_qlora_moss_sft_plugins_e1
- baichuan_7b_qlora_oasst1_512_e3
- baichuan_7b_qlora_oasst1_e3
- baichuan_7b_qlora_open_platypus_e3
- baichuan_7b_qlora_openorca_e1
- baichuan_7b_qlora_sql_e3
- baichuan_7b_qlora_tiny_codes_e1
- chatglm2_6b_qlora_alpaca_e3
- chatglm2_6b_qlora_alpaca_enzh_e3
- chatglm2_6b_qlora_alpaca_enzh_oasst1_e3
- chatglm2_6b_qlora_alpaca_zh_e3
- chatglm2_6b_qlora_arxiv_gentitle_e3
- chatglm2_6b_qlora_code_alpaca_e3
- chatglm2_6b_qlora_colorist_e5
- chatglm2_6b_qlora_lawyer_e3
- chatglm2_6b_qlora_medical_e1
- chatglm2_6b_qlora_oasst1_512_e3
- chatglm2_6b_qlora_oasst1_e3
- chatglm2_6b_qlora_open_platypus_e3
- chatglm2_6b_qlora_openorca_e1
- chatglm2_6b_qlora_sql_e3
- chatglm2_6b_qlora_tiny_codes_e1
- chatglm3_6b_base_qlora_alpaca_e3
- chatglm3_6b_base_qlora_alpaca_enzh_e3
- chatglm3_6b_base_qlora_alpaca_enzh_oasst1_e3
- chatglm3_6b_base_qlora_alpaca_zh_e3
- chatglm3_6b_base_qlora_arxiv_gentitle_e3
- chatglm3_6b_base_qlora_code_alpaca_e3
- chatglm3_6b_base_qlora_colorist_e5
- chatglm3_6b_base_qlora_lawyer_e3
- chatglm3_6b_base_qlora_medical_e1
- chatglm3_6b_base_qlora_oasst1_512_e3
- chatglm3_6b_base_qlora_oasst1_e3
- chatglm3_6b_base_qlora_open_platypus_e3
- chatglm3_6b_base_qlora_openorca_e1
- chatglm3_6b_base_qlora_sql_e3
- chatglm3_6b_base_qlora_tiny_codes_e1
- chatglm3_6b_qlora_alpaca_e3
- chatglm3_6b_qlora_alpaca_enzh_e3
- chatglm3_6b_qlora_alpaca_enzh_oasst1_e3
- chatglm3_6b_qlora_alpaca_zh_e3
- chatglm3_6b_qlora_arxiv_gentitle_e3
- chatglm3_6b_qlora_code_alpaca_e3
- chatglm3_6b_qlora_colorist_e5
- chatglm3_6b_qlora_lawyer_e3
- chatglm3_6b_qlora_medical_e1
- chatglm3_6b_qlora_oasst1_512_e3
- chatglm3_6b_qlora_oasst1_e3
- chatglm3_6b_qlora_open_platypus_e3
- chatglm3_6b_qlora_openorca_e1
- chatglm3_6b_qlora_sql_e3
- chatglm3_6b_qlora_tiny_codes_e1
- deepspeed_zero1
- deepspeed_zero2
- deepspeed_zero2_offload
- deepspeed_zero3
- deepspeed_zero3_offload
- internlm_20b_qlora_alpaca_e3
- internlm_20b_qlora_alpaca_enzh_e3
- internlm_20b_qlora_alpaca_enzh_oasst1_e3
- internlm_20b_qlora_alpaca_zh_e3
- internlm_20b_qlora_arxiv_gentitle_e3
- internlm_20b_qlora_code_alpaca_e3
- internlm_20b_qlora_colorist_e5
- internlm_20b_qlora_lawyer_e3
- internlm_20b_qlora_msagent_react_e3_gpu8
- internlm_20b_qlora_oasst1_512_e3
- internlm_20b_qlora_oasst1_e3
- internlm_20b_qlora_open_platypus_e3
- internlm_20b_qlora_sql_e3
- internlm_7b_full_alpaca_e3
- internlm_7b_full_alpaca_enzh_e3
- internlm_7b_full_alpaca_enzh_oasst1_e3
- internlm_7b_full_alpaca_zh_e3
- internlm_7b_full_oasst1_e3
- internlm_7b_qlora_alpaca_e3
- internlm_7b_qlora_alpaca_enzh_e3
- internlm_7b_qlora_alpaca_enzh_oasst1_e3
- internlm_7b_qlora_alpaca_zh_e3
- internlm_7b_qlora_arxiv_gentitle_e3
- internlm_7b_qlora_code_alpaca_e3
- internlm_7b_qlora_colorist_e5
- internlm_7b_qlora_lawyer_e3
- internlm_7b_qlora_medical_e1
- internlm_7b_qlora_moss_sft_all_e1
- internlm_7b_qlora_moss_sft_all_e2_gpu8
- internlm_7b_qlora_moss_sft_plugins_e1
- internlm_7b_qlora_msagent_react_e3_gpu8
- internlm_7b_qlora_oasst1_512_e3
- internlm_7b_qlora_oasst1_e3
- internlm_7b_qlora_oasst1_e3_hf
- internlm_7b_qlora_oasst1_mmlu_e3
- internlm_7b_qlora_open_platypus_e3
- internlm_7b_qlora_openorca_e1
- internlm_7b_qlora_sql_e3
- internlm_7b_qlora_tiny_codes_e1
- internlm_chat_20b_qlora_alpaca_e3
- internlm_chat_20b_qlora_alpaca_enzh_e3
- internlm_chat_20b_qlora_alpaca_enzh_oasst1_e3
- internlm_chat_20b_qlora_alpaca_zh_e3
- internlm_chat_20b_qlora_code_alpaca_e3
- internlm_chat_20b_qlora_lawyer_e3
- internlm_chat_20b_qlora_oasst1_512_e3
- internlm_chat_20b_qlora_oasst1_e3
- internlm_chat_20b_qlora_open_platypus_e3
- internlm_chat_7b_qlora_alpaca_e3
- internlm_chat_7b_qlora_alpaca_enzh_e3
- internlm_chat_7b_qlora_alpaca_enzh_oasst1_e3
- internlm_chat_7b_qlora_alpaca_zh_e3
- internlm_chat_7b_qlora_arxiv_gentitle_e3
- internlm_chat_7b_qlora_code_alpaca_e3
- internlm_chat_7b_qlora_colorist_e5
- internlm_chat_7b_qlora_lawyer_e3
- internlm_chat_7b_qlora_medical_e1
- internlm_chat_7b_qlora_oasst1_512_e3
- internlm_chat_7b_qlora_oasst1_e3
- internlm_chat_7b_qlora_open_platypus_e3
- internlm_chat_7b_qlora_openorca_e1
- internlm_chat_7b_qlora_sql_e3
- internlm_chat_7b_qlora_tiny_codes_e1
- llama2_70b_int8_lora_open_platypus_e1
- llama2_70b_int8_lora_open_platypus_e1_hf
- llama2_70b_qlora_open_platypus_e1
- llama2_70b_qlora_open_platypus_e1_hf
- llama2_7b_chat_qlora_alpaca_e3
- llama2_7b_chat_qlora_alpaca_enzh_e3
- llama2_7b_chat_qlora_alpaca_enzh_oasst1_e3
- llama2_7b_chat_qlora_alpaca_zh_e3
- llama2_7b_chat_qlora_arxiv_gentitle_e3
- llama2_7b_chat_qlora_code_alpaca_e3
- llama2_7b_chat_qlora_colorist_e5
- llama2_7b_chat_qlora_lawyer_e3
- llama2_7b_chat_qlora_medical_e1
- llama2_7b_chat_qlora_oasst1_512_e3
- llama2_7b_chat_qlora_oasst1_e3
- llama2_7b_chat_qlora_open_platypus_e3
- llama2_7b_chat_qlora_openorca_e1
- llama2_7b_chat_qlora_sql_e3
- llama2_7b_chat_qlora_tiny_codes_e1
- llama2_7b_full_wizardlm_e1
- llama2_7b_qlora_alpaca_e3
- llama2_7b_qlora_alpaca_enzh_e3
- llama2_7b_qlora_alpaca_enzh_oasst1_e3
- llama2_7b_qlora_alpaca_zh_e3
- llama2_7b_qlora_arxiv_gentitle_e3
- llama2_7b_qlora_code_alpaca_e3
- llama2_7b_qlora_colorist_e5
- llama2_7b_qlora_lawyer_e3
- llama2_7b_qlora_medical_e1
- llama2_7b_qlora_moss_sft_all_e1
- llama2_7b_qlora_moss_sft_all_e2_gpu8
- llama2_7b_qlora_moss_sft_plugins_e1
- llama2_7b_qlora_msagent_react_e3_gpu8
- llama2_7b_qlora_oasst1_512_e3
- llama2_7b_qlora_oasst1_e3
- llama2_7b_qlora_open_platypus_e3
- llama2_7b_qlora_openorca_e1
- llama2_7b_qlora_sql_e3
- llama2_7b_qlora_tiny_codes_e1
- llama_7b_qlora_alpaca_e3
- llama_7b_qlora_alpaca_enzh_e3
- llama_7b_qlora_alpaca_enzh_oasst1_e3
- llama_7b_qlora_alpaca_zh_e3
- llama_7b_qlora_arxiv_gentitle_e3
- llama_7b_qlora_code_alpaca_e3
- llama_7b_qlora_colorist_e5
- llama_7b_qlora_lawyer_e3
- llama_7b_qlora_medical_e1
- llama_7b_qlora_moss_sft_all_e1
- llama_7b_qlora_moss_sft_all_e2_gpu8
- llama_7b_qlora_moss_sft_plugins_e1
- llama_7b_qlora_oasst1_512_e3
- llama_7b_qlora_oasst1_e3
- llama_7b_qlora_open_platypus_e3
- llama_7b_qlora_openorca_e1
- llama_7b_qlora_sql_e3
- llama_7b_qlora_tiny_codes_e1
- mistral_7b_qlora_skypile_pretrain_e1
- qwen_7b_chat_qlora_alpaca_e3
- qwen_7b_chat_qlora_alpaca_enzh_e3
- qwen_7b_chat_qlora_alpaca_enzh_oasst1_e3
- qwen_7b_chat_qlora_alpaca_zh_e3
- qwen_7b_chat_qlora_arxiv_gentitle_e3
- qwen_7b_chat_qlora_code_alpaca_e3
- qwen_7b_chat_qlora_colorist_e5
- qwen_7b_chat_qlora_lawyer_e3
- qwen_7b_chat_qlora_medical_e1
- qwen_7b_chat_qlora_oasst1_512_e3
- qwen_7b_chat_qlora_oasst1_e3
- qwen_7b_chat_qlora_open_platypus_e3
- qwen_7b_chat_qlora_openorca_e1
- qwen_7b_chat_qlora_sql_e3
- qwen_7b_chat_qlora_tiny_codes_e1
- qwen_7b_qlora_alpaca_e3
- qwen_7b_qlora_alpaca_enzh_e3
- qwen_7b_qlora_alpaca_enzh_oasst1_e3
- qwen_7b_qlora_alpaca_zh_e3
- qwen_7b_qlora_arxiv_gentitle_e3
- qwen_7b_qlora_code_alpaca_e3
- qwen_7b_qlora_colorist_e5
- qwen_7b_qlora_lawyer_e3
- qwen_7b_qlora_medical_e1
- qwen_7b_qlora_moss_sft_all_e1
- qwen_7b_qlora_moss_sft_all_e2_gpu8
- qwen_7b_qlora_moss_sft_plugins_e1
- qwen_7b_qlora_oasst1_512_e3
- qwen_7b_qlora_oasst1_e3
- qwen_7b_qlora_open_platypus_e3
- qwen_7b_qlora_openorca_e1
- qwen_7b_qlora_sql_e3
- qwen_7b_qlora_tiny_codes_e1
- starcoder_qlora_stack_exchange_example
- yi_34b_qlora_alpaca_enzh_e3
- yi_6b_qlora_alpaca_enzh_e3
- zephyr_7b_beta_qlora_alpaca_e3
XTuner默认开启了Flash Attention的加速方式。Flash Attention和DeepSpeed ZeRO是XTuner最重要的两个优化技巧。Flash Attention 将 Attention 计算并行化避免了计算过程中 Attention Score NxN的显存占用 (训练过程中的 N 都比较大)。ZeRO 优化通过将训练过程中的参数、梯度和优化器状态切片保存,能够在多 GPU 训练时显著节省显存除了将训练中间状态切片外,DeepSpeed 训练时使用FP16 的权重,相较于 Pytorch 的AMP 训练在单 GPU 上也能大幅节省显存。
XTuner框架自动开启Flash Attention,利用1/4张A100显卡利用 QLoRA 算法在 oasst1 数据集上微调 InternLM-7B一个epoch大约需要4个小时,开始DeepSpeed后大约需要2个小时。将转换成HuggingFace格式的Adapter和原模型合并后,进行对话,结果如图:
由于是全精度,模型的推理速度和加载速度均比较慢。在生成回答时是“一个字一个字蹦”。加上 --bits 4 参数让模型在4bit精度上加载可以加快这个速度,并且在一些简单问题上,模型的输出结果并不会有很大的差别:
且模型具备多轮对话能力。
以Medication QA数据集为例,数据集的格式是.xlsx格式的。再次步骤只需要更改私域数据集的格式以满足训练要求即可。同时在代码中将模型文件夹路径和数据集路径正确配置即可。由于数据集较小只需要2min左右的时间:
另外一个任务要求通过微调修改模型的自我认知:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。