新闻详情

新闻详情

首页 / 资讯中心 / 详情

初创-词表角度如何减少显存消耗

发布时间:2026/9/29 13:13:04来源:尧图网络
初创-词表角度如何减少显存消耗
ChunkedLinearCrossEntropy:分块词表交叉熵(Qwen3.5训练显存削峰方案)概述问题根源:LMHead词表乘法带来巨大显存尖峰大模型CausalLM训练标准流程:主干Transformer输出hidden_states[B, L, H]过lm_head = nn.Linear(H, vocab_size):logits=hidden@WlmTlogits = hidden @ W_{lm}^Tlogits=hidden@WlmT​logits转fp32,计算F.cross_entropyQwen3.5-0.8B:vocab_size=248320。对于 packing 得到的长序列L=16384:bf16 logits张量:16384 × 248320 × 2 bytes ≈ 8GBcross_entropy计算需要fp32,直接翻倍到16GB4080只有16GB显存,仅仅这一步logits就直接OOM/触发GPU重置。更糟的:prompt部分label=-100,本来不需要参与loss,但原生实现依然全部送入lm_head,完整算出整段logits,白白占用显存。核心痛点总结:原生实现:一次性生成完整[L, V]logits,全部保存在计算图,显存尖峰由序列长度 × 词表大小决定;提示token也参与lm_head矩阵乘。✅分块方案两个核心优化:过滤:只取label≠-100的token,prompt直接剔除,不送入lm_head;分块流式计算:有效token拆成小块(本例_CHUNK_TOKENS=2048),每块单独算logits,计算完立刻del logits释放显存;计算图不保存完整logits;前向no_grad + 反向重算logits:前向只累加loss,不保留logits激活;反向阶段,利用保存的hidden、lm_head权重、labels,重新计算当前chunk的logits来求梯度。👉 显存上限:仅单个chunk的logits常驻显存,不再是全局全长logits。性能特点:词表矩阵乘不在模型关键路径上;分块几乎不增加step耗时,只压低显存尖峰。实验数据回顾(A100,stage2,无梯度检查点)Case步内峰值显存step耗时普通,完整logits,非pack短序列21.2 GB0.349 s普通 + 2048分块,非pack短序列18.5 GB0.349 s16k packing长序列,完整logits35.5 GB0.784 s16k packing长序列 +2048分块29.1 GB0.762 s短样本场景:省2.7GB;长pack序列收益巨大,省6.4GB;耗时几乎不变;4080上chunk=256/2048,step时间稳定≈2.6s。补充:这和前面线性注意力、FA varlen空block是独立优化。这个模块只管lm_head词表矩阵乘+交叉熵loss显存,不影响Transformer主干、FlashAttention、线性注意力。原理拆解(autograd custom Function)PyTorch自定义autograd Function,把前向、反向逻辑拆开。Forward(前向)输入:hidden(有效token对应的hidden,已经过滤掉label=-100),lm_head.weight,labels保存hidden, weight, labels到ctx,不保存logits;torch.no_grad()上下文内,循环遍历chunk:每块做F.linear算出当前chunk的logits,转fp32;单块计算cross_entropy,sum累加loss;计算完成立刻del logits释放显存;最终返回平均loss(总loss / 有效token数量)。关键点:no_grad,logits不进入autograd计算图,不会占用计算图的激活显存。Backward(反向)ctx里只有hidden, weight, labels,没有logits。必须重算logits求梯度:遍历同样chunk;每块重新计算logits;手动推导cross-entropy梯度:dLdlogit=softmax(logit)−one_hot(label)\frac{d\mathcal{L}}{dlogit}=softmax(logit)-one\_hot(label)dlogitdL​=softmax(logit)−one_hot(label)代码里用scatter_add实现onehot减法,避免实例化超大onehot矩阵(节省显存);算出dlogits,链式求导:dhidden=dlogits@Wlmdhidden = dlogits @ W_{lm}dhidden=dlogits@W
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

三菱ST数组越界:FOR上限写16,为什么丢了17号 2026/9/29 13:12:54

三菱ST数组越界:FOR上限写16,为什么丢了17号

1. 一个让老手都翻车的下标问题三菱GX Works3里写ST程序,数组和FOR循环是再基础不过的组合。但就是这个基础组合,坑过的人不在少数。我见过一个现场调试的哥们,数组开了16个元素,FOR循环上限也老老实实写了16,结果第17…

阅读更多 →
防爆区Wi-Fi 6 AP选型实战:从认证到覆盖部署的关键要点 2026/9/29 13:12:47

防爆区Wi-Fi 6 AP选型实战:从认证到覆盖部署的关键要点

1. 先确认你的防爆区“危险等级”,第二个问题才有意义这个标题看着像选型问题,实际上第一个要核对的不是价格、不是速率,而是你所在的区域到底属于哪个防爆等级。我参与过几个化工装置区的无线覆盖项目,最深的体会是:普…

阅读更多 →
BW16+ESP32-CYD:脑电EEG数据无线采集与实时波形显示方案 2026/9/29 13:12:47

BW16+ESP32-CYD:脑电EEG数据无线采集与实时波形显示方案

1. 项目缘起与整体链路设计脑电采集这件事,早年给人的印象就是一堆线缆加一台笨重放大器,被采集的人只能老老实实坐在椅子上。这几年消费级 EEG 模块越来越小,成本也压到了个人开发者能承受的区间,于是"把脑电数据无线传出来…

阅读更多 →
嵌入式驱动工程化:从能跑到不崩的四根支柱 2026/9/29 13:12:40

嵌入式驱动工程化:从能跑到不崩的四根支柱

1. “能跑”不等于“能活”:嵌入式驱动开发里最危险的幻觉你写完一个GPIO点灯驱动,烧进STM32,LED亮了——恭喜,你完成了0.5%的工作。你把I2C读取温湿度传感器的数据打印出来,数值跳动正常——很好,你走到了…

阅读更多 →
校园快递代拿App:Android Studio毕设源码解析与避坑指南 2026/9/29 13:12:40

校园快递代拿App:Android Studio毕设源码解析与避坑指南

简介:面向计算机专业毕业设计及Android开发学习者,这份基于Android Studio的校园快递代拿跑腿App源码案例,完整呈现了从需求分析到前后端联调的实现过程,适合用来参考选题、搭建项目框架或进行二次开发。压缩包共52个文件&#xf…

阅读更多 →
汽车电子故障溯源:从物理层到应用层的证据链诊断法 2026/9/29 13:12:33

汽车电子故障溯源:从物理层到应用层的证据链诊断法

1. 这不是教科书,而是一本“修车师傅塞进你口袋里的电子笔记”“汽车电子知识大百科”——看到这标题,别急着划走。它不是那种摆在4S店技术室角落、落满灰、页脚卷边、翻两页就头晕的《车载网络原理》教材;也不是短视频里3秒一个“爆点”、讲…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