地表最强7b模型?我的Gemma体验报告

昨天,也就是2024年2月22号,一早上起来就看到国内的AI公众号就热闹非凡,Google发布了他们的开源大语言模型Gemma,上Twitter也看到Jeff Dean卖力地再宣传自家的新产品:几条推文展现了好多令人兴奋的技术指标。 在上班前我先简单翻了翻技术报告,让我比较感兴趣的是256k的词表大小和6T的预训练语料。这俩改动加起来我估计应该性能确实会有一些提升。 最近Andrej Karpathy在YouTube上搞了个很火的讲Tokenizer的课程,应该也从侧面体现tokenizer和词表对现在的LLM性能之重要。我用Tokenizer Playground测试了一下LLama2和Gemma对同样文本的tokenize结果,可以发现Gemma的token数少了大概10%。当然,我测试的文本非常基础,全是ASCII字符,差距应该不那么明显,到了代码或数学场景(Gemma是做了digit分词的,数学应该强),差距应该就会显现出来。 LLama tokenizer 的结果 Gemma tokenizer结果 我最近喜欢在面试的时候问别人vocab大小对于LLM性能的影响,从序列长度讲当然是词表越大越好,因为token序列会短,不仅生成时的步数会少,每一步O(N^2)的self attention也会有不少的提速。但output layer和embedding table都会变大,所以最终的速度变化不太好说。 这个Gemma模型说是2B和7B,但其实参数量是偏大许多的,7B版本的参数加起来已经8B多了,谷歌这次为了“挽尊”特意把表格分成了embedding parameter和non-embedding parameter,确实略显诡异。 Gemma的参数量 结构的设计也比较奇怪,intermediate hidden size特别的大,和”同参数量“llama比起来层数有所降低。我特意整理了下表,大家可以更清楚地看出两者的变化。我这个表是从huggingface权重repo的config.json来的,feedforward dim竟然和tech report不一样。这次Gemma还在每一层放了两个normalization,激活函数也和llama不一样,用了GELU。 Gemma-7b Llama2-7b vocab size 256000 32000 hidden size 3072 4096 embedding params 786M 131M layers 28 32 attention heads 16 32 head dim 256 128 intermediate size 24576 11008 activation func GELU SwiGLU 技术报告里列了一大堆让人眼前一亮的指标,基本意思就是7b可以干llama-13b。但现在我感觉这些指标和实际好不好用关系并不是那么大,看看就好。当然此时的我预期Gemma7b应该还是要好过llama2 7b的。 Gemma的指标很亮眼 到了办公室赶紧就开始在我们的数据上finetune了一下。选的7b版本,huggingface已经贴心地把它整合进各种库里,transformers升级到4.38以上就行。我先试了下llama2-13b一样的超参,发现eval loss差了不少,而且新版transformers会计算grad norm,这个值在训练初期有很大的波动,一度达到上百的量级,感觉训练不是特别成功。后面我又换用了一组比较小的学习率,比之前有所提升,但eval loss还是和llama13b有差距。 我的几组实验,bf是全参微调,bl是lora 不过不同模型特别是词表量级相差如此巨大的模型间eval loss不太好比较(直观感觉是词表大的loss水平应该要高一些),只好用一些业务指标来比。我用一些测例推理了一下模型,发现学习或者推理过程应该是出了些问题。虽然eval loss在合理范围,但生成的文本基本不可用。 而且,Gemma7b的训练显存消耗比llama2-13b还大,同样的deepspeed配置我只能跑原来一半大小的batch。Gemma虽说参数约为8b,但肯定比13b小不少,出现这种情况我也比较费解,欢迎大佬点拨。 歌手大佬也发现了一些开源版的实现问题 总体感觉目前的Gemma版本有一些问题,看看过几天社区会不会发现并修复它。也希望真的能有个能超过llama2-13b的7b模型可以用。当然,我最希望的还是llama3赶紧出来吧😂

February 23, 2024 · 1 min · Yuanhao

今天被OpenAI爆了

