庆云古诗词

庆云古诗词

算力很重要一觉睡醒,ChatGPT竟然被淘汰了?程序员晚枫2023年4月15日0

互联资讯 0

2023年11月20日 每日一猜答案: 答案:ABC
每日一猜答案分析:

算力th,算力一天多少钱,算力 t,算力可以干什么
注:本标题是 AutoGPT 建议我修改的
OpenAI 的 Andrej Karpathy 都大力宣传,认为 AutoGPT 是 prompt 工程的下一个前沿。
近日,AI 界貌似出现了一种新的趋势:自主人工智能。
这不是空穴来风,最近一个名为 AutoGPT 的研究开始走进大众视野。特斯拉前 AI 总监、刚刚回归 OpenAI 的 Andrej Karpathy 也为其大力宣传,并在推特赞扬:「AutoGPT 是 prompt 工程的下一个前沿。」
不仅如此,还有人声称 ChatGPT 已经过时了,AutoGPT 才是这个领域的新成员。
项目一经上线,短短几天狂揽 27K 星,这也侧面验证了项目的火爆。
GitHub 地址:【【网址】】/torantulino/auto-gpt
问题来了,AutoGPT 到底是什么?它是一个实验性的开源应用程序,展示了 GPT-4 语言模型的功能。该程序由 GPT-4 驱动,可以自主实现用户设定的任何目标。
具体来说,AutoGPT 相当于给基于 GPT 的模型一个内存和一个身体。有了它,你可以把一项任务交给 AI 智能体,让它自主地提出一个计划,然后执行计划。此外其还具有互联网访问、长期和短期内存管理、用于文本生成的 GPT-4 实例以及使用 GPT-3.5 进行文件存储和生成摘要等功能。AutoGPT 用处很多,可用来分析市场并提出交易策略、提供客户服务、进行营销等其他需要持续更新的任务。
正如网友所说 AutoGPT 正在互联网上掀起一场风暴,它无处不在。很快,已经有网友上手实验了,该用户让 AutoGPT 建立一个网站,不到 3 分钟 AutoGPT 就成功了。期间 AutoGPT 使用了 React 和 Tailwind CSS,全凭自己,人类没有插手。看来程序员之后真就不再需要编码了。
之后该用户补充说,自己的目标很简单,就是用 React 创建一个网站。提出的要求是:创建一个表单,添加标题「【【微信】】」,然后将背景更改为蓝色。AutoGPT 成功的构建了网站。该用户还表示,如果给 AutoGPT 的 prompt 更多,表现会更好。
接下里我们再看一个例子。假装自己经营一家鞋公司,给 AutoGPT 下达的命令是对防水鞋进行市场调查,然后让其给出 top5 公司,并报告竞争对手的优缺点 :
首先,AutoGPT 直接去谷歌搜索,然后找防水鞋综合评估 top 5 的公司。一旦找到相关链接,AutoGPT 就会为自己提出一些问题,例如「每双鞋的优缺点是什么、每款排名前 5 的防水鞋的优缺点是什么、男士排名前 5 的防水鞋」等。
之后,AutoGPT 继续分析其他各类网站,并结合谷歌搜索,更新查询,直到对结果满意为止。期间,AutoGPT 能够判断哪些评论可能偏向于伪造,因此它必须验证评论者。
执行过程中,AutoGPT 甚至衍生出自己的子智能体来执行分析网站的任务,找出解决问题的方法,所有工作完全靠自己。
结果是,AutoGPT 给出了 top 5 防水鞋公司的一份非常详细的报告,报告包含各个公司的优缺点,此外还给出了一个简明扼要的结论。全程只用了 8 分钟,费用为 10 美分。期间也完全没有优化。
这个能够独立自主完成任务的 AutoGPT 是如何运行的呢?我们接着来看。
AutoGPT:30 分钟内构建你自己的 AI 助手
作为风靡互联网的 AI 智能体,AutoGPT 可以在 30 分钟内完成设置。你就可以拥有自己的 AI,协助完成任务,提升工作效率。
这一强大的 AI 工具能够自主执行各种任务,设置和启动的简便性是一大特征。在开始之前,你需要设置 Git、安装 Python、下载 Docker 桌面、获得一个 OpenAI API 密钥。
克隆存储库

