谈谈ChatGPT的低成本“平替”实现路线(2)

简介: 谈谈ChatGPT的低成本“平替”实现路线

五、低成本微调加速: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)。

长路漫漫,更需摸清方向,感谢如上开源项目的无私奉献,在此致以诚挚的敬意。

参考文献

1、https://scontent-tpe1-1.xx.fbcdn.net/v/t39.8562-6/333078981_693988129081760_4712707815225756708_n.pdf

2、https://github.com/tatsu-lab/stanford_alpaca

3、https://github.com/ymcui/Chinese-LLaMA-Alpaca

相关文章
|
机器学习/深度学习 人工智能 自然语言处理
高中教师养出40亿美元超级独角兽,发布ChatGPT最大平替
高中教师养出40亿美元超级独角兽,发布ChatGPT最大平替
112 0
|
人工智能 语音技术 开发者
真·ChatGPT平替:无需显卡,MacBook、树莓派就能运行LLaMA
真·ChatGPT平替:无需显卡,MacBook、树莓派就能运行LLaMA
332 0
|
SQL 人工智能 算法
Meta开源的ChatGPT平替到底好不好用?测试结果、加料改装方法已出炉,2天5.2k星
Meta开源的ChatGPT平替到底好不好用?测试结果、加料改装方法已出炉,2天5.2k星
160 0
|
机器学习/深度学习 存储 自然语言处理
笔记本就能玩的ChatGPT平替,附完整版技术报告
笔记本就能玩的ChatGPT平替,附完整版技术报告
|
Web App开发 机器学习/深度学习 物联网
ChatGPT平替「小羊驼」Mac可跑!2行代码单GPU,UC伯克利再发70亿参数开源模型
ChatGPT平替「小羊驼」Mac可跑!2行代码单GPU,UC伯克利再发70亿参数开源模型
365 0
|
人工智能 JSON 自然语言处理
谈谈ChatGPT的低成本“平替”实现路线(1)
谈谈ChatGPT的低成本“平替”实现路线
535 0
|
2月前
|
人工智能 自然语言处理 搜索推荐
chatgpt这么火,现在AI搜索引擎有哪些呢?
国外AI搜索引擎包括ChatGPT,擅长自然语言处理与内容生成;Google Bard,提供智能个性化搜索体验;Microsoft Bing集成GPT模型增强智能检索;Perplexity AI以简洁答案及文献引用著称;Neeva强调隐私保护与无广告服务。国内方面,天工AI支持多种功能如知识问答与代码编程;腾讯元宝基于混元模型助力内容创造与学习;360AI搜索以精准全面的信息搜索见长;秘塔AI专注提升写作质量和效率;开搜AI搜索提供个性化智能搜索服务。以上引擎均利用先进AI技术提升用户体验。更多详情参阅[AI搜索合集](zhangfeidezhu.com/?page_id=651)。
103 8
chatgpt这么火,现在AI搜索引擎有哪些呢?
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
HuggingGPT解析:使用 ChatGPT及HuggingFace上的族系解决AI问题
HuggingGPT是一个框架,它使用大型语言模型(如ChatGPT)作为控制器来管理和协调Hugging Face上的AI模型,以语言作为通用接口解决多模态和领域的复杂AI任务。
50 0
HuggingGPT解析:使用 ChatGPT及HuggingFace上的族系解决AI问题
|
2月前
|
机器学习/深度学习 人工智能 算法
为什么ChatGPT等AI大模型都是基于Python开发?
为什么ChatGPT等AI大模型都是基于Python开发?
|
2月前
|
人工智能 自然语言处理 Linux
免费ChatGPT4o灵办AI可体验浏览器插件
灵办AI就是您所需的最佳助手!我们为您带来了一款多功能AI工具,ChatGPT4o不仅能为您提供精准翻译,还能满足您的对话需求、智能续写、AI搜索、文档阅读、代码生成与修正等多种需求。灵办 AI,真正让工作和学习变得轻松高效!一款多功能智能助手,旨在提升工作和学习效率。它提供实时翻译、对话问答、搜索、写作和网页阅读等服务,支持多种浏览器和操作系统,帮助用户随时获取信息,打破语言障碍,优化内容创作和信息处理。
103 0