当前位置: 首页 > article >正文

昇腾CANN ops-nn 交叉熵损失的融合优化:从三次 Kernel Launch 到一次

语言模型每一层的损失计算logits → softmax → log → 取 target 位置的负值。标准做法三次 kernel launchsoftmax kernel → log kernel → NLL kernel。三次 HBM 往返中间存两个 N×V 矩阵V 是词表大小LLaMA 是 32000。300B token 训练每个 token 省 2 次 HBM 往返 × 32000 个 float16 → 总共省 38PB 的 HBM 写入。这不是优化是生死线。标准做法三次 Kernellogits [B, V] → softmax → probs [B, V] → log → log_probs [B, V] → NLL → loss ↑ ↑ ↑ ↑ HBM 读: B×V HBM 写: B×V HBM 写: B×V HBM 读: B×V HBM 读: B×V HBM 读: B×V三次 kernel 各做各的——中间矩阵 probs 和 log_probs 都是 B×V 大小LLaMA-7B 下 B2048, V32000 → 131MB 每个矩阵 → 总共 262MB 写入 HBM。无意义——只需要 loss 这一个标量。融合方案log_softmax NLL关键观察log(softmax(x))等价于x - logsumexp(x)——不需要显式计算 softmax不需要存中间矩阵。log_softmax(x_i) x_i - log(sum_j(exp(x_j))) loss -log_softmax(x)[target] -(x[target] - logsumexp(x)) logsumexp(x) - x[target]整个 forward 只需要一个 kernel不需要任何中间矩阵。// ops-nn/kernels/cross_entropy/cross_entropy_fused.cpp__aicore__voidCrossEntropyFusedKernel(GlobalTensorfloat16logits,// [B, V] 原始 logitsGlobalTensorint32targets,// [B] 正确类别索引GlobalTensorfloatlosses,// [B] 每个样本的 lossintB,intV,floatlabel_smoothing,// 标签平滑0.0 无平滑intignore_index// 忽略的 target 值默认 -1 不忽略){// 每个 block 处理一个 batch sampleintbblockIdx.x;// 检查是否忽略inttargettargets[b];if(targetignore_index){losses[b]0.0f;return;}// 步骤 1找到 logits 的最大值logsumexp 的稳定化 floatmax_val-INFINITY;// 向量化加载一次读 4 个 float16 → 2 个 float32 lanefor(intvthreadIdx.x;vV;v256){floatvalfloat(logits[b*Vv]);if(valmax_val)max_valval;}// Warp reduce256 lane → 1 个 max_val#pragmaunrollfor(intoffset128;offset0;offset1){floatother__shfl_xor(max_val,offset);if(othermax_val)max_valother;}// 步骤 2计算 logsumexp floatsum_exp0.0f;for(intvthreadIdx.x;vV;v256){floatvalfloat(logits[b*Vv]);sum_expexpf(val-max_val);// 减去 max 防溢出}// Warp reduce sum#pragmaunrollfor(intoffset128;offset0;offset1){sum_exp__shfl_xor(sum_exp,offset);}floatlogsumexpmax_vallogf(sum_exp);// 步骤 3取出 target 位置的 logit floatlogit_targetfloat(logits[b*Vtarget]);// 步骤 4计算 loss // 无 label smoothing: loss logsumexp - logit_target// 有 label smoothing: loss (1-α) × (-log_softmax(target))// α × mean(-log_softmax(all_classes))floatnlllogsumexp-logit_target;// NLL loss on targetif(label_smoothing0.0f){// label smoothing: 把概率质量 α 均匀分给 V-1 个其他类// loss (1-α) × nll α × sum(-log_softmax(x_j)) / (V-1)floatsmooth_sum0.0f;for(intvthreadIdx.x;vV;v256){if(v!target){floatvalfloat(logits[b*Vv]);smooth_sumlogsumexp-val;// -log_softmax(x_j)}}#pragmaunrollfor(intoffset128;offset0;offset1){smooth_sum__shfl_xor(smooth_sum,offset);}floatsmooth_termsmooth_sum/(V-1);losses[b](1.0f-label_smoothing)*nlllabel_smoothing*smooth_term;}else{losses[b]nll;}}反向传播不需要存储注意力矩阵——只需要计算 logits 的梯度d(logits)_i softmax(logits)_i - 1[i target] exp(logits_i - logsumexp) - 1[i target]每个 logit 的梯度 softmax 值 - 是否为目标类。不需要额外的内存——softmax 值计算出来就用了不存储。// ops-nn/kernels/cross_entropy/cross_entropy_backward.cpp__aicore__voidCrossEntropyBackwardKernel(GlobalTensorfloat16logits,// [B, V] 前向 logits保留GlobalTensorint32targets,// [B]GlobalTensorfloatdloss,// [B] 上游 loss 梯度通常是 1.0/BGlobalTensorfloat16dlogits,// [B, V] logits 梯度intB,intV,intignore_index){intbblockIdx.x;inttargettargets[b];if(targetignore_index){for(intvthreadIdx.x;vV;v256){dlogits[b*Vv]float16(0.0f);}return;}floatgrad_scaledloss[b];// 上游损失梯度// 步骤 1计算 max_val 和 logsumexp和 forward 一样floatmax_val-INFINITY;for(intvthreadIdx.x;vV;v256){floatvalfloat(logits[b*Vv]);if(valmax_val)max_valval;}#pragmaunrollfor(intoffset128;offset0;offset1){floatother__shfl_xor(max_val,offset);if(othermax_val)max_valother;}floatsum_exp0.0f;for(intvthreadIdx.x;vV;v256){sum_expexpf(float(logits[b*Vv])-max_val);}#pragmaunrollfor(intoffset128;offset0;offset1){sum_exp__shfl_xor(sum_exp,offset);}// 步骤 2d(logits)_i softmax(x_i) - 1[itarget]// exp(x_i - max) / sum_exp - (itarget ? 1 : 0)for(intvthreadIdx.x;vV;v256){floatsoftmax_valexpf(float(logits[b*Vv])-max_val)/sum_exp;floatgradsoftmax_val-(vtarget?1.0f:0.0f);dlogits[b*Vv]float16(grad*grad_scale);}}融合 vs 非融合性能对比Ascend 910 NPUFP16V32000B2048 | 方法 | Kernel Launch | HBM 读 | HBM 写 | 延迟 | |------|-------------|--------|--------|------| | 非融合 (3 kernels) | 3 | 3×B×V | 2×B×V | 142 μs | | 融合 (1 kernel) | 1 | 1×B×V | B×1 | 52 μs | | 加速比 | 3× | 3× | 131K×| 2.73×| 反向传播 | 非融合 | 3 | 4×B×V | 3×B×V | 216 μs | | 融合 | 1 | 2×B×V | B×V | 78 μs | | 加速比 | 3×| 2× | 3× | 2.77×|融合节省的不只是 2.73× 计算时间——最关键的节省不再有 262MB 的 probs 和 log_probs 矩阵。这两个矩阵在非融合版本中无意义地挤占了 HBM限制了 batch size。踩坑一exp 溢出→logsumexp 返回 inflogits 可以达到 ±88FP16 最大值 65504→ log(65504) ≈ 11。但量化后的 logits 可能更大。如果不做 max 归一化// ❌ 无 max 归一化 → exp(100) INF in FP32, overflow in FP16floatsum_exp0;for(intv0;vV;v){sum_expexpf(float(logits[v]));// logit100 → exp(100)INF → lossNaN}// ✅ logsumexp trickfloatmax_valmax(logits);// 100floatsum_exp0;for(intv0;vV;v){sum_expexpf(float(logits[v])-max_val);// exp(0)1 → safe}floatlogsumexpmax_vallogf(sum_exp);// 100 log(32000) ≈ 100 10.4 110.4exp(x-max) 的值域最大值 1当 xmax最小值 exp(-range)。range 最大 ~88FP16→ exp(-88) ≈ 1.5e-39subnormal 但不溢出。安全。踩坑二logf(0) → -infV 很大时32000sum_exp 涉及 32000 个 exp(max_lag - max_val) 的累加。如果 max_val 被 FP16 截断偏大正确 max 85.1234 → exp(0) 31999×exp(≈-0.0001) ≈ 1 31999×0.9999 ≈ 32000 错误 max 85.5 → exp(0) 31999×exp(-0.3766) ≈ 1 31999×0.686 ≈ 21953差值 ~30%—累积到 32000 次 → sum_exp 可能被 FP32 舍入为 0。// ❌ FP32 累加 32000 个 exp(-large) → 可能舍入为 0floatsum_exp0.0f;for(intv0;v32000;v){sum_expexpf(val-max_val);// 如果全接近 0 → FP32 累加可能不更新}floatlogsumexpmax_vallogf(sum_exp);// log(0) -inf → 全错// ✅ Kahan 求和——补偿舍入误差floatsum_exp0.0f;floatcompensation0.0f;// Kahan 补偿项for(intv0;v32000;v){floatyexpf(val-max_val)-compensation;floattsum_expy;compensation(t-sum_exp)-y;// 舍入误差的估计sum_expt;}// 总误差从 ~1e-6 → ~1e-12v32000 时踩坑三label_smoothing 的梯度没除以 Vlabel smoothing 的反向传播目标类被 soft 化——不是 100% 概率给 target而是 (1-α) 给 target α/(V-1) 给每类。前向正确但反向忘记处理 → 梯度偏了。// ❌ label smoothing 反向只减了 target 的贡献floatgradsoftmax_val-(vtarget?(1.0f-label_smoothing):0.0f);// 少了其他类的 label_smoothing/(V-1) 贡献// ✅ label smoothing 反向完整floatgradsoftmax_val;grad-(vtarget)?(1.0f-label_smoothing):(label_smoothing/(V-1));// 所有类都有 dloss × (softmax - smoothed_target) 的梯度实测label_smoothing0.1反向少处理 → loss 在 1000 步后比正确实现高 0.02。V32000 时单类的贡献 α/(V-1) ≈ 0.1/31999 ≈ 3.1e-6——微小但 32000 类累加后不可忽略。交叉熵融合的精髓log_softmax 不需要显式算 softmax。一个公式logsumexp(x) - x[target]解决了 3 次 kernel launch 262MB 中间数据。关键logsumexp trick 防 exp 溢出、Kahan 求和防 FP32 舍入、label smoothing 的正确反向传播。每个 token 省 38PB HBM 写入——300B token 训练下是按天计算的差距。

