社区供稿 | QLoRA 增量预训练与指令微调,及汉化 Llama2 的实践

2023/10/24 18:00
阅读数 86

我们探索和实现了一种基于QLoRA的轻量级的增量预训练和指令微调方案,并使用该方法对Llama2-13B进行中文知识迁移,在公开榜单和人工评测中验证了该方法的有效性。该方法可推广至对Baichuan、Qwen、InternLM、Falcon等模型的垂直域增量预训练与指令微调


在CMMLU榜单上,我们的模型优于Linly、Yayi、FlagAlpha等,与Ziya、Chinese-Alpaca-Plus及其接近。在🤗Open LLM Leaderboard上,我们的模型与Vicuna、Guanaco、Llama2及其接近。


在中文人工评测中,我们的模型以66.15%胜、30.77%平、3.08%负的成绩大幅领先Llama2以33.08%胜、60.77%平、6.15负的成绩领先Linly


上述评测结表明了我们的方法能够在提升Llama2的中文能力的基础上,保留Llama2优秀的英文能力。


本文将对该工作进行介绍,我们也开源了模型权重、训练代码、训练数据等,欢迎大家关注和Star⭐️我们的项目。


增量预训练:

https://github.com/yangjianxin1/Firefly-LLaMA2-Chinese


多轮指令微调

https://github.com/yangjianxin1/Firefly

01

Introduction

Llama系列模型具备非常强大的能力,但因为它主要在英文数据上进行训练,所以它的中文能力相对较弱。并且,Llama模型对中文的编解码效率较低,一个汉字往往会被编码成多个token,降低了训练和推理的速度,变相降低了模型可输入的最大文本长度。


为了解决上述问题,出现了许多中文Llama模型,它们通过对Llama模型进行中文词表扩充、增量预训练和指令微调,以提升Llama模型在中文域的表现。较为典型的模型有Chinese-Alpaca-2、Ziya-Llama、Linly-Llama2等。


Chinese-Alpaca-2对Llama2进行词表扩充、增量预训练(120GB)、指令微调(500万条),在48*A40 GPU上采用LoRA方案进行训练。Ziya-LlamaLlama进行词表扩充、增量预训练(110B token)、指令微调、RLHF,在160*A100 GPU上进行全量参数训练。Linly-Llama2对Llama2进行词表扩充、混合训练,在32*A100 GPU上进行全量参数训练。


尽管与重头训练相比,上述工作已经节约了非常多训练资源,但仍然需要消耗几十张甚至上百张显卡,对于小公司或者普通玩家仍然遥不可及。为了进一步降低增量预训练的资源消耗,我们探索了一种基于QLoRA的增量预训练方案,并且验证了该方法的有效性。该方法可进一步推广至原生中文模型的增量预训练,例如BaichuanInternLM、Qwen等。


通过Llama2模型进行中文词表扩充增量预训练指令微调我们训练并开源了Firefly中文Llama2模型。在增量预训练与指令微调阶段,我们均采用QLoRA技术,最多仅使用了4*V100的GPU,极大地降低了训练门槛。在🤗Open LLM Leaderboard、CMMLU和人工评测中,我们的模型与当前主流的中文Llama模型相比,具有不错的竞争力。


本项目的主要工作如下:

  • 📗 对Llama2进行中文词表扩充,提高编解码效率。与原始Llama2相对,中文序列长度减少约54.11%,模型在中文域的最大文本输入长度提升至原来的两倍以上。

  • 📗 使用大规模中英文语料进行增量预训练,然后进行多轮指令微调。开源7B和13B的Base和Chat的模型权重。

  • 📗 收集、整理并开源训练数据,包括22GB中英文预训练语料,以及多轮指令数据。

  • 📗 开源增量预训练、指令微调等全流程代码。支持在主流的开源模型上进行增量预训练和指令微调,如Baichuan2、Baichuan、Llama2、Qwen、Llama、InternLMFalcon等。

  • 📗 对模型进行榜单评测和人工评测。构建人工评测集,包含13种评测任务,对模型进行人工评测。验证了我们的训练方案的有效性。


