作者:Alex Pim,Imagination 软件架构 Fellow
在Imagination,我们致力于加速大语言模型在日常设备上的运行。在本系列关于大语言模型性能与加速的两篇博客的首篇中,我们将介绍关键性能指标:首次生成Token时间(TTFT)与Token间延迟(ITL)。在下一篇文章中,我们将分享如何在 Imagination GPU 上实现高效的 Llama.cpp 推理。
若您看过谷歌的“AI概览”或体验过Word里的词汇预测功能,那便是LLM在发挥作用。它们基于Transformer网络构建,而 Transformer 使用注意力机制(attention)来聚焦输入中最相关的部分——就像你在观看一场足球比赛时,会本能地盯着带球的球员,而不是场上另外 21 位球员。LLM 的神奇之处在于,通过对概率的建模,它们能够捕捉到某种程度上的人类思维模式,因此在各种应用中都具有巨大的价值。
挑战在于这一切都需要强大的计算能力。LLM依赖大规模矩阵运算,这类运算要求高但高度并行——换言之,正是GPU的完美用武之地。
阅读白皮书《AI处理器的真正本质》可了解GPU为何能完美胜任高度并行任务。
正因如此,包括基于PowerVR架构的Imagination GPU在内的图形处理器,在提升模型运行速度与效率方面发挥着关键作用——尤其在功耗与性能至关重要的移动及边缘设备领域。
加速大语言模型推理
大语言模型(LLMs)通过提取先前Token的上下文窗口来生成文本,并预测序列中的下一个Token。当首次提交提示时,模型必须处理上下文窗口中的所有Token,这可能需要大量计算资源。模型生成的每个新Token都会附加到上下文窗口中的先前Token之后:这是一种自回归模型。

随着每个新生成的token,推理速度将逐渐变慢。
为提升效率,框架常采用键值缓存机制,将先前处理过的token的中间结果存储其中。这种方法避免了冗余计算,显著加速了推理过程,使大语言模型即使在普通硬件上也能实际应用。同时,当新token生成时,该机制能使执行时间保持近似恒定。

由于KV缓存机制,大语言模型通常以两种截然不同的模式运行:
预填充模式:模型处理整个token序列并初始化缓存。该阶段涉及大规模矩阵乘法运算,通常受限于GPU的计算吞吐量。
解码模式:复用缓存结果生成后续token。由于跳过前期计算,该模式速度显著提升。其依赖矩阵-向量乘法运算,通常受限于GPU内存带宽(用于流式传输权重和激活值)。
两种模式在用户体验和硬件资源消耗方面存在差异,因此应分别采用专属性能指标进行评估。
LLM性能指标
讨论LLM部署性能时,主要涉及两项指标:
首次token生成时间(TTFT)——预填充模式下执行计算任务所需时间
Token间延迟(ITL)——解码模式下执行计算任务所需时间
首次生成token时间 (Time to First Token)
TTFT指标指大语言模型生成首个输出token所需的时间,此时模型必须已处理完全部用户输入提示(即预填充阶段完成)。
“首次生成 Token 的时间(Time to First Token)在大语言模型应用于汽车场景或交互式应用中通常非常重要;因为人类已经习惯了以自己的说话速度被‘听见’。如果一个数字助手或应用程序的响应速度达不到人与人交流时的反应速度,那么用户的整体‘体验’就会开始下降。”
试想若在谷歌搜索时输入问题却需等待数十秒才能获得答案——这在当今标准下相当令人沮丧(尽管我们中有些人曾经历过从磁带加载电脑游戏的漫长等待)。
因此无论是数据中心部署还是边缘计算场景,GPU供应商面临的核心挑战在于:即使在功耗受限或网络延迟高的环境下,仍需为用户提供迅捷的首次响应。
具体而言,大型语言模型(如Llama-3.2-3b)要生成输入查询的首个token,需处理大量矩阵乘法运算(下表所示),其中参数N代表用户输入token数量(此例为13)。以用户提示词“建站只需10步:”为例:
M: 1024, K: 3072, N: 13
|
M: 128, K: 32, N: 13
|
M: 3072, K: 3072, N: 13
|
M: 3072, K: 8192, N: 13
|
M: 32, K: 128, N: 13
|
M: 8192, K: 3072, N: 13
|
表1 - LLAMA-3.2-3B型号典型GEMM M、K和N尺寸
llama.cpp 中的矩阵乘法运算执行如下矩阵乘法:
CT = A * BT
这意味着矩阵 C (NxM) 的计算方式为 A(M*K) * B(N*K)。值得注意的是,C 和 B 均为转置矩阵,这意味着转置矩阵的元素相对于原始矩阵沿对角线方向进行了交换。
在LLM预填充阶段所需的矩阵乘法运算中,存在若干较大维度的矩阵操作——这正是PowerVR GPU大显身手的环节!这些矩阵乘法运算具有独立性且交互需求极低,与GPU的SIMT架构所具备的超大规模并行特性高度契合。
模型生成首个输出token前需执行多次上述矩阵乘法迭代,而矩阵运算耗时直接决定了用户等待模型开始输出所需的时间。
Token 间延迟 (Inter-Token Latency)
衡量大语言模型性能的第二个指标是 “Token 间延迟(Inter-Token Latency)”,其含义非常直接:即模型生成一个新 Token 所需的时间,或者说模型在逐个生成输出时,两个 Token 之间的间隔时间。
这个过程与处理用户输入提示(prompt)的过程略有不同,因为它涉及的是矩阵-向量(matrix-vector)乘法,而不是矩阵-矩阵(matrix-matrix)乘法;并且由于上一节提到的 K-V 缓存技术,这一阶段的计算强度大幅降低。
在生成(或解码)阶段,数学操作是一系列矩阵-向量乘法,其中 M、K、N 中的 N 始终为 1,而上一轮生成的 Token(对应的向量)会作为单一输入向量,进入下一层的一组矩阵-向量乘法中。
加速矩阵-向量乘法可以在 GPU 上实现,但由于其计算量相对较低,在 GPU 上反而容易受到内存带宽的限制,这也是为什么 LLM 的 decode 阶段通常可以在内存带宽限制较小的 CPU 上执行。
普遍认为,在 LLM 的解码阶段,GPU 较难发挥显著优势;然而,如果部署芯片(SoC)的主 CPU 负载较高,将解码阶段卸载到 GPU 仍然具有价值。
M: 128, K: 32, N: 1
|
M: 1024, K: 3072, N: 1
|
M: 3072, K: 3072, N: 1
|
M: 3072, K: 8192, N: 1
|
M: 32, K: 128, N: 1
|
M: 8192, K: 3072, N: 1
|
表2 - LLAMA-3.2-3B模型典型GEMV计算
结语
至此,我们关于在PowerVR GPU等边缘设备上加速大型语言模型推理的两篇博客系列已完成第一部分。我们介绍了“首次生成token时间”和“Token间延迟”的概念,以及它们如何应用于大语言模型计算的两个主要阶段。
在第二部分中,我们将剖析Imagination公司为适配PowerVR GPU架构对Llama.cpp应用程序所做的代码修改——涵盖Vulkan接口与默认OpenCL实现两种方案。最后将重点分析我们自主优化的OpenCL内核,这些内核专为释放PowerVR GPU的高利用率而设计,在采用F16量化权重格式时,能显著提升矩阵乘矩阵与矩阵-向量乘法运算的性能表现。
全部0条评论
快来发表一下你的评论吧 !