第二部分 LLaMA的代码级解读:RMSNorm/SwiGLU/RoPE/Transformer


近期,除了研究ChatGPT背后的各种技术细节 不断看论文(至少100篇,100篇目录见此:ChatGPT相关技术必读论文100篇),还开始研究一系列开源模型(包括各自对应的模型架构、训练方法、训练数据、本地私有化部署、硬件配置要求、微调等细节)?

本文一开始是作为此文《ChatGPT技术原理解析:从RL之PPO算法、RLHF到GPT4、instructGPT》的第4部分,但随着研究深入 为避免该文篇幅又过长,将把『第4部分 开源项目』抽取出来 独立成本文,然后不断续写本文直至成了一个系列

毕竟我上半年的目标之一,便是把ChatGPT涉及的所有一切关键技术细节,以及相关的开源项目都研究的透透的,故过程中会不断产出一篇篇新文章出来,比如:

  1. 微积分和概率统计极简入门
  2. 一文通透优化算法
  3. 强化学习极简入门:通俗理解MDP、DP MC TC和Q学习、策略梯度、PPO
  4. ChatGPT技术原理解析(本系列核心主体,也是同类解读里最清晰、全面、细致的一篇)
  5. ChatGPT相关技术论文100篇
  6. ?类ChatGPT项目的部署与微调:从LLaMA到Alpaca、BELLE、ChatLLaMA和ColossalChat、从ChatGLM-6b到ChatDoctor
  7. CV多模态模型发展史(23年4月发布),详述GPT4背后多模态的能力起源与发展历史,包括但不限于DTER、DDPM、【【微信】】、CLIP、Swin Transformer、DALL・E 2、Stable Diffusion、BEiT-3、【【微信】】、GPT4等

?虽说GPT3在2020年就出来了,但OpenAI并未开源,所以直到一年半后以后才有国内外各个团队比如DeepMind等陆续复现出来,这些大厂的复现代码我们自然无法窥知一二,毕竟人家也未开源出来

再到后来基于GPT3的InstructGPT、基于GPT3.5ChatGPT初版(GPT3.5的参数规模也尚无准确定论)、GPT4均未开源,OpenAI不再open,好在Meta等公司或研究者开源出了一系列类ChatGPT项目,本部分针对其中部分做下简要推荐(根据发布顺序排序)

2.15,很多朋友在GitHub上发现了一个基于【【微信】】低成本实现类ChatGPT迷你版训练过程的开源项目(基于OPT + RLHF + PPO),虽是类似GPT3的开源项目OPT与RLHF的结合,但可以增进我们对ChatGPT的理解,该项目有几个不错的特点

  1. 很多同学一看到DL,便会想到大数据,而数据量一大,还用CPU处理的话很可能训练一个小任务都得半天,而如果用GPU跑,可能一两分钟就出来了。于此,在深度学习大火的那几年,特别是AlphaGo出来的16年起,我司七月在线便分别为VIP、AI系统大课、在职提升大课、求职/论文/申博/留学1V1辅导提供GPU云平台进行实战训练 但如果想训练那种千亿参数规模的开源模型,就不只是有GPU就完事了,比如1750亿参数规模这种得用64张AI 100(即便经过一系列内存开销上的优化,也得至少32张AI 100,单张AI 100售价10万以上,且现在还经常没货),这样的硬件要求是大部分个人是无法具备的,所以该开源项目提供了单GPU、独立4/8-GPUs 的版本
  2. 如下代码所示,启动简单
  3. 训练过程明确清晰,如下图(由于此文已经详细介绍过ChatGPT的训练步骤,故不再赘述)

    ?此外,据钟博士在我所维护的『Machine Learning读书会群』里所说,【【微信】】的并行效率确实不错,是新加坡的一个初创团队推出的,但目前尚没有团队采用【【微信】】框架来做主训练框架训练175b级别的超大模型,可以再了解下Meta家训练OPT用的Metaseq

通过《ChatGPT技术原理解析》一文,我们已经知道了ChatGPT的三阶段训练过程,其中,阶段三的本质其实就是通过PPO的方式去微调LM

