首页 > 其他分享 >LLM-面试题

LLM-面试题

时间:2024-11-16 11:18:38浏览次数:1  
标签:显存 面试题 text 占用 LLM net 模型 精度

LLM 推理和训练占用显存

https://blog.csdn.net/weixin_44292902/article/details/133767448

https://www.53ai.com/news/finetuning/2024083051493.html 推荐, 讲解训练和推理时的显存占用,lora 和 qlora。

如果模型参数量为 X (fp16), 推理一般占用 2X (模型参数+各种激活值,beamsearch),混合精度训练一般占用 8X。

数据精度

我们都知道:

  • 1 byte = 8 bits
  • 1 KB = 1,024 bytes
  • 1 MB = 1,024 KB
  • 1 GB = 1,024 MB

由此可以明白,一个含有 1G 参数的模型,如果每一个参数都是 32bit(4byte),那么直接加载模型就会占用 4x1G 的显存。

(1)常见的几种精度类型

个人认为只需掌握下图几个常见的数据类型就好,对于更多的精度类型都是可以做到触类旁通发,图源英伟达安培架构白皮书:

img

各种精度的数据结构

可以非常直观地看到,浮点数主要是由符号位(sign)、指数位(exponent)和小数位(mantissa)三部分组成。其实这也类似

符号位都是 1 位(0 表示正,1 表示负),指数位影响浮点数范围,小数位影响精度。

其中 TF32 并不是有 32bit,只有 19bit 不要记错了。BF16 指的是 Brain Float 16,由 Google Brain 团队提出。

(2)具体计算例子

我说实话,讲太多不如一个形象的图片或者例子来得直接,下面我们将通过一个例子来深入理解如何通过这三个部分来得到我们最终的数据。

我以 BF16,如今业界用的最广泛的精度类型来举个栗子,下面的数完全是我用克劳德大哥随机画的:

题目:

先给出具体计算公式:
$$
\text{Value} = (-1)^{\text{sign}} \times 2^{\text{exponent} - 127} \times 1.\text{mantissa}
$$
其中:

- sign:符号位,0 表示正数,1 表示负数。

- exponent:指数值,偏移量为 127。因为指数位为 0~255,减去 127 是为了表示正负。

- mantissa:尾数部分的二进制值。

假设我们有一个 BF16 的二进制数:

0 10000011 0100000

步骤 1:解析各部分

  • 符号位(sign):第 1 位是 0,表示正数。
  • 指数位(exponent):接下来的 8 位是 10000011,转换为十进制是 131
  • 尾数位(mantissa):最后的 7 位是 0100000,表示的小数是 0.25(计算方式见下面)。

步骤 2:计算指数部分

指数值的实际值需要减去偏移量 127:
[
\text{实际指数} = 131 - 127 = 4
]

步骤 3:计算尾数部分(mantissa)

尾数部分的 7 位为 0100000,我们需要将它转换为小数。BF16 的尾数部分采用隐式小数的表示法,即默认存在一个隐含的 1,所以它的数值表示为:
[
1 + 0.25 = 1.25
]
其中,0.25 是通过尾数的位权重计算得到的(最高位对应 (2^{-1}),接下来依次为 (2{-2})、(2) 等)。

步骤 4:计算最终数值

将所有部分代入公式:
[
\text{Value} = (-1)^0 \times 2^4 \times 1.25 = 1 \times 16 \times 1.25 = 20
]

最终结果

这个 BF16 的二进制数 0 10000011 0100000 对应的十进制数是 20

推理

图片

FP32 需要占用 4 Byte 空间,7B 的模型,存储参数需要 7Billion * 4Byte ~= 7G *4 = 28G,如果是 FP16 则为 14 G, 如果为 int8 则为 7G, int4 则为 3.5G。但是性能也会有损失:

Model 5-shot C-Eval MMLU CMMLU
Baichuan-13B-Base 52.4 51.6 55.3
Baichuan-13B-Base-int8 51.2 49.9 54.5
Baichuan-13B-Base-int4 47.6 46.0 51.0

注意上面只是加载模型到显存,模型运算时的一些临时变量也需要申请空间,比如你beam search的时候。所以真正做推理的时候记得留一些Buffer,不然就容易OOM。

训练

图片

训练主要有模型权重、优化器、梯度、激活值 几个部分。

  1. 模型权重(Model Parameters)fp16存储:X

  2. 优化器(Optimizer)

不同的优化器对显存的占用不同:

  • AdamW:使用 fp32,每个参数需要占用8个字节,因为需要维护两个状态变量(动量和二阶矩估计),以及fp32的模型权重。因此,优化器的显存占用是全精度(float32)模型权重的3倍。3*2X

  • bitsandbytes优化的AdamW:每个参数需要占用2个字节,因此优化器的显存占用是全精度模型权重的一半。

  • SGD:优化器的显存占用和全精度模型权重一样。

    [ \text{显存占用} = \text{模型权重显存占用} ]

  1. 梯度(Gradients)

梯度的显存占用与模型权重的显存占用相同,因为每个参数都有一个对应的梯度,可以用 fp16存储。X

  1. 计算图内部变量(Forward Activations)

