五、低成本微调加速:Alpaca-LoRA:Alpaca-Lora with Lora (Low-rank Adaptation)
Alpaca-Lora (羊驼-Lora),可以认为是 ChatGPT 轻量级的开源版本,它使用 Lora (Low-rank Adaptation) 技术在 Meta 的 LLaMA 7B 模型上微调,只需要训练很小一部分参数就可以获得媲美 Standford Alpaca 模型的效果;
为了便宜高效地微调,我们使用Hugging Face的PEFT以及Tim Dettmers的bitsandbytes。
地址:https://github.com/tloen/alpaca-lora
权重地址:https://huggingface.co/decapoda-research/llama-7b-hf
在LoRA方法提出之前,也有很多方法尝试解决大模型微调困境的方法。其中有两个主要的方向:(1) 添加adapter层;(2) 由于某种形式的输入层激活。但是这两种方法都有局限性:
其中:adapter就是固定原有的参数,并添加一些额外参数用于微调。上图中会在原始的transformer block中添加2个adapter,一个在多头注意力后面,另一个这是FFN后面,显然,adapter会在模型中添加额外的层,这些层会导致大模型在推理时需要更多的GPU通信,而且也会约束模型并行。这些问题都将导致模型推理变慢。
prefix-tuning方法是受语言模型in-context learning能力的启发,只要有合适的上下文则语言模型可以很好的解决自然语言任务。但是,针对特定的任务找到离散token的前缀需要花费很长时间,prefix-tuning提出使用连续的virtual token embedding来替换离散token。具体来说,对于transformer中的每一层,都在句子表征前面插入可训练的virtual token embedding。对于自回归模型(GPT系列),在句子前添加连续前缀,即z = [PREFIX;x;y]。对于Encoder-Decoder模型(T5),则在Ecoder和Decoder前都添加连续前缀 z = [PREFIX;x|PREFIX';y]。
!pip install bitsandbytes !pip install -q datasets loralib sentencepiece !pip install -q git+https://github.com/zphang/transformers@c3dc391 !pip install -q git+https://github.com/huggingface/peft.git
使用方式:
from peft import PeftModel from transformers import LLaMATokenizer, LLaMAForCausalLM, GenerationConfig tokenizer = LLaMATokenizer.from_pretrained("decapoda-research/llama-7b-hf") model = LLaMAForCausalLM.from_pretrained( "decapoda-research/llama-7b-hf", load_in_8bit=True, device_map="auto", ) model = PeftModel.from_pretrained(model, "tloen/alpaca-lora-7b")
六、中文低成本微调加速-Chinese-Vicuna: A Chinese Instruction-following LLaMA-based Model & Chinese-alpaca-lora
Chinese-Vicuna: A Chinese Instruction-following LLaMA-based Model —— 一个中文低资源的llama+lora方案,该项目旨在构建和共享一个遵循指令的中文LLaMA模型,该模型可以在单个Nvidia RTX-2080TI上运行,这就是为什么我们将这个项目命名为Vicuna,虽然小但足够强大!
地址:https://github.com/Facico/Chinese-Vicuna
1、模型介绍
选择BELLE和Guanaco数据的组合作为我们的主要训练数据集,后续还将添加更多的聊天数据集(例如LCCC【https://github.com/thu-coai/CDial-GPT】)支持随意对话。
什么是LORA?简单地说,这是一个用于帮助将大型模型适应您的数据集的插件,即对大型语言模型的低资源适配,用于训练加速,适合贫民玩法。它的优点是,当涉及到获得大约30M的小型模型时,微调非常快,关键是它支持即插即用。
在大语言模型上,使用LLAMA 7B(当然,如果您有一台更大的机器(如3090Ti)可以替换为13B,LLAMA13B在数量上优于175B GPT3)。此代码基于alpaca-lora(https://github.com/tloen/alpaca-lora)开发,基本想法是使用PEFT的Lora接口+变压器的训练器+指令数据配置。
2、数据开放
数据上采用https://github.com/LianjiaTech/BELLE以及https://huggingface.co/datasets/JosephusCheung/GuanacoDataset的数据集。
对这两份数据进行合并后,形成最终数据:
地址: https://pan.baidu.com/s/1WSxuhSAotl14ifaAiz5eKw?pwd=b4kb password: b4kb
地址: https://drive.google.com/file/d/1tzXVhS74m-EtoFot7hEc005LDeZGPit_/view?usp=sharing
同样的项目还包括:https://github.com/LC1332/Chinese-alpaca-lora,这个模型是在Meta开源的LLaMA基础上,参考Alpaca和Alpaca-LoRA两个项目,对中文进行了训练。
七、中文低成本微调加速-Chinese-LLaMA-Alpaca
为了促进大模型在中文NLP社区的开放研究,本项目开源了中文LLaMA模型和经过指令精调的Alpaca大模型。这些模型在原版LLaMA的基础上扩充了中文词表并使用了中文数据进行二次预训练,进一步提升了中文基础语义理解能力。同时,在中文LLaMA的基础上,本项目使用了中文指令数据进行指令精调,显著提升了模型对指令的理解和执行能力。
本项目主开源了经过中文文本数据预训练的中文LLaMA大模型;开源了进一步经过指令精调的中文Alpaca大模型;快速地使用笔记本电脑(个人PC)本地部署和体验量化版大模型
地址:https://github.com/ymcui/Chinese-LLaMA-Alpaca
1、训练细节
整个训练流程包括词表扩充、预训练和指令精调三部分,其中训练代码参考了🤗transformers中的run_clm.py和Stanford Alpaca项目中数据集处理的相关部分。
1)词表扩充
由于原版LLaMA对中文的支持非常有限(对其他非英语语种也是如此),直接在原版LLaMA上用中文预训练并不可行,本项目在原版LLaMA的基础上进一步扩充了中文词表。
原版LLaMA模型的词表大小是32K,其主要针对英语进行训练(具体详见LLaMA论文),对多语种支持不是特别理想(可以对比一下多语言经典模型XLM-R的词表大小为250K)。通过初步统计发现,LLaMA词表中仅包含很少的中文字符,所以在切词时会把中文切地更碎,需要多个byte token才能拼成一个完整的汉字,进而导致信息密度降低。比如,在扩展词表后的模型中,单个汉字倾向于被切成1个token,而在原版LLaMA中可能就需要2-3个才能组合成一个汉字,显著降低编解码的效率。
因此,需要要扩充词表,具体的,在通用中文语料上训练了基于sentencepiece(https://github.com/google/sentencepiece)的20K中文词表并与原版LLaMA模型的32K词表进行合并,排除重复的token后,得到的最终中文LLaMA词表大小为49953。需要注意的是,在fine-tune阶段Alpaca比LLaMA多一个pad token,所以中文Alpaca的词表大小为49954。
2)预训练
在预训练阶段,使用通用中文语料(与中文BERT-wwm、MacBERT、LERT、PERT中使用的语料一致,最主要选用https://dumps.wikimedia.org/zhwiki/latest/中的维基百科)在原版LLaMA权重的基础上进一步进行预训练,数据集共包括13.6M行文本。
该过程又分为两个阶段:首先,固定模型transformer部分的参数,仅训练embedding,在尽量不干扰原模型的情况下适配新增的中文词向量。其次,使用LoRA技术,为模型添加LoRA权重(adapter),训练embedding的同时也更新LoRA参数。
3)指令精调
指令精调阶段的任务形式基本与Stanford Alpaca相同。训练方案同样采用了LoRA进行高效精调,并进一步增加了可训练参数数量。
在prompt设计上,精调以及预测时采用的都是原版Stanford Alpaca不带input的模版。对于包含input字段的数据,采用f"{instruction}+\n+{input}"的形式进行拼接。
2、开放数据
指令精调阶段使用了约200万条数据,其基本构成如下:
1)中英翻译数据500k
地址:https://github.com/brightmart/nlp_chinese_corpus#5翻译语料translation2019zh,
在原数据集的基础上进行了采样+规则筛选。
{ "english": "In Italy, there is no real public pressure for a new, fairer tax system.", "chinese": "在意大利,公众不会真的向政府施压,要求实行新的、更公平的税收制度。" }
2)pCLUE数据 300K
地址:https://github.com/CLUEbenchmark/pCLUE
在原数据集的基础上进行了采样+规则筛选
{ "input": "哪个类别最好的描述了这篇新闻?扣篮王拉文:精彩暴扣表演!炸\n选项:故事,文化,娱乐,体育,财经,房产,汽车,教育,科技,军事,旅游,国际,股票,农业,游戏\n答案:", "target": "电竞", "answer_choices": ["故事", "文化", "娱乐", "体育", "财经", "房产", "汽车", "教育", "科技", "军事", "旅游", "国际", "股票", "农业", "游戏"], "type": "classify"} { "input": "阅读以下文章,并选择一个合适的成语。文章:\n赵宝刚导演表示,当看到温家宝总理在灾区安慰失去亲人__的孩子时,他再也控制不住自己的感情,不禁潸然泪下。他非常关心灾区的孤儿,目前正计划为孩子们做一些更有意义的事情。当记者问到是否会考虑日后拍一部地震题材的影片时,赵宝刚导演则明确表示自己更愿意为灾区做一些实事,目前正在积极了解灾区儿童的需要,为下一步援助工作做准备。\n 候选成语:忧心忡忡,提心吊胆,后顾之忧,土豪劣绅,叫苦不迭,用武之地,无计可施,明眸皓齿,孤立无援,步步为营。答案是:", "target": "孤立无援", "answer_choices": ["忧心忡忡", "提心吊胆", "后顾之忧", "土豪劣绅", "叫苦不迭", "用武之地", "无计可施", "明眸皓齿", "孤立无援", "步步为营"], "type": "mrc"}
3)斯坦福Alpaca数据(英)50K
地址:https://github.com/tatsu-lab/stanford_alpaca
斯坦福原版Alpaca训练数据。
4)斯坦福Alpaca数据(中)50K
地址:https://github.com/ymcui/Chinese-LLaMA-Alpaca/tree/main/data
本项目使用ChatGPT接口对英文版本进行翻译(丢弃了一部分)
5)Self-instruction数据
这里采用了自动生成指令的方法,该思路与Stanford Alpaca中的做法基本一致,一次批量生成20组数据(可自行修改模板),以降低爬取成本,生成的文件包含通过gpt-3.5-turbo爬取的数据(你必须拥有OpenAI API key才可以使用),虽然指令模板中要求输出JSON格式,但系统并不总是会返回合法的JSON,需要自行根据返回数据的情况进行清洗,由于爬取时间比较长,建议后台运行该脚本。多线程运行时注意OpenAI API的调用限制上限。
import openai import json import sys import random openai.api_key = "" # you must provide your OpenAI API key before crawling def return_random_prompt(): system_prompt = "你需要尽可能给出多样化的任务指令和对应的回答。我们将用于人工评估ChatGPT模型对指令的完成情况。要求:\n" # generate random topics topic_list = ["科技", "娱乐", "体育", "金融", "时政", "教育", "医疗", "旅游", "美食", "汽车", "房产", "文化", "历史", "地理", "自然", "人文", "社会", "法律", "军事", "政治", "经济", "文学", "艺术", "宗教", "哲学", "语言", "数学", "物理", "化学", "生物", "地球科学", "天文学", "计算机科学", "工程", "建筑", "设计", "音乐", "舞蹈", "电影", "电视", "动漫", "游戏", "健康", "美容", "时尚", "家居", "家电", "家具", "家装", "母婴", "育儿", "职场", "工作", "生活", "养生", "心理", "情感", "人际", "社交", "交友", "恋爱", "婚姻", "家庭", "亲子", "宠物", "动物", "植物", "食品", "饮料", "餐饮", "酒店", "购物", "消费", "理财", "税务", "法规", "法院", "司法", "刑事", "民事", "行政", "战争"] system_prompt += "1. 主题多样化,涵盖各个领域,例如:" + "、".join(random.sample(topic_list, 10)) + "等。\n" # generate random tasks task_list = ["开放式生成", "分类", "问答", "编辑", "摘要", "写作", "翻译", "写代码", "分析", "代码解析", "常识推理", "写信", "抽取", "推荐"] system_prompt += "2. 表述多样化,结合真实问题;指令类型多样化,例如:" + "、".join(random.sample(task_list, 10)) + "等。\n" # other requirements system_prompt += "3. 如果遇到无法处理的指令(只靠文本无法回答),给出无法处理的回复。\n" system_prompt += "4. 除非特别要求,请使用中文,指令可以是命令句、疑问句、或其他合适的类型。\n" system_prompt += "5. 为指令生成一个适当且涉及真实情况的<input>,不应该只包含简单的占位符。<input>应提供实质性的内容,具有挑战性。字数不超过" + str(random.randint(80, 120)) + "字。\n" system_prompt += "6. <output>应该是对指令的适当且真实的回应,不能只回复答应或拒绝请求。如果需要额外信息才能回复时,请努力预测用户意图并尝试回复。<output>的内容应少于" + str(random.randint(128, 512)) + "字。\n\n" system_prompt += "请给出满足条件的20条JSON格式数据:\n" return system_prompt
总结
本文主要介绍其中的几个代表性项目,从数据、模两个角度对llama、Stanford Alpaca、BELLE、Chinese-LLaMA-Alpaca等进行介绍,供大家一起参考。
尤其针对中文市场,目前已经出现基于一些开源预训练大语言模型(如BLOOM、LAMMA、GLM等),使用由ChatGPT生产的数据(不包含任何其他数据),并加持LORA模型进行加速组成的研发范式。
从中我们可以看到,其中三块的内容都需要大量的投入,尤其是目前指令微调数据上,很依赖alpaca以及chatgpt的self-instruct数据,而这些数据并不干净,最近的分析表明,它非常以美国为中心(https://github.com/gururise/AlpacaDataCleaned)。
长路漫漫,更需摸清方向,感谢如上开源项目的无私奉献,在此致以诚挚的敬意。