GitHub上有个TRL(Transformer Reinforcement Learning,基于『Hugging Face开发的Transformer库』),便是通过PPO的方式去微调LM,需要的数据便是三元组「query, response, reward」,具体如下图所示

  1. Rollout:语言模型根据query生成response
  2. 评估:怎么评估模型针对特定query生成response的质量呢,我们可以使用a function、model、human feedback或它们的某种组合进行评估,然后为每个que【【微信】】对产生一个标量值,说白了 就是奖励模型有了,那就直接打分
  3. 优化:在优化步骤中,「que【【微信】】 pairs」用于计算序列中标记的对数概率,且比较下面这两个模型输出之间的 KL 散度用作额外的奖励信号? 经过训练的模型(即上图中的Acti【【微信】】)? 基线模型(即上图中的Reference model),通常是PPO微调之前的模型(比如这里的GPT2,或者instructGPT里的SFT) 最终,使得Acti【【微信】】生成的响应不会偏离基线模型Reference model太远

示例代码如下

一直致力于LLM模型研究的国外TOP 3大厂除了OpenAI、Google,便是Meta(原来的Facebook)

Meta曾第一个发布了基于LLM的聊天机器人――BlenderBot 3,但输出不够安全,很快下线;再后来,Meta发布一个专门为科学研究设计的模型Galactica,但用户期望过高,发布三天后又下线

23年2.24日,Meta通过论文《LLaMA: Open and Efficient Foundation Language Models》发布了自家的大型语言模型LLaMA(这是解读之一),有多个参数规模的版本(7B 13B 33B 65B)

LLaMA只使用公开的数据(总计1.4T即1,400GB的token,其中CommonCrawl的数据占比67%,C4数据占比15%,Github Wikipedia Books这三项数据均各自占比4.5%,ArXiv占比2.5%,【【微信】】占比2%),论文中提到

When training a 65B-parameter model, our code processes around 380 tokens/sec/GPU on 2048 A100 GPU with 80GB of RAM.

This means that training o【【微信】】g 1.4T tokens takes approximately 21 days

且试图证明小模型在足够多的的数据上训练后,也能达到甚至超过大模型的效果

  • 比如13B参数的版本在多项基准上测试的效果好于2020年的参数规模达175B的GPT-3
  • 而对于65B参数的LLaMA,则可与DeepMind的Chinchilla(70B参数)和谷歌的PaLM(540B参数)旗鼓相当
  • 且Meta还尝试使用了论文「Scaling Instruction-Finetuned Language Models」中介绍的指令微调方法,由此产生的模型LLaMA-I,在MMLU(Massi【【微信】】nderstanding,大型多任务语言理解)上要优于Google的指令微调模型Flan-PaLM-cont(62B)

此项目给出的环境依赖有4个:

  1. torch
  2. fairscale,fairscale是用来做GPU分布的,一般是当使用DDP仍然遇到超显存的问题时使用fairscale
  3. fire,fire是一个命令行工具,用或者不用他都可以
  4. sentencepiece,sentencepiece是用于tokenizer的工具包

为了提高训练的稳定性,对每个transformer子层的输入进行归一化,而不是对输出进行归一化,且使用由Zhang和Sennrich(2019)提出的RMSNorm(Root Mean S【【微信】】ion) RMS Norm是一般LayerNorm的一种变体,可以在梯度下降时令损失更加平滑 与【【微信】】相比,RMS Norm的主要区别在于去掉了减去均值的部分(re-centering),只保留方差部分(re-scaling)

为一目了然,我们看下它们各自的归一化的表达式

  • 一般的LN: 其中
  • RMS Norm: 其中

至于RMS Norm为什么有用,需要求梯度进行分析,感兴趣的同学可以阅读RMS Norm的论文

用Shazeer(2020)提出的SwiGLU替代ReLU,在维度上使用的维度是2/3*4d,而不是PaLM中的4d

LLaMA采用SwiGLU替换了原有的ReLU,具体是采用SwiGLU的FNN,在论文中以如下公式进行表述:

其中

