首页 > 系统相关 >上周面的一个985女生,问了Transformer模型的内存优化

上周面的一个985女生,问了Transformer模型的内存优化

时间:2024-09-30 10:51:49浏览次数:14  
标签:Transformer 缓存 AI 模型 985 学习 token KV 内存

Transformer 模型现在很火,内存优化又很重要。上周面试了一个 985 大学的女生,跟她谈到了 Transformer 模型的内存优化问题。

那么这个女生到底给出了哪些关于 Transformer 模型内存优化的独特思路呢?一起来看看。

01

什么是Transformer模型中的KV缓存?

Transformer 中文本是逐个 token 生成的,每次新的预测都会基于之前生成的所有 tokens 的上下文信息。

这种对顺序数据的依赖会减慢生成过程,因为每次预测下一个 token 都需要重新处理序列中所有之前的 tokens。

例如,要预测第 100 个 token,模型必须使用前 99 个 token 的信息,需要对这些 token 进行复杂的矩阵运算。预测第 101 个 token 时,也要对前 99 个 token 做类似计算,以及对第 100 个 token 的新计算。

如何简化呢?

答案是使用 KV 缓存。KV 缓存通过保存这些计算结果,使模型可以在生成后续 tokens 时直接访问这些结果,而不需要重新计算。

换句话说,在生成第 101 个 token 时,模型只需从 KV 缓存中检索前 99 个 token 的已存储数据,并只对第 100 个 token 执行必要的计算。

02

如何估算KV缓存消耗的内存大小?

KV 缓存通常使用 float16 或 bfloat16 数据类型以 16 位的精度存储张量。对于一个 token,KV 缓存会为每一层和每个注意力头存储一对张量(键和值)。

这些张量的大小由注意力头的维度决定,这对张量的总内存消耗(以字节为单位)可以通过以下公式计算:

层数 × KV 注意力头的数量 × 注意力头的维度 × (位宽 / 8) × 2

最后的 “2” 是因为有两组张量,也就是键和值。位宽通常为 16 位,由于 8 位是 1 字节,因此我们将位宽除以 8,这样在 KV 缓存中每 16 位参数占用 2 个字节。

我们以 Llama 3 8B 为例,这个公式就变为:

32 × 8 × 128 × 2 × 2 = 131,072

**注意:**Llama 3 8B 有 32 个注意力头,不过由于 GQA 的存在,只有 8 个注意力头用于键和值。

从上面可以看到,对于一个 token,KV 缓存占用 131,072 字节,差不多 0.1 MB。这看起来好像不大,但对于许多不同类型的应用,大模型需要生成成千上万的 tokens。

举个例子,如果我们想利用 Llama 3 8B 的全部 context 大小(8192),KV 缓存将为 8191 个 token 存储键值张量,差不多占用 1.1 G 内存。换句话说,对于一块 24G 显存的消费级 GPU,KV 缓存将占用其总内存的 4.5%。

而对于更大的模型,KV 缓存增长得更快。比如对于 Llama 3 70B,它有 80 层,公式变为:

80 × 8 × 128 × 2 × 2 = 327,680  

对于 8191 个 token,Llama 3 70B 的 KV 缓存将占用 2.7 GB。并且注意,这只是单个序列的内存消耗,如果我们进行批量解码,还需要将这个值乘以 batch size。

比如 batch size=32 的 Llama 3 8B 模型,将需要 35.2 GB 的 GPU 显存,一块消费级 GPU 显然搞不定了。

因此虽然在推理阶段用 KV 缓存可以提高处理速度,并且已经是业界标准做法,但是 KV 缓存在深层模型和长序列场景下,也会占据大量 GPU 内存。

而实际开发中,我们可以通过 KV 缓存量化,来降低推理阶段的 LLM 内存需求。后面我们将通过实际的例子(Llama 3 8B 模型),来看看如何对 KV 缓存进行量化的

如何学习AI大模型 ?

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。【保证100%免费】