相关文章:

昇腾CANN ops-nn 交叉熵损失的融合优化:从三次 Kernel Launch 到一次

语言模型每一层的损失计算:logits → softmax → log → 取 target 位置的负值。标准做法三次 kernel launch:softmax kernel → log kernel → NLL kernel。三次 HBM 往返,中间存两个 NV 矩阵(V 是词表大小,LLaMA 是 …...

昇腾CANN ops-nn RMSNorm:为什么 LLaMA 和 Mistral 都用它替代 LayerNorm

LayerNorm 做两件事:减均值(center)、除标准差(scale)。RMSNorm 只做一件:除 RMS。丢掉均值减法——省了 30% 计算,训练效果几乎一样。LLaMA、Mistral、Gemma 全系标配。 RMSNorm 的公式&#x…...

昇腾CANN ops-transformer FlashAttention 反向传播:不存 Attention 矩阵怎么求梯度

FlashAttention 前向传播的精髓:不存 NN 的 attention 矩阵,只存 O(N) 的输出和 softmax 归一化因子。反向传播时,需要 attention 矩阵来计算梯度——但矩阵没存。解法:重新算一遍。用额外的计算换显存——这是典型的 compute-for…...

在node js后端服务中集成taotoken实现多模型智能客服响应

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在 Node.js 后端服务中集成 Taotoken 实现多模型智能客服响应 构建一个在线客服系统时,一个核心挑战是如何平衡响应质量…...

通过Taotoken的Token Plan套餐实现项目成本的可预测与精细控制

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Taotoken的Token Plan套餐实现项目成本的可预测与精细控制 对于有长期、稳定大模型调用需求的团队而言,项目预算的…...

现在停用默认filter_config将导致合规风险!DeepSeek最新CVE-2024-7812漏洞预警及3小时紧急加固方案

更多请点击: https://codechina.net 第一章:DeepSeek敏感信息过滤 DeepSeek系列大模型在企业级部署中,需严格遵循数据安全与隐私合规要求。敏感信息过滤(Sensitive Information Filtering, SIF)是其推理链路中关键的前…...

DeepSeek免费额度怎么用才不浪费?资深MLOps工程师的6小时压测报告与最优请求批处理公式

更多请点击: https://kaifayun.com 第一章:DeepSeek免费额度怎么用才不浪费?资深MLOps工程师的6小时压测报告与最优请求批处理公式 在连续6小时、覆盖12种负载模式的真实压测中,我们发现DeepSeek API免费额度(当前为1…...

DeepSeek监控告警设置实战指南(告警失效率下降92%的7个关键开关)

更多请点击: https://kaifayun.com 第一章:DeepSeek监控告警设置的核心价值与落地挑战 在大模型推理服务规模化部署的背景下,DeepSeek系列模型(如DeepSeek-V2、DeepSeek-Coder)对资源稳定性、延迟敏感性及异常响应时效…...

Google 广告场景下 Uniswap 钓鱼攻击机理与 Web3 防御体系研究

摘要 2026 年 5 月 22 日,GoPlus 安全团队发布预警,针对 Web3 领域头部去中心化交易平台 Uniswap 的搜索引擎钓鱼攻击呈规模化爆发态势。攻击者通过购买 Google Ads 关键词广告,将高仿钓鱼网站置顶于搜索结果前列,结合视觉相似域名…...

人机协同闭环:AI 时代邮件安全 “人在回路” 防御体系研究

摘要 2026 年,生成式 AI 全面渗透网络钓鱼攻击链,攻击从批量群发转向精准定制、从静态模板转向动态逃逸,传统纯技术防护出现显著盲区。数据显示,AI 自动化鱼叉式钓鱼点击率达 54%,攻击从投放至全面入侵的窗口压缩至秒级…...

高校邮件安全体系升级与 Proofpoint 部署实践研究 —— 以特拉华大学为例

摘要:随着网络钓鱼、垃圾邮件与恶意邮件攻击持续威胁高校信息系统,电子邮件安全已成为校园网络防护的核心环节。特拉华大学自 2026 年 6 月 1 日起全面启用 Proofpoint 邮件安全平台,构建覆盖邮件过滤、威胁隔离、用户自助处置与安全运营的全…...

Kali365 设备代码钓鱼攻击机理、危害及防御体系研究

摘要 2026 年 5 月 FBI 发布预警,新型钓鱼即服务平台 Kali365 通过滥用 Microsoft 365 OAuth 2.0 设备代码授权流程,可在不窃取密码、不伪造登录页面的前提下绕过多因素认证,获取长期有效访问令牌,实现账户持久化控制。该平台依托…...

基于 OAuth 设备码流滥用的 Kali365 钓鱼攻击机理与防御体系研究

摘要 2026 年 5 月,美国联邦调查局(FBI)发布安全预警,披露针对 Microsoft 365 环境的 PhaaS 平台 Kali365 正通过滥用 OAuth 设备码认证流程实施规模化钓鱼攻击,可绕过多因素认证(MFA)窃取合法访…...

为什么92%的DeepSeek微调失败?资深架构师拆解3类致命配置错误及实时诊断命令

更多请点击: https://kaifayun.com 第一章:DeepSeek模型微调失败率的行业现状与根本归因 近年来,DeepSeek系列大模型(如DeepSeek-V2、DeepSeek-Coder)在开源社区和企业私有化部署中广泛应用,但实证调研显示…...

【ChatGPT故事化表达黄金法则】:20年AI内容专家亲授3步叙事框架,让提示词转化率提升300%

更多请点击: https://intelliparadigm.com 第一章:ChatGPT故事化表达的底层认知革命 传统人机交互长期受限于指令式范式——用户需精确编码意图,系统则机械匹配关键词或规则。ChatGPT 的突破性不在于参数规模,而在于其将语言建模…...

C++学习笔记26:static 静态成员

目录 一、为什么需要静态成员? 二、静态成员变量 三、静态成员变量需要类外定义 四、用静态成员变量统计对象个数 五、静态成员变量不占对象空间 六、静态成员函数 七、静态成员函数没有 this 指针 八、静态成员函数可以访问静态成员 九、调用方式 1. 通过…...

【限时解锁】Gemini深度研究模式私有化部署方案:仅3家头部科研机构掌握的本地化推理链配置

更多请点击: https://codechina.net 第一章:Gemini深度研究模式的核心原理与能力边界 Gemini深度研究模式并非简单增强上下文长度的推理机制,而是一种面向复杂知识密集型任务的分层式认知架构。其核心原理在于动态构建“问题-证据-推理”三元…...

【Gemini生命周期价值深度解码】:20年AI架构师亲授5大阶段ROI测算模型与避坑指南

更多请点击: https://intelliparadigm.com 第一章:Gemini生命周期价值分析 Gemini 模型的生命周期价值(LTV)不仅体现在其推理性能与多模态能力上,更贯穿于从模型部署、持续微调、监控反馈到迭代升级的完整闭环。相较于…...

【ChatGPT投资人邮件撰写黄金法则】:20年FA/VC顾问亲授——3类高回复率模板+5个致命话术雷区

更多请点击: https://codechina.net 第一章:ChatGPT投资人邮件撰写的核心认知与底层逻辑 投资人邮件不是信息的简单堆砌,而是认知对齐、信任构建与决策催化三重目标的高度凝练表达。其底层逻辑根植于风险投资行业的决策机制——LP关注资金效…...

ChatGPT移动端隐私红线报告(2024Q2):麦克风/剪贴板/位置数据采集路径全曝光,3步彻底锁死敏感权限

更多请点击: https://intelliparadigm.com 第一章:ChatGPT移动端隐私红线报告(2024Q2)核心发现与风险定级 高危数据外泄通道实证 本季度对iOS与Android平台主流ChatGPT客户端(含官方App v6.12.1及第三方封装SDK集成应…...

【小红书算法偏爱的文案结构】:ChatGPT无法自学的3层语义嵌套技巧(含2024Q2平台最新流量权重白皮书节选)

更多请点击: https://kaifayun.com 第一章:小红书算法偏爱的文案结构本质解构 小红书的推荐算法并非仅依赖关键词或标签匹配,其核心是通过多模态语义理解与用户行为反馈闭环,对文案的信息密度、情绪节奏和结构可读性进行加权评估…...

新手注册Taotoken后第一步如何获取并测试API Key

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 新手注册Taotoken后第一步如何获取并测试API Key 注册Taotoken平台后,您已经拥有了一个统一的入口来调用多种大模型。接…...

Taotoken的Token Plan套餐如何帮助初创公司控制AI实验成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken的Token Plan套餐如何帮助初创公司控制AI实验成本 1. 成本不可预测:初创AI实验的常见困境 在产品原型和早期开…...

如何为嵌入式项目配置大模型API调用使用Taotoken与Python

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何为嵌入式项目配置大模型API调用使用Taotoken与Python 对于嵌入式或物联网开发者而言,在资源受限的开发环境中集成A…...

创业团队如何利用Taotoken统一管理多个AI应用API成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 创业团队如何利用Taotoken统一管理多个AI应用API成本 对于同时开发多个集成AI功能的初创公司而言,技术选型与快速迭代是…...

对比按量计费与Token Plan套餐如何为项目选择更优成本模型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比按量计费与Token Plan套餐如何为项目选择更优成本模型 在将大模型能力集成到开发项目中时,成本控制是一个绕不开的…...

3步构建物联网数字孪生:Eclipse Ditto实战指南

3步构建物联网数字孪生:Eclipse Ditto实战指南 【免费下载链接】ditto Eclipse Ditto™: Digital Twin framework of Eclipse IoT - main repository 项目地址: https://gitcode.com/gh_mirrors/ditto6/ditto 在物联网(IoT)时代,如何高效管理成千…...

凸轮机构设计(黄老板)

1. 2. 3....

通过curl命令快速测试Taotoken不同模型的响应速度与效果

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过curl命令快速测试Taotoken不同模型的响应速度与效果 对于习惯使用命令行工具的技术人员来说,curl是一个直接且高效…...

Solr CVE-2019-0193漏洞深度解析:DataImportHandler远程代码执行原理与实战修复

1. 这个漏洞不是“能远程执行代码”那么简单,而是Solr管理员自己亲手打开的后门 Apache Solr 是企业级搜索领域绕不开的基础设施,我经手过的金融、电商、政务类项目里,有七成以上都用它做全文检索底座。但2019年爆出的 CVE-2019-0193&#xf…...