02

模型 & 数据

我们开源了7B和13B的Base与Chat模型。Base模型是基于Llama2扩充中文词表后增量预训练得到的,Chat模型是在Base模型的基础上进行多轮指令微调得到的。


为了探究基座模型对指令微调的影响,我们也微调了Baichuan2-Base模型,得到Firefly-Baichuan2-13B,在CMMLU榜单上的表现远远优于我们评测的所有中文Llama2模型。

模型
类型
训练任务
训练长度
Firefly-Llama2-7B-Base
基座模型
CLM
1024
Firefly-Llama2-13B-Base 基座模型 CLM 1024
Firefly-Llama2-7B-Chat 指令模型 多轮指令微调
1024
Firefly-Llama2-13B-Chat 指令模型 多轮指令微调 1024
Firefly-Baichuan2-13B 指令模型 多轮指令微调 1024


本项目使用的数据如下表,其中firefly-pretrain-dataset是我们增量预训练阶段所使用的数据。

数据集 描述
firefly-pretrain-dataset Firefly项目整理和使用的22GB预训练数据,主要包含CLUE、ThucNews、CNews、COIG、维基百科等开源数据集,以及我们收集的古诗词、散文、文言文等。
moss-003-sft-data 由复旦大学MOSS团队开源的中英文多轮对话数据,包含100万+数据
ultrachat 由清华大学开源的英文多轮对话数据,包含140万+数据
school_math_0.25M 由BELLE项目组开源的数学运算指令数据,包含25万条数据。

03

实验详情

在增量预训练与指令微调阶段,我们均采用QLoRA技术,该技术可以大大节省训练资源,并且能够取得优秀的训练效果。


我们的训练流程主要如下:

  1. 对Llama2进行中文词表扩充,词表由32000扩展至55296,提高模型在中文的编解码效率。我们沿用了Chinese-LLaMA2-Alpaca-2的词表。

  2. 使用22GB中英文语料,对扩充词表后的模型进行增量预训练,采用自回归任务。

  3. 使用两百多万条中英文多轮对话指令数据,对增量预训练模型进行指令微调。


对Llama2的词表进行中文扩充后,极大地提高了模型对中文的编解码效率。我们在CNews数据集上对新的tokenizer进行了测试,token数量由2.98亿减少为1.37亿, token数量减少约54.11%。对于中文任务,不仅极大地提高了模型的训练和推理效率,并且使模型的最大输入文本长度提升至原来的两倍以上。


我们将增量预训练数据集命名为firefly-pretrain-dataset,主要包含ThucNews、CLUE、CNews、COIG、维基百科等开源数据集,以及我们收集的古诗词、散文、文言文等。数据分布如下图所示。


指令微调的数据主要包括UltraChat、Moss、school math等数据,对这些数据进行清洗、过滤、采样、合并等操作,最终获得两百多万条数据,原始数据详见Firefly项目。


在整个训练流程中,我们最多仅使用了4*V100 GPU,两个阶段的训练长度均为1024,LoRA rank=64, LoRA alpha=16。在预训练与指令微调阶段,word embedding与lm_head的权重均参与训练。7B与13B模型,最终参与训练的参数量分别约为612.9M和816.6M。指令微调阶段使用Firefly项目的训练代码。


指令微调阶段的训练loss曲线如下图所示,训练loss具有良好的收敛性,13B模型的收敛速度显著优于7B模型。7B和13B模型分别对应粉色和橙色曲线。


04

模型评测

我们分别在🤗Open LLM Leaderboard和CMMLU上对模型的英文和中文能力进行了客观评测,并且在我们构建的人工评测集上进行了人工评测。


🤗Open LLM Leaderboard

在Open LLM Leaderboard上,我们的模型与Vicuna、Guanaco、Llama2等英文模型的表现非常接近,并且比OpenBuddy-v11.1、Yayi、Ziya、Linly等中文Llama模型略胜一筹。这表明我们的方法可以保留Llama2优秀的英文能力。