对应论文见:Ramachandran et al., 2017 代码实现上:可以通过调用torch内置方法F.silu()实现,会在下文的FFN部分介绍

在位置编码上,删除了绝对位置嵌入,而在网络的每一层增加了苏剑林等人(2021)提出的旋转位置嵌入(RoPE),其思想是采用绝对位置编码的形式,实现相对位置编码

  • RoPE主要借助了复数的思想,为了引入复数,首先假设了在加入位置信息之前,原有的编码向量是二维行向量,其中是绝对位置,现在需要构造一个变换,将引入到中,即寻找变换:? 考虑到Attention的核心计算是内积: 所以,寻求的这个变换,应该具有特性:
  • 这里直接说结论,寻求的变换就是,也就是给乘以,相应地,乘以 做了这样一个变换之后,根据复数的特性,有: 也就是,如果把二维向量看做复数,那么它们的内积,等于一个复数乘以另一个复数的共轭,得到的结果再取实部,代入上面的变换,也就有: 这样一来,内积的结果就只依赖于,也就是相对位置了 换言之,经过这样一番操作,通过给Embedding添加绝对位置信息,可以使得两个token的编码,经过内积变换(self-attn)之后,得到结果是受它们位置的差值,即相对位置影响的
  • 于是对于任意的位置为的二维向量,把它看做复数,乘以,而根据欧拉公式,有: 于是上述的相乘变换也就变成了: 把上述式子写成矩阵形式: 而这个变换的几何意义,就是在二维坐标系下,对向量进行了旋转,因而这种位置编码方法,被称为旋转位置编码
  • 根据刚才的结论,结合内积的线性叠加性,可以将结论推广到高维的情形。可以理解为,每两个维度一组,进行了上述的“旋转”操作,然后再拼接在一起: 由于矩阵的稀疏性,会造成计算上的浪费,所以在计算时采用逐位相乘再相加的方式进行: 其中为矩阵逐位相乘操作

原理理解了,接下来可以代码实现旋转位置编码

引用此文的介绍,再着重解释下precompute_fre【【微信】】的作用

  • 假设 batch_size为2 seq_len固定为512 【【微信】】的数量为12 每个【【微信】】的维度为64,那么,对于输入到multi-head attn中的输入的尺寸就是 (2, 512, 12, 64)
  • 而fre【【微信】】其实就是需要计算出来的也就是跟绝对位置相关的旋转的角度,在极坐标下对应的复数tensor

而precompute_fre【【微信】】就是提前将这些旋转角度对应的tensor给创建出来,并可以重复利用。因为确定了序列的最大长度,所以这个tensor是固定死的。根据后续的数据流我们可以发现,在调用该函数时,传入的两个参数分别是【【微信】】的维度,以及最大长度的两倍,具象地,也就是64和1024

LLaMA和GPT一样,都是基于Transformer这个架构,通常,我们在构建transformer时,是按Block构建的,每个transformer Block包含SA和FFN两部分,然后再通过堆叠block的形式,构建起整个transformer网络,LLaMA也是这样做的 回顾一下Attention计算的总体过程是:

  1. 输入,分别经过三个Linear得到
  2. 在??和中加入旋转位置编码
  3. 缓存??和??
  4. 计算

其中有一个细节就是缓存机制,它设计的目的是在generate时减少token的重复计算。简单解释一下,就是在计算第n个token特征的时候,需要用到第个token,即每次生成时,需要知道前面所有的过往信息,如果每次都从头算的话,那就会造成极大的浪费,所以就没算一个位置的信息,就把它缓存下来 接下来,我们来看下代码实现,首先是SA部分:

然后是FFN部分,需要注意的点就是采用的激活函数,以及激活函数的位置

这里与常见模型中的FFN做一下简单的对比

  • BART中的FFN,用的是fc->act->fc,用了两层全连接
  • GPT中的FFN,用的是【【微信】】->act->【【微信】】,也是只用了两层
  • 而LLaMA中的FFN采用了三个全连接层以实现FFNSwiGLU,即

然后将SA和FFN这两部分拼在一起就是一个transformer block

最后利用torch的module list将transformer block进行堆叠,拼上最前头的embedding部分,就是一个完整的transformer decoder结构了