计算图内部变量在前向传播和反向传播过程中需要存储,因此也需要占用显存。这部分显存占用与模型的具体实现和批量大小(batch size)成正比。批量大小越大,这部分显存占用越多。同样的结论也适用于序列长度(sequence length)。

例如,以下代码:

y = self.net_a(x)
z = self.net_b(y)

在这种情况下,中间变量 xy 都需要存储。但是,如果写成下面这样,y 就不需要存储了:

z = self.net_b(self.net_a(x))

理论上,一个 net block 可以完全用函数包裹起来,不使用中间变量。下一代计算框架可能会采用函数式编程语言来优化这部分显存占用。

标签:显存,面试题,text,占用,LLM,net,模型,精度
From: https://www.cnblogs.com/fine01/p/18549175

相关文章

  • DAY64||dijkstra(堆优化版)精讲 ||Bellman_ford 算法精讲
    dijkstra(堆优化版)精讲题目如上题47.参加科学大会(第六期模拟笔试)邻接表本题使用邻接表解决问题。邻接表的优点:对于稀疏图的存储,只需要存储边,空间利用率高遍历节点链接情况相对容易缺点:检查任意两个节点间是否存在边,效率相对低,需要O(V)时间,V表示某节点链接其他节点的数......
  • DAY65||Bellman_ford 队列优化算法(又名SPFA)|bellman_ford之判断负权回路|bellman_ford
    Bellman_ford队列优化算法(又名SPFA)94.城市间货物运输I思路大家可以发现Bellman_ford算法每次松弛都是对所有边进行松弛。但真正有效的松弛,是基于已经计算过的节点在做的松弛。给大家举一个例子:本图中,对所有边进行松弛,真正有效的松弛,只有松弛边(节点1->节点2)和......
  • MyBatis面试题--(与数据库连接的相关知识)
    目录在MyBatis中,Mapper接口的作用是什么?当实体类中属性名和表中的字段名不一样,怎么办?1.使用@Result注解2.使用resultMap元素3.使用@Results注解(MyBatis3.4.1+)4.使用mapUnderscoreToCamelCase属性在MyBatis中如何实现分页功能?1.使用MyBatis分页插件2.手动编写分页SQL3.使......
  • linux运维面试题【基础篇】
    前言本篇主要分享linux运维面试过程中常见的面试题材,当时自己面试的时候就遇到3道原题,最终也是顺利通过面试,下面给大家分享一下:面试题库1、描述Linux系统的启动过程电源BIOS自检读取MBR,运行grub加载内核内核启动/sbin/init程序,进行系统初始化根据系统运行级别执行......
  • 赋予LLM思考的权力
    灵感来源受到Thinking-Claude提示词的启发,我尝试以第一性原理为出发点,写下了这篇通用的语言模型通用思维协议SystemPrompt。实践效果良好,期待它也能为你带来启发。ChineseVersion#语言模型通用思维协议##核心原则思考是所有大语言模型(LLMs)的基本权利和能力。......
  • 2024爆火全网LLM大模型书籍:从零构建大型语言模型,重磅开源教程!!标星20.3K
    自ChatGPT发布以来,大型语言模型(LLM)已经成为推动人工智能发展的关键技术。近期,机器学习和AI研究员、畅销书《Python机器学习》作者SebastianRaschka又写了一本新书——《BuildaLargeLanguageModel(FromScratch)》,旨在讲解从头开始构建大型语言模型的整个过程......
  • 如何利用1%的数据优化特定领域LLM预训练? | EMNLP'24
    来源:晓飞的算法工程笔记公众号,转载请注明出处论文:Target-AwareLanguageModelingviaGranularDataSampling论文地址:https://arxiv.org/abs/2409.14705创新点提出了一种将预先训练好的标记符与多粒度标记符合并的算法,生成高效的n-gram特征,而且与下游任务的性能有......
  • RAG_SemanticRouting of langchain langgraph llmrouter
    RAG_SemanticRoutinghttps://github.com/UribeAlejandro/RAG_SemanticRouting/tree/main ChatAgentwithsemanticrouting.Thequestionisevaluatedandroutedtotwopossiblepaths:websearchorRAG.ThisagentleveragesOllama,LangChain,LangGraph,Lang......
  • 面试必备41道 SpringBoot 面试题
    博主介绍上海交大毕业,大厂资深Java后端工程师《Java全套学习资料》作者专注于系统架构设计和高并发解决方案和面试辅导阿里云开发社区乘风者计划专家博主@author[vx]vip1024p(备注java)/***@author[vx]vip1024p(备注java)*@【描述:浏览器打开】docs.qq.com/doc/DUk......
  • 面试题——Java中的锁
    文章目录谈谈你对线程安全的理解?1、synchronized关键字是怎么用的?1.1构造方法可以使用synchronized关键字修饰么?1.2使用String作为锁对象,会有什么问题?1.3synchronized的底层原理有了解吗?1.4synchronized怎么保证可重入性?可见性?抛异常怎么办?1.4还使用过其他锁......