CMMLU

我们采用OpenCompass工具评测CMMLU,其中*表示评测结果来源于OpenCompass官方榜单或者由模型作者自测的分数。


在CMMLU榜单上,我们的模型的表现优FalgAlpha、Yayi、Linly等中文Llama模型,与Ziya、Chinese-Alpaca-Plus等模型非常接近,与官方的Llama2相比也有所提升。这表明我们的训练方案的有效性。


为了探索基座模型的影响,我们也使用QLoRA技术对Baichaun2-13B-Base进行指令微调,其在CMMLU上的表现大幅领先我们评测的所有中文Llama模型,优于ChatGPT、baichuan-13b-chat等模型,且仅比baichuan2-13b-chat略低1.57分。该对比实验不仅说明了QLoRA训练方案的有效性,也进一步证明了基座模型对下游任务的重要性,优秀的基座模型可以让微调事半功倍。


同为中文Llama2模型,在CMMLU上,Firefly-Llama2-13B-Chat与Chinese-Alpaca-2-13b仍有一定的差距,我们将其归因为增量预训练不够充分。Chinese-Alpaca-2-13B在预训练阶段使用了约120GB数据,而我们收集了约22GB的预训练数据,但并未完全使用,仅消耗了大约2B左右的token。


人工评测

我们构建了人工评测集,其中包含13种评测任务。大部分数据从Belle数据中进行采样和优化。每种任务包含10条数据,一共130条数据。13种任务包含:头脑风暴、分类、Close QA、代码生成、 信息抽取、开放式生成、有害性检验、数学题、阅读理解、Open QA、Rewrite、Summarization、翻译。


评测标准如下:

  • 对于同一道题目,对两两模型的生成结果进行比较,存在胜负平三种关系。

  • 对于客观题,如果两个模型均回答正确,或均回答错误,则为平局。

  • 对于主观题,回答更加详细、真实、细节更丰富,则为获胜。当两者内容正确,并且详细程度非常接近时,或者各有千秋时,可视为平局。

  • 在与Llama2官方模型比较时,对于中文题目,如果目标回复为中文,但模型却回复英文,则判为错误。


人工评测结果如下表所示,从评测结果来看,与Linly和Llama2相比,我们的模型存在较大的优势:


获胜

平局

失败

ours VS linly

43(33.08%)

79(60.77%)

8(6.15%)

ours VS llama2

86(66.15%)

40(30.77%)

4(3.08%)


与Llama2-13B-Chat相比,我们的模型具备更强的中文指令遵从能力。


与Linly相比,我们的模型也存在优势。


人工评测的全部结果详见下述共享文档:

https://docs.qq.com/sheet/DU1h1bE1xWG50ZVlI?tab=BB08J2


05

结语

我们探索了一种基于QLoRA的轻量级增量预训练和指令微调方案,并且在公开榜单和人工评测中验证了该方案的有效性。


虽然我们收集了22GB的增量预训练数据,但与动辄上百GB或者上千亿token的其他中文Llama项目相比,仍是相形见绌。并且由于训练资源的问题,在增量预训练阶段,我们并未完全使用这些数据,大约仅消耗了2B token。


在模型词表扩充的情况下,这会导致新增的词向量训练不够充分,但最终的评测结果仍足以表明我们的方法是有效的。如果直接在中文Base模型上使用该方案进行垂直域增量预训练,不改变模型词表,模型将会在垂直域具有更优秀的效果。


🔥欢迎关注我们的项目,欢迎大家的宝贵建议和意见。


增量预训练:

https://github.com/yangjianxin1/Firefly-LLaMA2-Chinese


多轮指令微调:

https://github.com/yangjianxin1/Firefly




本文转载自社区供稿内容,不代表官方立场。

了解更多,请关注微信公众号"YeungNLP":



如果你有好的文章希望通过我们的平台
分享给更多人,请通过这个链接与我们联系: 

https://hf.link/tougao

本文分享自微信公众号 - Hugging Face(gh_504339124f0f)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部