模型训练时占用显存大小,可分为两大部分。模型状态:包括模型参数,对应梯度和优化器状态。剩余状态:包括中间值激活状态,临时内存和内存碎片,其中大头是激活值状态。 本节结合前向和反向计算过程,分析两大部分的显存占用。 1)混合精度训练的整体流程以及使用FP32精度更新参数的必要性。 2)通过更新简单神经网络的参数,分析各种参数的产生和传递过程。 3)激活值的显存占用和对应内存优化策略-激活值重计算介绍 1,混合精度下的显存占用 1.1,混合精度训练 混合精度训练是一种结合单精度(FP32)和半精度(FP16)优势的模型训练技术,旨在平衡训练效率与模型精度 • 模型状态:可训练的参数 w1 和 w2,模型参数梯度 和(adam优化器状态)。 3,中间激活值显存占用分析 3.1,什么是中间激活值? 3.2,中间激活值显存占用估计 图2,大模型架构图仅展示一层结构,并显示了内部各模块的操作。
我们结合最新硬件参数,对比分析不同显卡的部署场景,提供选型参考。1. 各显卡模型适配能力结合前文显存计算公式,针对7B、13B、70B三大主流模型,分析不同显卡的适配效果:2.1 RTX 4070(12GB显存)核心适配:聚焦7B模型,13B模型需极致量化,70B模型不支持单卡运行 ×2×1.3≈33.8GB)显存不足,INT8量化(总占用≈16.9GB)流畅运行,速度8-12字/秒,适合复杂任务(如数据分析、多轮对话);- 70B模型:INT4量化(总占用≈45.5GB),需2张 ;多卡互联注意兼容性:消费级显卡多卡分片需主板支持NVLink/SLI,专业级显卡集群更稳定;功耗与电源匹配:RTX 4090需1000W以上金牌电源,RTX 5090建议1200W+,避免供电不足导致崩溃 运行验证print("\n生成测试:分析大模型双卡分片的显存分配逻辑...")inputs = tokenizer("分析大模型双卡分片的显存分配逻辑", return_tensors="pt").to
ESIM是一个综合应用了BiLSTM和注意力机制的模型,在文本匹配中效果十分强大. 文本匹配说就是分析两个句子是否具有某种关系,比如有一个问题,现在给出一个答案,我们就需要分析这个答案是否匹配这个问题,所以也可以看成是一个二分类问题(输出是或者不是)。 简介 ESIM模型主要是用来做文本推理的,给定一个前提premise pp 推导出假设hypothesis pp,其损失函数的目标是判断pp与hh是否有关联,即是否可以由pp推导出hh,因此,该模型也可以做文本匹配 ,因为ESIM最后还需要综合所有信息,做一个全局的分析,这个过程依然是通过BiLSTM处理这两个序列: 值得注意的是,F是一个单层神经网络(ReLU作为**函数),主要用来减少模型的参数避免过拟合, ESIM使用的损失函数就是来判断输入的两个句子是否语义相匹配,匹配为1, 不匹配为0;因此使用交叉熵损失函数。
在微调GPT/BERT模型时,会经常遇到“ cuda out of memory”的情况。这是因为transformer是内存密集型的模型,并且内存要求也随序列长度而增加。 所以如果能对模型的内存要求进行粗略的估计将有助于估计任务所需的资源。 如果你想直接看结果,可以跳到本文最后。 因为模型中梯度的数量通常等于中间变量的数量,所以memory_activations= memory_gradients。 估算模型的内存 下面我们以GPT为例。GPT由许多transformer块组成(后面我用n_tr_blocks表示其数量)。 transformer模型所需的总内存为: total_memory = memory_modal + 2 * memory_activations 模型参数的内存: 4*n_tr_blocks*square_of
这么看来显存占用就是W和Y两个数组? 并非如此!!! 下面细细分析。 1.2.1 参数的显存占用 只有有参数的层,才会有显存占用。这部份的显存占用和输入无关,模型加载完成之后就会占用。 在PyTorch中,当你执行完model=MyGreatModel().cuda()之后就会占用相应的显存,占用的显存大小基本与上述分析的显存差不多(会稍大一些,因为其它开销)。 卷积的计算量分析 ReLU的计算量:BHWC 2.2 AlexNet 分析 AlexNet的分析如下图,左边是每一层的参数数目(不是显存占用),右边是消耗的计算资源 AlexNet分析 可以看出: 全连接层占据了绝大多数的参数 常见模型计算量/显存/准确率 3 总结 3.1 建议 时间更宝贵,尽可能使模型变快(减少flop) 显存占用不是和batch size简单成正比,模型自身的参数及其延伸出来的数据也要占据显存 batch 5月推荐入手价 本文都是针对单机单卡的分析,分布式的情况会和这个有所区别。在分析计算量的时候,只分析了前向传播,反向传播计算量一般会与前向传播有细微的差别。
在微调GPT/BERT模型时,会经常遇到“ cuda out of memory”的情况。这是因为transformer是内存密集型的模型,并且内存要求也随序列长度而增加。 所以如果能对模型的内存要求进行粗略的估计将有助于估计任务所需的资源。 如果你想直接看结果,可以跳到本文最后。 因为模型中梯度的数量通常等于中间变量的数量,所以memory_activations= memory_gradients。 估算模型的内存 下面我们以GPT为例。GPT由许多transformer块组成(后面我用n_tr_blocks表示其数量)。 transformer模型所需的总内存为: total_memory = memory_modal + 2 * memory_activations 模型参数的内存: 4*n_tr_blocks
2x3x256x256的四维数组(BxCxHxW)占用显存为:24M 1.2 神经网络显存占用 神经网络模型占用的显存包括: 模型自身的参数 模型的输出 举例来说,对于如下图所示的一个全连接网络(不考虑偏置项 模型的输入输出和参数 模型的显存占用包括: 参数:二维数组 W 模型的输出:二维数组 Y 输入X可以看成是上一层的输出,因此把它的显存占用归于上一层。 这么看来显存占用就是W和Y两个数组? 下面细细分析。 1.2.1 参数的显存占用 只有有参数的层,才会有显存占用。这部份的显存占用和输入无关,模型加载完成之后就会占用。 卷积的计算量分析 ? ReLU的计算量:BHWC 2.2 AlexNet 分析 AlexNet的分析如下图,左边是每一层的参数数目(不是显存占用),右边是消耗的计算资源 ? 常见模型计算量/显存/准确率 3 总结 3.1 建议 时间更宝贵,尽可能使模型变快(减少flop) 显存占用不是和batch size简单成正比,模型自身的参数及其延伸出来的数据也要占据显存 batch
24M 1.2 神经网络显存占用 神经网络模型占用的显存包括: 模型自身的参数 模型的输出 举例来说,对于如下图所示的一个全连接网络 (不考虑偏置项 b) ? 模型的输入输出和参数 模型的显存占用包括: 参数:二维数组 W 模型的输出: 二维数组 Y 输入 X 可以看成是上一层的输出,因此把它的显存占用归于上一层。 这么看来显存占用就是 W 和 Y 两个数组? 并非如此!!! 下面细细分析。 1.2.1 参数的显存占用 只有有参数的层,才会有显存占用。这部份的显存占用和输入无关,模型加载完成之后就会占用。 ReLU 的计算量: BHWC 2.2 AlexNet 分析 AlexNet 的分析如下图,左边是每一层的参数数目(不是显存占用),右边是消耗的计算资源 ? 常见模型计算量 / 显存 / 准确率 3 总结 3.1 建议 时间更宝贵,尽可能使模型变快(减少 flop) 显存占用不是和 batch size 简单成正比,模型自身的参数及其延伸出来的数据也要占据显存
最近做吞吐量调试涉及到输入batch_size的设置,为了把算力和显存用起来,同时不触发out of memory,需要提前估计大模型推理过程中的显存占用,我参考了MindIE官网的这个文档完成了估计: 显存估计 大模型推理的过程中,显存主要用来存储kvcache。kvcache的大小和token的数量成正比,我们首先来看一下单个token的kvcache怎么计算。 由于大模型一般包含多层transformer,所以还需要乘以层数。 计算了单个token的kvcache显存大小后,我们就可以计算整个序列所占的显存大小了: input_length = 1024 output_length = 1024 batch_size = 16 . allocate memory should be larger than 1.75 G. max_block_num: 5851.0 max_batch_Size: 365.0 为了验证理论分析是否正确
在几乎所有的 LLM 面试中,有一个问题总是会被提及:“为大模型提供服务需要多少 GPU 显存?” 无论你是在处理一个 70 亿参数的模型,还是更大的模型,正确地配置硬件以支持这些模型至关重要。让我们深入探讨一下数学计算,这将帮助你估算有效部署这些模型所需的 GPU 内存。 估算 GPU 内存的公式 要估算为大型语言模型提供服务所需的 GPU 内存,可以使用以下公式: M 是 GPU 显存,以 GB(千兆字节)为单位。 P 是模型的参数数量。 Q 是加载模型的位数(例如,16 位或 32 位)。 1.2 考虑了 20% 的额外开销。 分解公式 参数数量(P): 这代表了模型的大小。 下次你规划部署时,你将确切地知道如何估算有效为你的 LLM 提供服务所需的 GPU 显存。
,该问题跟模型结构、引擎框架、驱动版本、GPU 硬件相关。 本文围绕大模型的训练/推理场景,介绍 Transformer 类模型的显存计算公式,帮助读者能更好的了解全局显存的组成以及如何优化显存。 01 模型显存内容分析 在模型训练/推理时,显存(显卡的全局内存)分配一部分是给 AI 框架,另一部分给了系统(底层驱动)。 ,用户不可控;框架侧的显存消耗用户可控,也是本文分析的重点。 3D 并行对显存计算的影响计算: 注意:梯度显存没有除以 TP,主要是考虑到反向计算时需要 AllGather 出完整 gradient。 3D 对激活值显存的消耗改变需要结合重计算公式进一步分析。 03 显存优化 由于大模型的参数成倍数的增长,远超出了单 GPU 物理显存所能承载的范围,大模型训练必然需要进行显存优化。
1.2 神经网络显存占用 神经网络模型占用的显存包括: 模型自身的参数 模型的输出 举例来说,对于如下图所示的一个全连接网络(不考虑偏置项b) ? 模型的输入输出和参数 模型的显存占用包括: 参数:二维数组 W 模型的输出: 二维数组 Y 输入X可以看成是上一层的输出,因此把它的显存占用归于上一层。 这么看来显存占用就是W和Y两个数组? 下面细细分析。 1.2.1 参数的显存占用 只有有参数的层,才会有显存占用。这部份的显存占用和输入无关,模型加载完成之后就会占用。 在PyTorch中,当你执行完model=MyGreatModel().cuda()之后就会占用相应的显存,占用的显存大小基本与上述分析的显存差不多(会稍大一些,因为其它开销)。 ReLU的计算量: BHWC 2.2 AlexNet 分析 AlexNet的分析如下图,左边是每一层的参数数目(不是显存占用),右边是消耗的计算资源.
经典匹配模型 已经提出了使用传统的机器学习技术进行搜索中的查询文档匹配和推荐中的用户项目匹配的方法。这些方法可以在一个更通用的框架内形式化,我们称之为“学习匹配”。 匹配函数f(x,y)可以是特征的线性组合: 其中w是参数向量。它也可以是广义线性模型,树模型或神经网络。 假设存在一对真正匹配度为r的对象 (x,y)。此外,假设由匹配模型给出的 (x,y)的预测匹配度是 f(x,y)。 给定一个带标签的实例 (x,y,r)和匹配模型f,MSE定义为: 另一个例子是交叉熵损失函数。 我们使用 f(x,y+)和 f(x,y−)分别表示匹配模型f给出的(x,y+)和 (x,y−)的匹配度。
阅模型-匹配模式,相比于前两种订阅模型,是更细致的分组,允许 在RoutingKey 中使用匹配符 *:匹配一个单词 #:匹配0个或多个单词 RabbitMQ 订阅模型-匹配(topics)模式主要有以下六个角色构成 ---- 文章目录 一、RabbitMQ 订阅模型-匹配(topics)模式 1、RabbitMQ 匹配(topics)模式 2、匹配(topics)模式组成 二、RabbitMQ 订阅模型-匹配(topics (Fanout)模式 2、RabbitMQ 路由(direct)模式 3、RabbitMQ 主题(topic)模式 ---- 一、RabbitMQ 订阅模型-匹配(topics)模式 1、RabbitMQ 匹配(topics)模式 阅模型-匹配模式,相比于前两种订阅模型,是更细致的分组,允许 在RoutingKey 中使用匹配符 *:匹配一个单词 #:匹配0个或多个单词 2、匹配(topics)模式组成 RabbitMQ 订阅模型-匹配(topics)模式主要有以下六个角色构成: 生产者(producer/ publisher):一个发送消息的用户应用程序。
其实这完全正常,甚至训练时显存占用和模型权重大小差不多,反而说明模型没在真正训练!核心原因很简单:推理只存权重,训练要算导数,必须留存海量中间数据。 今天就拆解小模型狂吃显存的底层逻辑,再给你实用优化方案。 一、显存四大“吞金兽”:模型只是冰山一角 我们常说的“模型大小”,仅指权重和偏置,这只是训练显存占用的冰山一角。 训练时,显存主要被四部分瓜分: 模型权重:模型本身的参数 梯度:反向传播更新权重的导数 优化器状态:Adam等优化器的历史跟踪数据 中间激活值:前向传播留存、供反向传播计算的中间结果 下面逐一算清显存账 分布式训练:多卡分摊显存 单卡不够就多分卡: DDP:每卡存完整模型,显存不省 FSDP/ZeRO:把权重、梯度、优化器状态分片到多卡,训练大模型必备 三、总结:显存占用是训练的“微积分成本” 最后划重点 : 推理:只存权重,显存小 训练:要算梯度、存激活、挂优化器,显存天然暴涨 小模型狂吃显存不是bug,是深度学习的计算本质决定的。
作者&编辑 | 小Dream哥 1 DSSM的提出 较早期的语义匹配模型都是基于关键词的匹配,例如LSA等,无法匹配语义层面的信息。 基于此,DSSM(Deep Structured Semantic Models)提出深度语义匹配模型,期望能够在语义层面匹配query之间的相似性。 3 输入层及word hashing DSSM的输入层结合了词哈希(word hashing)和语义匹配,我们在讲词向量的时候详细介绍了词袋模型,忘记的同学可以点击如下链接先了解: 【NLP-词向量 其实很简单,在单纯的DSSM模型中,中文是按照“字袋模型”来处理的,参考词袋模型,也就是将文本转化成,有几个某某字,有几个某某字。 例如在FAQ中,因为标问会非常多,将标问和用户输入一一匹配时几乎不可能的事情。通常的做法就是,首先基于ES和DSSM做一遍召回和粗排,得到一定数目的标问后再用精排模型得到答案。
和“*”的字符串是否匹配。匹配规则如下: '?' 可以匹配任何单个字符。 '*' 可以匹配任意字符串(包括空字符串)。 两个串完全匹配才算匹配成功。 → true isMatch("aab", "ca*b") → false 分析 方法一: 动态规划: match[i][j] : 表示从i到s.length,从j到p.length的是否匹配 状态转移方程 自然,match[i][j] = match[i+1][j+1]; 如果p[j] == '' 分三种情况, 只匹配s[i] 那么,match[i][j] = [i+1][j+1]; *作为空值出现 那么,macth[i][j] = match[i][j+1] *匹配两个或者以上字符 那么,match[i][j] = match[i+1][j] 初始化: 如果p的后面有连续字符为*时,可以初始化为 = -1){ p = starIdx + 1;//只能用* 去匹配,所以p要回到*后面一个元素开始判断 sMatch++;
1.显存消耗的组成与模型权重计算1.1核心问题大模型训练时显存被什么占满了?不同量化精度下模型权重需要多少显存? 混合精度训练能节省显存吗?2.2原文核心要点>使用AdamW优化器进行FP32训练,模型状态总显存为16Φ。混合精度训练并没有节省模型状态的显存!其真正优势是加速计算和降低激活值显存。 2.3FP32训练的显存占用通俗来讲,训练模型不仅要存"模型本身",还要存"每个参数的更新历史"(优化器状态),这才是显存的大头。 核心要点FP32训练模型状态总显存=16Φ(权重4Φ+梯度4Φ+优化器8Φ)混合精度训练模型状态仍然是16Φ,不节省模型状态显存混合精度的真正价值:计算加速+激活值显存减半2.6小结维度说明FP32训练模型状态 请结合激活值优化和梯度检查点综合分析。
Model Memory Calculator[1] 是 Accelerate[2] 库提供的一个模型显存计算工具,可估算模型训练或推理时所需的显存大小。 但目前该在线工具无法正常使用,即使使用默认的模型名称,也会报在 Hub 中无法找到该模型: 在该 space 的 discussions[3] 中也有不少人遇到了此问题。 使用 README.md[5] 中设定的 Gradio SDK 版本 4.36.0 可能会遇到 与 pydantic 版本不匹配导致的报错[6],故升级至 4.43.0 版本。 修改 src/app.py 中 get_results 方法,修复官方应用中无法在 Hub 中找到模型的问题。 https://huggingface.co/spaces/hf-accelerate/model-memory-usage/blob/main/README.md [6] 与 pydantic 版本不匹配导致的报错
混合精度训练过程中显存占用主要来自参数、梯度、优化器和中间激活值。 仅参数、梯度和优化器占用内存为参数量的16倍,假如全参训练一个7.5B的模型,至少要120G的显存,传统的训练策略,有极大的内存优化空间。 1)三种零冗余优化器的分层优化方法。 1,ZeRo三种内存优化方案 内存占用:采用混合精度训练,参数,梯度和优化器占用显存和总参数量M 的关系为: 大模型训练内存占用参考[模型训练占用显存分析] 核心思想:即然参数、梯度和优化器GPU显存开销大 • zero-3 对优化器,梯度和参数都分片 优化后的内存占比为:,当N比较大时, 显存占用非常的小。 2,ZeRo-2参数更新过程 策略:将模型的梯度和优化器状态进行分片。 lr=0.001 ) else: optimizer = torch.optim.Adam(ddp_model.parameters(), lr=0.001) 从结果上看,使用优化器后,模型训练占用的显存从