接着看下生成过程,如下:

  1. 对prompts进行tokenize,得到token ids;
  2. 计算当前batch的最大长度total_len,用来创建输入的token tensor,最大长度不能超过前文所述缓存的大小;
  3. 从当前batch中,最短的一个prompt的位置,作为生成的开始位置,开始生成;
  4. 输入的token tensor传入transformer模型,计算logits,得到形状为(batch_size, hidden_size)的logits(transformer最后一层的输出);
  5. softmax+top_p采样,得到当前预测的token,并更新当前位置,准备预测下一个token;
  6. 解码得到生成的文本

代码如下

在Optimizer设计上

  • 该模型使用AdamW优化器(Loshchilov和【【微信】】,2017)进行训练,超参数设置为β1=0.9,β2=0.95 此外,使用余弦学习率方式,使最终学习率等于最大学习率的10%,以及使用0.1的权重衰减和1.0的梯度剪裁,和2,000个warm up策略,使得可以根据模型的大小改变学习率和批次大小

在模型的加速优化方面

  1. 首先,使用一个高效的因果多头注意力方式的实现,灵感来自Rabe和Staats(2021)以及Dao等人(2022),这个实现可在xformers库中找到,可以有效减少内存的使用和计算 具体原理为通过不存储注意力权重和不计算由于语言建模任务的因果性质而被掩盖的键/查询分数来实现的
  2. 其次,为了进一步提高训练效率,减少了在check point的后向传递中重新计算的激活量,在实现上,通过手动实现trasnformer层的后向函数来进行操作 为了充分受益于这种优化,还通过如Korthikanti等人(2022)中采用的方法,进行使用模型和序列并行来减少模型的内存使用
  3. 最后,该工作还尽可能地重叠激活的计算和GPU之间在网络上的通信 最终的优化性能效果为:当训练一个65B参数的模型时,代码在2048A100的GPU上处理大约380个token/秒/GPU,并耗费80GB的内存,这意味着对包含1.4Ttoken的数据集进行训练大约花费了21天

LLaMA发布不久后,一些研究者基于它做了不少工作

  • 一开始最小参数7B的模型也需要近30GB的GPU才能运行,但通过比特和字节库进行浮点优化,能够让模型在单个N【【微信】】上运行
  • 之后,GitHub 上的一名研究人员甚至能够在Ryzen 7900X CPU上运行LLM的7B 版本,每秒能推断出几个单词
  • 再之后,有研究者推出了llama.cpp,无需 GPU,就能运行 LLaMA llama.cpp 项目实现了在MacBook上运行 LLaMA,还有开发者成功的在 4GB RAM 的树莓派上运行了 LLaMA 7B

3月中旬,斯坦福发布Alpaca(中文名:羊驼):号称只花100美元,人人都可微调Meta家70亿参数的LLaMA大模型(即LLaMA 7B),具体做法是通过52k指令数据,然后在8个80GB A100上训练3个小时,使得Alpaca版的LLaMA 7B在单纯对话上的性能比肩GPT-3.5(text-davinci-003),这便是指令调优LLaMA的意义所在

  • 论文《Alpaca: A Strong Open-Source Instruction-Following Model》
  • 代码地址:https://github.com/tatsu-lab/stanford_alpaca

可能有读者有疑问,即52k数据都长啥样呢?这52K数据存在Alpaca项目的alpaca_data.json文件中,这个JSON文件是一个字典列表,每个字典包含以下字段:

  • instruction: str,描述了模型应该执行的任务,52K 条指令中的每一条都是唯一的
  • input: str,要么是上下文,要么直接输入(【【微信】】ut for the task),例如,当指令是“总结以下文章”时,输入就是文章,大约 40% 的示例有输入
  • output: str,由GPT3.5对应的API即 text-davinci-003生成的指令的答案

而斯坦福团队微调LLaMA 7B所用的52K指令数据,便是通过Self-Instruct『Self-Instruct是来自华盛顿大学Yizhong Wang等22年12月通过这篇论文《SELF-INSTRUCT: Aligning Language Model with Self Generated Instructions》提出的』提示GPT3的API拿到的

?具体而言,论文中提出