llama2.c 源码阅读

1. 概述 前OpenAI著名工程师Andrej Kapathy开源了llama2.c项目,该项目是llama2模型推理代码的C语言实现,用大概970行C代码实现了LLama2模型的推理算法。整个项目代码简洁高效,值得深度阅读。对掌握大模型推理算法的细节有极大的帮助。 2. 源码阅读 2.1 基础算法 RMS归一化公式是: $$ o_i = w_i \times x_i \times \frac {1}{\sqrt{\frac{1}{n}\sum_{j=0}^{n-1} x_j^2 + \epsilon}} $$ 其中,\(\epsilon\) 为防止分母为0的数值。还有RMS因子是对x的归一化,w变量是gain变量,重新缩放标准化后的输入向量。 // ---------------------------------------------------------------------------- // neural net blocks; the dynamics of the Transformer void rmsnorm(float* o, float* x, float* weight, int size) { // calculate sum of squares float ss = 0.0f; for (int j = 0; j < size; j++) { ss += x[j] * x[j]; } ss /= size; ss += 1e-5f; ss = 1....

July 6, 2024 · Skyan

大语言模型如何扩充上下文长度?

我们在应用大语言模型遇到的最典型的限制就是输入文本的上下文长度。开源的模型的上下文长度限制从2K到32K不等,商业模型最大上下文限制从2K到100K范围。上下文长度对应用大语言模型有着非常关键的影响,包括知识增强、记忆等Agents完成的工作,都是为了解决大语言模型上下文长度限制而设计的。大语言模型为什么会有上下文长度限制?是否有方法能扩充长度到几倍甚至十几倍?这几个问题困扰我很久。最近一段时间经过调研之后,我发现这些问题已经有了令人兴奋的进展,我也收获一些心得,记录于此。 先说结论: LLM的训练和计算都是没有上下文长度限制的,限制的只有计算资源和模型效果 头部公司和开源社区都有了阶段性的成果,最新的transformers,llama.cpp等开源项目已经内置了扩充上下文长度方法 如何在扩充上下文长度的同时,降低训练成本,保证模型效果,是一个还在不断探索的话题 LLM的上下文长度限制之谜 实际上,目前以Transformer为核心的LLM,理论上而言是没有上下文长度限制的。唯一限制上下文长度的,只有训练时的资源消耗,以及预测时的输出效果。如果不考虑这两点,LLM完全可以支持任意长度的上下文,这里本质原因是,Transformer的核心:Attention算法和上下文长度无关。 为说明这个本质原因,我们回顾下Attention的计算,参考「Attention is all your need」经典论文1 : 定义n为输入的token数量,vocab_size为token词典大小,d为文本embedding的维度大小,k为Query和Key向量的维度大小。那么整个Attention计算过程如下: Inputs是n个token序列,查找(vocab_size, d)大小的Embedding词典,转化为(n, d)的输入矩阵X 类似的,将输入的token位置i经过位置向量计算(查表或者实时计算),转化为(n, d)的词典,和上面的X词典相加,获得带上位置向量的X作为输入。注意位置向量的计算有两种方法,一种是通过查表的方式,即查找一个(pos_size, d)大小的Embedding词典,另外一种是实时计算,根据token的位置i,通过位置embedding算法,计算出对应的位置向量。这两种方法各有优缺点,这将是突破上下文长度限制的重点。 将X乘以\(W^Q,W^K和W^V\)三个Q,K,V权重矩阵,获得Q,K,V值矩阵。其中\(W^Q\)形状为(d, k), \(W^K\)形状为(d,k), \(W^V\)形状为(d, v),注意着三个权重矩阵都和输入长度无关,获得的Q和K矩阵大小是(n, k),V矩阵大小是(n, v) 如下计算attention: $$Attention(Q,K,V) =softmax(\frac {QK^T}{\sqrt{k}})V$$ 其中\(QK^T\)计算结果为(n, n)矩阵,再乘以V的,输出结果为(n,v)矩阵。注意这些计算都是实时计算,计算复杂度和输入长度有关。 5. 在Multi-Head Attention算法中,上述4个步骤所有矩阵变成了张量,增加了h个header,输入矩阵X变成(h, n, d)大小,\(W_q\)大小为(h, d, k), \(W_k\)大小为(h, d, k), \(W_v\)大小为(h, d, v)。Q, K, V矩阵分别大小为(h, n, k), (h, n, k), (h, n, v)。通过将多头concat,输出(n, hv)大小的结果\(Attention(Q,K,V)\),再经过一次线性变化,最终Attention结果为: $$MultiHead(Q, K, V) = Concat(Attention(Q, K, V))W^O$$ \(W^O\)大小为(hv, d),所以最终Attention结果\(MultiHead\)维度为(n, d)。 从上面的计算可见,整个模型的参数,只有位置向量需要查表的时候,是和上下文长度有关,而其他的所有权重矩阵,都和上下文长度无关。如果位置向量实时计算时,attention算法所依赖的所有参数都和上下文长度无关。 那么限制到底在哪里呢?上面已经提到,限制就在: 计算资源 模型效果 先说计算资源的限制,可以证明(过程略),上述第三步计算Q,K,V矩阵的计算复杂度是\(O(nd^2)\),第四步计算attention的计算复杂度是\(O(n^2d)\),所以计算attention总体的计算复杂度是\(O(nd^2+n^2d)\),如果d > n,则\(O(nd^2)\)占计算复杂度的大头,例如LLaMa1模型的n为2048,d为4096,所以可以估计训练复杂度和训练输入的上下文长度呈线性关系。以LLaMa1模型举例,训练一次的计算成本约为300万美元,如果将输入长度扩大到8倍(即16K),那么训练成本将增长到2400万美元。因此如果要在预训练阶段用更长的上下文长度训练,这个成本将变得难以接受。...

