基于昇腾进行Glm5.1模型swa算子接入优化 ​作者​昇腾实战派​知识地图​https://blog.csdn.net/Lumos_Lovegood/article/details/161601003背景概述在昇腾AI处理器的模型推理与训练场景中FlashAttention算子npu_fusion_attention是Transformer类模型的核心组件。该算子同时封装了前向与反向计算逻辑但在某些业务场景下我们需要将前向与反向逻辑解耦以便更灵活地控制计算流程。此外针对长序列场景如序列长度超过16K需要引入滑动窗口注意力Sliding Window Attention机制以降低计算复杂度。本文以Atlas 800I A2设备为例基于Ascend op-plugin仓库详细介绍了如何将FlashAttention算子拆分为独立的前向与反向函数并实现支持稀疏模式SparseMode为0和4的滑动窗口注意力算子。1. 需求分析1.1 代码梳理原始FlashAttention算子的实现位于以下文件中https://gitcode.com/Ascend/op-plugin/tree/7.3.0/op_plugin/ops/opapi/FlashAttentionKernelNpuOpApi.cpp该文件包含三个核心函数其作用如下表所示符号作用npu_fusion_attention前向函数内部调用aclnnFlashAttentionScore或aclnnFlashAttentionVarLenScore返回(attention_score, softmax_max, softmax_sum, softmax_out, seed, offset, numels)npu_fusion_attention_grad“高层”反向函数根据seed/offset/numels等参数生成dropout mask再调用底层反向函数npu_fusion_attention_backward“底层”反向函数调用aclnnFlashAttentionScoreGrad/UnpaddingScoreGrad注意npu_fusion_attention_grad末尾会调用npu_fusion_attention_backward。代码文件中存在三对上述函数通过#if VERSION_BETWEEN宏区分不同版本。1.2 目标实现路径我们需要将torch_npu.npu_fusion_attention()算子入口拆分为独立的前向和反向函数具体步骤如下克隆op-plugin代码仓库新建代码文件SlideWindowsAttentionKernelNpuOpApi.cpp添加swa_forward和swa_backward函数将SparseMode限制为0和4两种模式具体含义参考后表在op_plugin/config/op_plugin_functions.yaml中添加对应的函数声明编写CI测试用例验证函数功能1.3 SparseMode说明SparseMode枚举定义如下enumclassSparseMode{NO_MASK0,ALL_MASK,LEFT_UP_CAUSAL,RIGHT_DOWN_CAUSAL,BAND,PREFIX,PREFIX_COMPRESS,RIGHT_DOWN_CAUSAL_BAND,BAND_LEFT_UP_CAUSAL};其中模式0表示无mask模式4BAND表示使用pre_tockens与next_tockens控制窗口的滑动窗口mask。本实现仅需支持这两种模式无需关注底层AscendC算子的具体实现。2. 编译安装这个需求需要编译 op-plugin 这个库。先拉取CANN镜像dockerpull swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.5.2-910b-ubuntu22.04-py3.11启动容器NAMEcann8.5-testDEVICES0,1,2,3,4,5,6,7IMAGEswr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.5.2-910b-ubuntu22.04-py3.11dockerrun-itd-u0--ipchost--privileged\-eVLLM_USE_MODELSCOPETrue-ePYTORCH_NPU_ALLOC_CONFmax_split_size_mb:256\-eASCEND_RT_VISIBLE_DEVICES$DEVICES\--name$NAME\--nethost\--device/dev/davinci_manager\--device/dev/devmm_svm\--device/dev/hisi_hdc\--shm-size1200g\-v/usr/local/dcmi:/usr/local/dcmi\-v/usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool\-v/usr/local/bin/npu-smi:/usr/local/bin/npu-smi\-v/usr/local/bin/ais_bench:/usr/local/bin/ais_bench\-v/usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/\-v/usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info\-v/etc/ascend_install.info:/etc/ascend_install.info\-v/etc/hccn.conf:/etc/hccn.conf\-v/root/.cache:/root/.cache\-v/home/m30071636/:/home/m30071636/\--privilegedtrue\-it$IMAGEbash下载对应OpPlugin版本分支代码进入插件根目录以v2.7.1为例。gitclone--branch7.3.0 https://gitcode.com/ascend/op-plugin.gitcdop-pluginpython安装依赖torch以2.7.1为例子pipinstalltorch2.7.1 pyyaml numpy attrs decorator psutil scipy执行编译构建当前支持torch_npu 2.6.0/2.7.1/2.8.0/2.9.0版本下述命令中v2.7.1-7.3.0表示匹配OpPlugin仓7.3.0版本的PyTorchv2.7.1的分支名。bashci/build.sh--python3.11--pytorchv2.7.1-7.3.0编译好之后会显示.... adding torch_npu.egg-info/PKG-INFO adding torch_npu.egg-info/SOURCES.txt adding torch_npu.egg-info/dependency_links.txt adding torch_npu.egg-info/entry_points.txt adding torch_npu.egg-info/requires.txt adding torch_npu.egg-info/top_level.txt adding torch_npu-2.7.1.post3.dist-info/METADATA adding torch_npu-2.7.1.post3.dist-info/WHEEL adding torch_npu-2.7.1.post3.dist-info/entry_points.txt adding torch_npu-2.7.1.post3.dist-info/top_level.txt adding torch_npu-2.7.1.post3.dist-info/RECORD removing build/bdist.linux-aarch64/wheel完成编译后安装dist目录下生成的插件torch_npu包pip3install--upgradedist/torch_npu-{torch_npu_version}-{Python_version}-{arch}.whl3. 代码修改找到#if VERSIONBETWEEN(V2R2, VERSIONNEWEST)块修改npu_fusion_attention改名为swa_forwardnpu_fusion_attention_grad改名为swa_backward另外sparse_mode只能是0和4加上两个函数内加上校验TORCH_CHECK(sparse_mode 0 || sparse_mode 4, The sparse_mode value should be 0 or 4, but got , sparse_mode, OPS_ERROR(ErrCode::PARAM));再加上特殊业务需求T大于16Ksparse_mode 4int64_t B 0; int64_t S0 0; // S for query int64_t S1 0; // S for key value int64_t N_local 0; // N for npu_fusion_attention int64_t D 0; int64_t H 0; int64_t T 0; int64_t D2 0; // D2 for value head-dim c10::SmallVectorint64_t atten_score_shape; if (input_layout_str TND) { T query.size(0); if (T 16 * 1024) { sparse_mode 4; // set sparse_mode to 4 when sequence length is greater than 16K in TND layout, which means using high-precision kernel } N_local query.size(1); D query.size(THIRD_ELEMENT); D2 value.size(THIRD_ELEMENT); atten_score_shape {T, N_local, D2}; }