标签:Transformer,缓存,AI,模型,985,学习,token,KV,内存
From: https://blog.csdn.net/2401_86435672/article/details/142651844

相关文章

  • 基本类型大小,类大小及内存对齐
    讨论类大小时,我们设置系统为64位系统1)空类1字节空类中只包含一个内存地址,保存类对象的唯一地址空类对于一个空类,即使没有任何成员变量,编译器也会为其分配1字节的内存,以确保不同对象的地址唯一性2)包含虚函数的类a)只包含一个/多个虚函数的类8字节每个类的实例只会包含......
  • 数据在内存中的存储以及练习(一篇带你清晰搞懂)
    一:数据在内存中的存储首先,如果要了解数据在内存中的存储,我们首先要了解一个概念大小端是什么?1:什么是大小端?其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下面是具体的概念:大端(存储)模式:是......
  • Matlab 基于Transformer-LSTM-SVM多变量时序预测 (多输入单输出)
    基于Transformer-LSTM-SVM多变量时序预测(多输入单输出)你先用你就是创新!!!1.程序已经调试好,无需更改代码替换数据集即可运行!!!数据格式为excel!2.评价指标包含:RMSE、R2、MSE、MAE、MBE、MAPE、RPD。3.Transformer作为一种创新的神经网络结构,深受欢迎。采用Transformer编码器......
  • C语言内存函数
    1.memcpy的使用和模拟实现void*memcpy(void*destination,constvoid*source,size_tnum);函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置这个函数在遇到"\0"的时候并不会停下来如果source和destination有任何的重叠,复......
  • 统计进程内存使用量
    统计进程内存使用量#!/bin/bash#文件名:memory_show.sh#作者:wanghongwei#日期:2024年9月29日#版本:1.0#描述:统计进程内存使用量#使用方式:./memory_show.sh[-k/-K][-m/-M][-g/-G]#初始化所有进程的统计变量declare-ATOTAL_MEM_SIZETOTAL_MEM_SIZ......
  • 图表示学习中的Transformer:Graphormer的突破
    人工智能咨询培训老师叶梓转载标明出处在自然语言处理和计算机视觉等领域,Transformer架构已经成为主导选择。然而,在图级别的预测任务中,它的表现并不如主流的图神经网络(GNN)变体。这一现象引发了一个思考:Transformer是否适合图表示学习,以及如何使其在图表示学习中发挥作用。来......
  • 动态内存分配——C语言
    本篇文章是对动态内存分配部分内容的学习分享,包含了四个内存函数的接受奥与使用以及常见的一些错误那咱们废话不多说,直接开始吧!1.动态内存功能存在的意义说到内存开辟也许我们并不能马上做出反应且清楚得知道指的是什么事实上,我们已经掌握了内存开辟方法了只是我们对这个......
  • java 17 查看 运行时内存堆 的命令
    Java17Windows11- 发生问题运行了一个java程序,基于Java17的。在使用jmap查看堆内存分配时,出现了错误:>jmap-heap8400Error:-heapoptionusedCannotconnecttocoredumporremotedebugserver.Usejhsdbjmapinstead提示使用jhsdbjamp替代。ben......
  • 七种有效方法,轻松解决C盘内存爆满问题
    七种有效方法,轻松解决C盘内存爆满问题在我们日常电脑的使用中,C盘内存爆满是一个常见且令人头疼的问题。由于电脑运行产生的临时文件、软件下载及安装位置默认在C盘、系统更新后的文件占用大量空间等因素,导致C盘空间捉襟见肘。为了电脑能够流畅稳定运行,本文精心整理了七种清......
  • 计算机内存管理模块源码实现
    计算机内存管理模块的源码实现涉及到底层的操作系统内核编程,通常需要使用C语言或者汇编语言来编写。以下是一个简化的内存管理模块的伪代码示例,它展示了内存分配和释放的基本逻辑。这个例子非常基础,实际的内存管理模块会更加复杂,需要考虑诸如内存碎片、多线程同步等问题。#......