August 4, 2023 · Skyan

大模型时代,我们如何重构产品

近期厂内关于AI云原生思维的讨论非常热烈,尤其是AI大模型时代,产品如何重做重构的话题异常火热。关于这个话题,我倒是联想到一句经典的谚语:“It is like teenage sex: Everyone talks about it, nobody really knows how to do it, everyone thinks everyone else is doing it, so everyone claims”. 但说说容易,我们应该如何思考这个话题呢?在我看来,需要引入一些模型化思维来拆解这个问题,这样很多现象就能得到很好的解释,关于如何重构产品也就能逐步看到清晰的路线了。 首先,我们可以观察到,一切复杂系统,包括人体,组织,社会,甚至互联网,都是由三个子系统组成: 信息系统:数据,文章,网页,图片,视频等等一切我们能看,能读,能听,能感受到的东西,这个大千世界充满了信息,信息可以是数字化的,例如互联网上的数据,也可以是模拟的,例如线下的交流对话等 模型系统:通过各种推理,拆解,演绎,总结等手段,将信息转化为知识沉淀下来,例如人的大脑内部就存在一个抽象的世界模型,这个模型赋予了我们认知的能力,让我们可以产生意识,理解这个世界 行动系统:当模型处理完信息之后,它需要执行一定的操作和这个环境互动,这就是行动系统的作用。例如我开车过程中看到了一只小狗,我的大脑获取这个信息后,交给认知模型进行分析和处理,认知模型决策需要避开,我的行动系统的手和脚操作方向盘和刹车,完美避开相撞的风险。 当把互联网这样的复杂系统拆解为这三个子系统之后,最近三十年互联网发生的事情,就能用这三个系统的变化得到如下分类: 信息时代:从1995年开始,我们进入了信息时代。这个时代的互联网产品,本质上都是在做信息的搬运工。这其中还细分多个阶段,例如90年代开始由论坛,新闻门户网站组成的Web1.0阶段,初步形成信息的数字化。典型的代表有雅虎,新浪,搜狐和网易这些老牌门户网站。从2000开始,随着Web2.0的兴起,我们有了更高效的搜索引擎,社交网络,电子商务平台,实现了信息更高效的运转,真正将获取信息的边际成本降为了0。这个阶段出现了很多伟大的公司,典型的代表有Google,Amazon,百度,腾讯,阿里等。正是有了这些平台,我们才真正实现了获取信息效率的极大提升。到了2010年以后逐步兴起的移动互联网,又诞生了一批新的平台公司,实现了移动设备上的信息生产和消费,让用户可以随时随地地获取信息,使用信息 模型时代:其实从2010年前后,互联网平台产品就已经开始具备了模型能力,但这种模型还是“小”模型,并不具备转化为知识的能力。例如在搜索引擎中,我们有LTR模型来优化排序,在推荐引擎中也有稀疏大模型来优化推荐的列表。但这些模型都专属于某一个垂直领域,无法通用化使用。一个搜索引擎的模型是无法用在推荐系统中的,模型应用的边际成本依然很高。直到2022年开始,以OpenAI的ChatGPT为代表的大模型真正登台之后,我们才真正步入了模型极大发展的阶段。代表特色就是这种模型具备通用的认知能力,将使用和获取知识的边际成本真正降为0。举个例子来说,在模型时代之前,我们想了解一种疾病如何治疗,需要去阅读,去理解各种专业知识,甚至花费数年专业的学习才能真正解决临床上的病症。但如果有一个经过医学专业知识训练好的大模型,通过大模型就直接获得了治疗方法,这就是将获取知识的成本降为了0。当前我们正处于这个模型时代刚开始的时期 下一个时代——行动时代:行动时代其实已经初露雏形了。典型的代表就是自动驾驶。自动驾驶是将我们驾驶行动的边际成本降为0,我们不需要付出太多获取信息-认知处理-操作汽车这一系列的成本,自动驾驶就自动替我们解决了。这个时代同样也处于早期阶段,但并不遥远 因此,在当前的模型时代,我们需要思考的是,如何用大模型来改造以及创造各种产品,将各行各业需要人来认知的过程的边际成本降为0,将是这个时代的主旋律。 以New Bing为例,为什么搜索是第一个大模型为先的应用及平台,从上面的分析可以获取答案。在信息时代,搜索产品本质上是人通过搜索query来找信息,找知识,完成任务,如下结构所示: 人 → 信息 但人在用搜索引擎找信息的过程中,还需要去理解网页信息,阅读内容,并将这些网页内容通过人自身的认知模型转换为知识,转换为下一步的行动。而且每一次搜索,都要重复这一过程,付出类似的成本,这就是人找信息过程中,需要付出的边际成本。 人 → 理解认知 → 信息 但大模型的出现,将中间需要人的认知模型来理解的步骤交给大模型来完成,整个流程变成了: 人 → 大模型 → 信息 这就意味着,大模型可以部分代替人的认知能力,把繁琐的总结,汇总,提取信息的边际成本都降为0,直接可以获得人想获得的答案。这就是经过大模型改造后的搜索引擎,其效率将比传统的搜索引擎更为高效,成本更低。 更进一步,人在找到信息之后,还会有下一步的行动。传统上这些行动还需要人去做判断,思考,决策才能执行这些行动。这个阶段的边际成本也可以交给大模型来降低,如下所示: 人 → 大模型 → 信息 → 大模型 → 人 → 行动 其实上面本质上就是一种所谓的端到端闭环。举一个例子,我希望买一个空调,在搜索引擎搜索后,大模型帮我筛选了若干最新款空调的信息,并总结展示给我供我选择,但我决定选某一款空调后,大模型帮我进一步规划去哪里买,什么价格最便宜,售后服务更完善,最终高效地完成了一次人找信息,再从信息到行动的闭环。 以上,就是New Bing在这次大模型时代对传统搜索引擎做出的重构:通过在人找信息这个环境中加入大模型,将人的理解和汇总的边际成本降为0,甚至实现信息到行动的0边际成本的延伸,真正实现一个高效率的搜索引擎。 如果这样推演,我们可以扩展到更多互联网产品和平台上么?完全是可能的。我们就以另一个Web2.0时代产物,推荐系统为例,尝试推演推荐系统如何应用大模型。...

July 6, 2023 · Skyan