今天第一次体验到来自大语言模型的压力。 最近在做一个语义匹配的小任务,选择的方案是用2021年的SOTA模型SimCSE在我们的领域数据上先进一步预训练,然后再用任务数据finetune降维。前几天的时候还自我感觉良好,因为比之前的模型效果好,还修复了老语言模型的一些明显badcase。 但是今天,我们用openai的embedding模型也试了一下,recall指标直接翻了一倍。当时看到结果我都惊呆了。这个模型一千个token只要0.0004美元,相当的便宜,而且开箱即用。 之前我看到网上帖子说NLP工程师失业啥的还觉得有点夸张,现在感觉还真有可能。 首先这个事情是有正反馈的,作为一款公开的产品,而且这么便宜,你不用别人也会用,你如果没法超过他(现在看起来确实不容易),那就只能也用,不然产品竞争力就会出问题。 一旦大规模用,那很多NLP问题的处理范式真的会改变,以前大家在不同场景finetune类似bert这样的小模型,但现在可能会变成在OpenAI embedding基础上finetune最上面的输出层,例如分类层。一个底座可以支撑好几个上层需求。这样的话需要的人力大大减少,公司的inference负担也大大降低。虽然在OpenAI那花了些钱,但算下来大概率是比原来划算的。 当然这样的方案也有一些问题,例如公司的数据就都让OpenAI知道了,并且OpenAI目前不太稳定,稳定性上有点不可控。 那作为公司,感觉除了之前大家都看到的在NLG上投入大模型这条独木桥,未来在NLU上投入大模型的应该会有很多。自己跑个10B量级的模型作为底座,做到OpenAI的8、9成应该是个比较好的选择。朋友们,赶紧学起来啊,不然真要成为纺织女工了。

March 28, 2023 · 1 min · Yuanhao

[大模型补课]模型及训练方法