相关新闻

最新新闻

COM+编程实战解析:事务、对象池与遗留系统维护关键指南

COM+编程实战解析:事务、对象池与遗留系统维护关键指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/2 17:58:48
YOLOv8模型剪枝实战:从稀疏化训练到边缘设备部署

YOLOv8模型剪枝实战:从稀疏化训练到边缘设备部署

简介:面向目标检测模型优化方向的开发者和研究者,这份压缩包提供基于 Ultralytics YOLOv8 的完整剪枝实现。包内不仅包含剪枝主脚本,还准备了多种网络结构 YAML 配置(如 GFPN、RepNCSPELAN、DyHead 等变体)、通道重要性…

2026/9/2 17:58:48
从10亿美元收入看Agent后训练范式:Handshake拆解真实工作环境的数据供应链重构

从10亿美元收入看Agent后训练范式:Handshake拆解真实工作环境的数据供应链重构

【摘要】校园招聘平台Handshake的AI训练业务在12个月内实现从0到10亿美元年化收入的增长,其覆盖300万用户的职业网络构成了Agent后训练时代的新型供给基础设施。当前顶尖大模型团队的预训练与后训练算力投入已趋近1:1,AI训练数据正从离散文本标注转向包含…

2026/9/2 17:58:48
AI 视频的账本:谁出钱、谁承担、谁先赚到钱 —— 基于 2026 年半年报的产业格局分析

AI 视频的账本:谁出钱、谁承担、谁先赚到钱 —— 基于 2026 年半年报的产业格局分析

【摘要】2026 年上半年国内新增 AI 短剧 22.19 万部,仅 0.48% 作品播放量破亿,1.3% 作品达到成本回收播放阈值;快手可灵 AI 上半年营收突破 15 亿元,B 站 AI 行业广告收入二季度同比增长超 100%。生成式人工智能内容(A…

2026/9/2 17:58:48
《Orange‘s》随书光盘实践指南:从引导扇区到内核调试

《Orange‘s》随书光盘实践指南:从引导扇区到内核调试

简介:《Oranges:一个操作系统的实现》随书光盘是一份面向操作系统初学者的学习资料包,围绕进程管理、内存管理、中断处理、文件系统等关键概念,提供配合图书阅读的源码与实验材料,帮助读者通过实际操作理解理论。压缩包…

2026/9/2 17:58:48
国产操作系统推荐:从电力核心到航天测发,解析一家深耕关键领域的专业厂商

国产操作系统推荐:从电力核心到航天测发,解析一家深耕关键领域的专业厂商

一、国家级工程验证下的操作系统厂商发展路径1. 依托实体与资质认证体系湖南麒麟信安科技股份有限公司(股票代码:688152)作为国家发改委批复的高可信操作系统国家地方联合工程研究中心的依托实体,其发展路径与国家级科研项目深度绑…

2026/9/2 17:53:48