前情提要: [大模型补课]当代AI的基石数据集 [大模型补课]当代语言模型的评价体系 这是大模型补课的第三篇文章,主要关注模型及其训练方法。做算法的人往往最喜欢看模型相关的东西,这期包含的内容也确实很有趣,不需要技术背景也能看懂。 Encoder vs Decoder 在模型层面,我认为大模型时代最重要的一个变化就是从前几年的Encoder为主变成了Decoder Only占据绝对的主流。相对应的,自然语言生成问题取代了自然语言理解问题成为了主流,并且是在用生成这种范式统一了理解问题。 transformer编码器和transformer解码器的主要区别在于它们如何处理输入和输出序列。 {: .align-center style=“width:80%”} 最开始的时候Transformer的Encoder和Decoder是成对出现的 {: .align-caption style=“text-align:center;font-size:smaller”} Transformer编码器处理输入序列(例如句子),并将其转换为一组隐藏表示,以捕获序列的含义。编码器由一堆相同的层组成,每个层对输入序列应用自注意力机制和前馈神经网络。 另一方面,Transformer解码器基于编码器产生的隐藏表示生成输出序列。它也由类似的层堆叠组成,但每个层还关注编码器产生的隐藏表示,以包含输入序列的信息。解码器还使用自注意力机制以自回归方式生成输出序列,这意味着它逐个标记地生成,条件是它已经生成的标记。 总之,虽然transformer架构中的编码器和解码器都使用自注意力机制和前馈神经网络,但编码器处理输入序列,解码器通过关注编码器产生的隐藏表示来生成输出序列。 当下火爆的大语言模型几乎都使用的是decoder only的结构。在知乎有一个问题为什么现在的LLM都是Decoder only的架构?,非常推荐大家阅读。GPT4发布之后,其处理context的能力从3.5的4k一下跃升到32k,不知道openai是不是又加入了encoder。 涌现、Scaling Law和科学炼丹 模型的规模增大无疑是最近AI进步的重要推动力。目前像GPT3.5这样的语言模型包含了1750亿个参数,相比于人脑中的神经连接其实还小了差不多一个数量级。模型的大小和其能力的关系实际是一个非常有指导意义的值得研究的问题。 涌现(emergent abilities)是在2022年中的论文Emergent Abilities of Large Language Models 提出的概念,是指在大模型中出现的而在小模型里没有出现的能力,用咱们熟悉的话说就是"量变引起质变",而且这种现象是不可预测的。这种不可预测性给模型的开发带来了很大的麻烦,因为训练一个100B以上的模型成本是非常高昂的。这篇论文里列举了好几个任务里涌现的案例。 Emergence is when quantitative changes in a system result in qualitative changes in behavior. –Nobel prize-winning physicist Philip Anderson {: .align-center style=“width:80%”} Few-shot任务里体现出来的涌现现象 {: .align-caption style=“text-align:center;font-size:smaller”} 实际上,早在几年前人们就训练过巨大的模型,但那时候并没有出现现在这么强的模型。例如可能是世界上最喜欢大模型的公司Nvidia,在2022年训练过一个530B的超大模型MT-NLG,但可能知道这个模型的人都很少。Deepmind的论文Training Compute-Optimal Large Language Models讨论了这个问题,并给出了结论:之前的模型都训练不充分,把数据量提上去小模型也会有大能力。还给出了一套算力消耗一定的情况下合理分配模型规模和训练数据多少的方法论。 {: .align-center style=“width:80%”} 典型的大模型参数量及训练数据量,Chinchilla参数少得多但性能更强 {: ....

March 25, 2023 · 2 min · Yuanhao

[大模型补课]模型训练关键工具包

前情提要: [大模型补课]当代AI的基石数据集 [大模型补课]当代语言模型的评价体系 [大模型补课]模型及训练方法 这是大模型补课的第四篇文章,主要关注模型背后的训练工具。 并行:大模型训练的必要手段 如果你使用过多张GPU训练模型,那应该对并行不陌生。最基本并行方式有以下两种 DataParallel数据并行(DP)。这也是最常用并行方法,在pytorch里有DP和DDP两种原生方式,使用起来都很方便。这种并行方式最好理解,模型在每个worker上都有完整的一份,只是给他们喂的数据不同。在每个worker算完后,需要一个同步过程,来综合大家的梯度信息,再更新模型。数据并行主要解决训练速度的问题,可以在单位时间内学习更多的样本。 ModelParallel模型并行(MP)。模型并行指的是把模型分拆到多个GPU上,主要解决模型太大而无法放到一个GPU上的问题。以目前爆火的大规模语言模型为例,一个175B的GPT模型,整个载入的话需要 $$175*10^9$$ 个参数,每个参数用4个字节,则需要700G的存储空间,目前没有听说过哪个GPU可以放得下,只能把一个模型放到好几张卡上。模型的拆法也有多种,可以把不同层放不同卡,这种称为垂直拆分;也可以在同一层也拆开,这种被称为水平拆分。 以下再介绍几个模型并行的细分方法。 TensorParallel张量并行(TP)。每个张量被分成多个块,因此不是整个张量驻留在单个 GPU 上,而是每个张量片段驻留在其指定的 GPU 上。在处理期间,每个片段在不同的 GPU 上分别并行处理,结果在步骤结束时进行同步。这就是所谓的水平并行,因为拆分发生在水平层面上。 PipelineParallel流水线并行(PP)。模型在多个 GPU 上垂直(层级)拆分,因此仅将模型的一个或几个层放置在单个 GPU 上。每个 GPU 并行处理管道的不同阶段,并处理一小批数据。流水线并行的主要问题是因为前后依赖而带来的GPU等待(下图中的Bubble区域),这个问题通常用更小批量的数据来缓解。 现代化的并行训练方法以上几种并行方法的有机组合,也就是传说中的三维并行(DP+TP+PP)。 有关并行的介绍,推荐阅读Huggingface的这篇文档。 Megatron-LM 提到模型并行,不得不提的软件包是英伟达的Megatron-LM。但实际在这个开源大模型日新月异的今天,需要使用这个库的人也是很少的。这里根据论文介绍一下他的原理,还是挺有趣的。 目前的语言模型领域,Transformers结构已经是绝对的主流,在这种结构里,主要有两种building block,一个是多层感知机MLP,另一个是自注意机制。 全连接层可以理解为矩阵乘法 $$Y=XA$$ ,其中 $$A$$ 是参数。第一种并行法是把这个参数按行来分割,而把输入按列分割,假设分成两个小矩阵 $$X=[X_1, X_2],A=[\begin{matrix}A_1\A_2\end{matrix}]$$ 这样 $$Y=X_1A_1+X_2A_2$$ ,如果全连接后面跟一个非线性激活函数,例如GeLU,那么会遇到下面的问题 $$GeLU(XA)\ne GeLU(X_1A_1+X_2A_2)$$ 所以只能把A按照列分为 $$[A_1, A_2]$$ ,这样可以得到 $$Gelu([Y_1,Y_2])=[GeLU(XA_1), GeLU(XA_2)]$$ 整个过程可以用下图表示 自注意力机制的并行方法是MLP的扩展,具体的说就是把多个注意力头分到不同的GPU去执行。 上面只是一些模型并行(准确的说是张量并行)的基本思路。并行的时候除了考虑减少单个显卡显存的使用,还要权衡额外产生的通信负担,是个很有意思的领域。我也了解不多,感兴趣的读者可以自己再读一些资料。 在Megatron论文里,他们合并使用了数据并行和张量并行,从而实现快速训练大模型的目标。 We efficiently trained transformer based models up to 8.3 bil- lion parameter on 512 NVIDIA V100 GPUs with 8-way model parallelism and achieved up to 15....

March 25, 2023 · 2 min · Yuanhao

大规模语言模型的评价方法

上一篇文章介绍了大模型是用什么数据训练的,这一篇文章重点来看大模型的评价方法。Chatgpt这轮出圈很大原因是对话这种评价方式非常直观,普通大众就可以从对话质量看出来现在的模型比之前的"人工智障"要强很多。但真正开发大模型肯定不能用这种方式,不仅效率低、价格高,还存在不小的主观因素。这篇文章就来总结一下大模型的评价方式。 还是先来看LLaMA论文里使用的评价指标。LLaMA里一共使用了**20种数据集(或任务)**来评估和对比模型。这些任务可以分为两大设定:零样本任务和少样本任务,涵盖以下几个大类 常识推断 闭卷问答 阅读理解 数学推理 代码生成 大规模多任务语言理解 下面一一来看。 常识推断 这个任务用了8个数据集,分别是BoolQ、PIQA、SIQA、HellaSwag、WinoGrande、ARC easy, ARC challenge和OpenBookQA。不同数据集有不同的形式,包括填空、威诺格拉德模式挑战(英语:Winograd Schema Challenge,缩写WSC)、多选问答。这些数据集在评价中都属于零样本,就是让模型通过预训练来直接回答问题。 一个威诺格拉德模式的例子为:“ 市议会拒绝给示威者颁发许可,因为他们[担心/宣扬]暴力。 ” 当这句陈述中使用“担心”一词时,前面的“他们”指的是市议会。而当使用“宣扬”一词时,“他们”所指的则变成了示威者。人类通过常识可以很简单地看出两种情况下“他们”所指分别为何,但对于机器而言这个问题则十分困难。 {: .align-center style=“width:80%”} 不同模型常识推断结果比较。​这种常识问题现在的模型基本都能对个​六成以上。 {: .align-caption style=“text-align:center;font-size:smaller”} 闭卷问答 这个任务包括两个数据集Natural Questions和TriviaQA。所谓闭卷,是相对于数据集原来的设定来说的。已Natural Questions为例,原来的设定是模型可以访问相关维基百科文本,然后根据百科内容回答问题。然而在评价大语言模型的时候,就不给看这个维基页面了。闭卷问答包括zero shot和few shot两种设定。zero shot很好理解,跟上面的常识推断很像,下面是论文附录里few shot的例子,实际上就是列几个问答对作为context。我目前还不太懂这种无关问答对对模型回答问题有什么帮助。 Context → Answer these questions: Q: Who sang who wants to be a millionaire in high society? A: Frank Sinatra Q: Who wrote the book the origin of species? A: Target -> Charles Darwin 阅读理解 阅读理解和前面提到的开卷问答有一点像。只是常见的阅读理解数据集用于支撑问题回答的背景材料比较短(相比于NQ里的维基页面)。在LLaMA论文里,使用的是RACE数据集,这个数据集对于做过阅读理解的朋友一定不陌生,是为初高中中文学生设计的英语阅读理解题。...

March 1, 2023 · 1 min · Yuanhao

如何使用ChatGPT算命

可能是网站slogan:AI算命,朋克养生的关系,最近我看google search console后台总是有很多"Chatgpt算命"这个查询导致的网站展现。 既然大家有这个需求,我就实践SEO里面的方法,上网搜索了一下如何使用chatgpt算命,总结在这个文章里。 好多chatgpt算命的查询 {: .align-caption style=“text-align:center;font-size:smaller”} 基本上,这要用到chatgpt的**“角色扮演”**功能,让它站在算命者的角度回答你的问题。 先从英文开始,英文里算命先生叫做fortune teller,那么我们可以这么问chatgpt Act like a coffee fortune teller, I can see a cat shape in the corner of the cup, what is its meaning? 翻译成中文就是: 像个算命先生一样回答我,我在杯子的角落看到了一个猫的形状,这意味着什么? 英文版的回答是 The cat shape in the corner of your cup is a sign of good luck and protection. It is a reminder to stay alert and to be aware of any potential danger or obstacles that may arise in your life....

February 28, 2023 · 1 min · Yuanhao

大规模语言模型的基石数据集

最近AI大火,作为一名稍微有点赶不上趟的NLP工程师,感觉有很多课需要补。恰好昨天Meta发了新的大模型论文,浏览了一下发现很适合作为补课的切入点。 今天这部分是关于预训练使用的数据集,是重中之重,说数据是当代AI的基石一点也不为过。GPT3用的数据其实没有公开,Meta这次论文里提到的应该算是开源模型里一个最全的版本。他们使用的数据如下表所示,我们一一来看一下。 Dataset Sampling prop. Epochs Disk size CommonCrawl 67.0% 1.10 3.3 TB C4 15.0% 1.06 783 GB Github 4.5% 0.64 328 GB Wikipedia 4.5% 2.45 83 GB Books 4.5% 2.23 85 GB ArXiv 2.5% 1.06 92 GB StackExchange 2.0% 1.03 78 GB CommonCrawl 占比最大的数据集,他们的网站是https://commoncrawl.org/。我感觉这真是一个伟大的项目,7年时间爬了超多的互联网网页,涵盖了40种语言。 CommonCrawl网站截图 {: .align-caption style=“text-align:center;font-size:smaller”} 根据他们博客的最新数据,2023年二月版的数据包含了400TB的数据(纯文本的数据是9个多tb),三十多亿个网页。 The crawl archive for January/February 2023 is now available! The data was crawled January 26 – February 9 and contains 3....

February 26, 2023 · 3 min · Yuanhao