股票
板块
用户
资讯
首页
天眼
自选
发现
开户
首页
天眼
自选
发现
我的

一条指令把FlashAttentionScore从昇腾910系列迁到昇腾950系列,提速2.3倍

昇腾950系列产品发布之后,算子开发者最先遇到的挑战,往往是如何把已经在昇腾910系列上稳定运行的算子迁移到新平台:既要保障跨代兼容,又希望顺势使能昇腾950系列的新特性。

950系列相比910系列的差异,是Cube侧与Vector侧相互正交的一整套变化:

分形布局:L0A分形布局从ZZ变成NZ,数据装载需要随之调整

Cube通路参数:Fixpipe的回写参数需按FixpipeParamsArch3510重配

跨核同步:即便模式号相同,语义也可能不同,须逐个同步点盘点

数值行为:950系列裁剪了subnormal,Exp、Ln、Sqrt、Div、Reciprocal、Rsqrt在subnormal区间会掉精度

与此同时,950系列也带来了一批新特性,迁移过程中可以一并使能:

Fixpipe直通:Mmad结果从L0C直接回写UB,不必再经GM中转

RegBase寄存器编程:Vector侧热点路径在寄存器里完成计算,少走UB读写

SIMT编程模型:Scatter/Gather类算子可按线程级并行改写,并行度更高

通路增强:通路上新增AIC与AIV直通,同步模式也有变化,协同粒度更细

这些差异和新特性散落在几百篇API文档里,靠人工通读再逐个算子改造,周期以周计。

为此,我们借助Agent的能力,将复杂的跨代迁移流程固化为标准工作流并在CANNBot Skills中沉淀了ascendc-cross-gen-migration,一条面向Ascend C算子的跨代迁移流水线。

本文以FlashAttention正向算子flash_attention_score(CANN ops-transformer仓)为迁移案例,演示ascendc-cross-gen-migration的使用方式。迁移结果:30个性能用例全部在昇腾950系列更快,平均加速比2.3倍,40个精度用例全部通过。

30例加速比与两侧耗时

ascendc-cross-gen-migration能力概览
特点:直接迁移你优化好的代码

一个在910系列上运行已久的算子,其中的Tiling取舍、边界处理、性能调优,都是长期迭代沉淀下来的经验。基于它改造,这些经验不会丢失。流程上不必从零走一整套完整的生成与验证环节,启动快。改造过程中同步解决跨代兼容问题,并进一步使能950系列的新硬件特性。

该Skill也不要求预先准备golden,精度标杆会由Agent逆向算子源码自合成,并支持与迁移后的计算结果互检。

适用场景:已有在910系列上稳定运行的算子,希望尽快迁移到950系列,并启用新特性。

六阶段流水线

整个迁移分为六个阶段,从环境验证到性能验证,每阶段输出Gate Token后进入下一阶段。

六阶段流水线

三档定级:按算子特征匹配改造力度

不同算子的迁移成本差异很大,用同一套力度改造既不经济也没必要。阶段1会先按算子特征定档:

L1 基础适配面向对性能不敏感的一般算子。改动最小,只做API与编译适配。

L2 RegBase重写面向值得下功夫深挖的算子,比如:

  • 模型里跑得最多、最影响整体耗时的那批(Softmax、RMSNorm、Attention、Matmul这类)

  • 涉及低精度量化、需要频繁进行数据类型转换的(例如FP32转FP8或INT8)

  • 需要精确控制数值溢出行为的

改造上,Vector侧做RegBase MicroAPI重写;Cube类算子再叠加AIC低阶直跑与同步协议重写。

L3 SIMT优化面向Scatter/Gather这类按索引搬运数据的算子,特征是索引逻辑简单、不需要UB中转、线程并行度高。改造上改用SIMT编程模型,充分利用线程级并行度。

无论定在哪一档,950系列API差异扫描都是必做项,覆盖三个维度:

精度维度:950系列裁剪了subnormal,Exp、Ln、Sqrt、Div、Reciprocal、Rsqrt这类基础算术在近零区间会掉精度;同时还要检查eps一类的常量,在目标dtype下是否还表示得出来

兼容性维度:Mmad不接受int4,量化matmul要按规范先转成int8

性能维度:vnchwconv、VSLDB在950系列上的吞吐特性变了,需要针对高风险shape(R=16/24、小tile、非连续stride)专门设计回归用例,而非使用平均随机shape简单带过


Cube类算子:额外加载Cube迁移指南

判断一个算子是否属于Cube类,只需看kernel中是否使用了Mmad、LoadData、Fixpipe这类Cube指令。

这类算子除了按三档定级走主线,还需额外加载一份Cube迁移指南。Cube数据通路、分形布局、跨核同步这三块差异与Vector侧截然不同,需要单独处理。该指南只覆盖AIC侧,AIV侧仍沿用层级指南的既有经验,两者叠加使用。

Cube数据通路

实战案例:FlashAttentionScore迁移昇腾950系列
案例背景

FlashAttention是Transformer训练中的核心算子。flash_attention_score本身计算密集,在此之上还覆盖了GQA、滑窗注意力、pse位置编码、dropout、显式mask等大量可选形态,以及FP16、BF16、FP32多种数据类型,形态组合完整。

同时它属于典型的Cube类算子。从分形装载到跨核同步,950系列的Cube低阶直跑通路每一环都会涉及。

环境准备与安装

验证在两台真机上完成:迁移目标的950系列,和跨代对比性能的910系列。

skill位于CANNBot Skills的ops/ascendc-cross-gen-migration下,支持OpenCode、Claude Code、CodeArts。以OpenCode为例:

git clone https://gitcode.com/cann/cannbot-skills.gitcd cannbot-skills

然后使用自然语言让opencode为我们装载ops/ascendc-cross-gen-migration及相关的Skills和依赖

启动迁移:一句自然语言指令即可

安装完成后无需记忆命令,直接用自然语言描述需求即可。整个迁移的起点就是这一句:

依据CANNBot中跨代迁移skill实现ops-transformer/attention/flash_attention_score从910系列到950系列的迁移

启动之后全程免交互自动推进:六个阶段按门禁依次执行,中间无需人工逐步确认。流程结束后直接产出精度验证报告与950系列侧的性能评估。跨代对比所需的910系列性能基线由用户另行提供,不影响流程推进。

关键阶段详解

六个阶段各司其职,这里展开与本次案例最相关的环节。

阶段1评估定级:flash_attention_score属于模型里调用最频繁、最影响整体耗时的Cube类算子,因此定级L2。Cube侧走AIC低阶直跑+同步协议重写,AIV侧做RegBase评估;同时完成950系列API三类差异扫描。

阶段2代码改造:产出950系列版Cube kernel与AIV侧Vector路径。核心是三件事:数据布局转NZ分形后送入L1、按950系列的分形参数配置L0A、L0B装载、用Fixpipe把Mmad结果从L0C直接回写UB;再按模式4协议编排AIC与AIV的跨核同步。

阶段3编译安装:用统一的build_and_install.sh完成构建与安装(--soc=ascend950),无需手工拼接编译命令。

阶段4精度验证:没有现成的真值参照,由Agent逆向算子源码自合成CPU精度标杆,再与950系列实测结果双向互检。

阶段5性能验证:采集950系列上的性能数据并生成评估报告,共30个用例;跨代对比所需的910系列基线由用户随后提供。

迁移效果

效率:一条指令,端到端一次跑通。从下达指令到产出精度与性能报告,全流程自动推进,无人工介入环节。本次端到端耗时8.5小时(含构建安装、40例精度验证、30例性能采集)。

精度:40个用例一次通过。判定依据昇腾生态算子精度标准(混合容差,rtol、atol双门限)。40个用例全部PASS,输出匹配率100%,两轮复跑结论一致(均40/40通过)。误差按算子的三个输出分别统计:out为注意力结果,smax、ssum为softmax统计量。

其中subnormal用例(FP16/FP32)的smax、ssum与CPU标杆逐位一致(误差0)。

40例精度套件终端输出

覆盖以下场景:

  • 数据类型:FP16、BF16、FP32

  • 数据排布:BSH、SBH、BSND、BNSD、TND

  • 注意力形态:MHA、GQA、解码、滑窗注意力、因果掩码

  • 序列长度:非对齐长度的尾块、512×512大shape、需切分处理的超长序列

  • 可选特性:pse位置编码、dropout、显式mask(bool、uint8、全掩码行等)

  • 数值边界:subnormal次正规数、invalidline

性能:相对910系列平均2.3倍。30个性能用例全部可比,30/30全部950系列更快,平均加速比2.3倍(中位2.4倍,最高2.9倍)。逐例耗时与加速比见前文图(含两侧绝对耗时)。

硬件利用率:大shape用例的Cube MAC利用率达到0.95以上,流水已基本占满。

大shape用例硬件利用率

本次使能的昇腾950系列产品新特性

这次迁移没有停留在"能跑"层面,对Cube数据通路做了整体重写,共使能5项昇腾950系列新硬件特性。

Fixpipe L0C→UB直通是其中最有代表性的一项:910系列上Mmad结果需经GM中转再搬回UB,950系列上Fixpipe可一步直达UB。bmm1(Q·K?)与bmm2(P·V)的结果都走这条直通路径。

Fixpipe直通

其余四项特性:

Cube低阶直跑:装载、乒乓与切块按dtype定制,也是跨核流水与片上驻留得以实施的前提;

跨核流水协同:AIC通过Fixpipe将Cube输出分发到双AIV的UB,双AIV全程参与计算,计算与搬运重叠;

数据驻留片上:Q常驻L1,中间结果走L0C→UB片上通路,省去GM往返;

RegBase寄存器编程:热点路径少走UB读写,Vector吞吐更高。

另有两项950系列硬件约束的适配:L0A、L0B缓冲容量变小,需按950系列容量重排分块与乒乓缓冲数;950系列裁剪了subnormal,迁移后次正规数用例仍与标杆逐位一致。

总结与展望

回顾本次迁移:40个精度用例一次通过,30个性能用例全部快于昇腾910系列,平均加速2.3倍。

结果之外,流程本身的变化同样值得关注。以往跨代迁移高度依赖开发者个人经验,迁移过程中踩到的坑往往只有开发者自己清楚,迁移经验难以复制。ascendc-cross-gen-migration将这条链路拆分为六个带门禁的阶段,每阶段以Gate Token为明确放行依据,经验直接沉淀到流程中,后续迁移其他算子时可以直接复用。

950系列的特性也尚未用尽。L0C驻留复用、softmax计算主链的整体RegBase化,仍有进一步挖掘的空间,后续将陆续补充。

代码仓:https://gitcode.com/cann/cannbot-skills

Skill路径:ops/ascendc-cross-gen-migration

原文链接
多空观点 观点仅供交流,不构成投资建议
点赞
踩一踩
收藏
分享

评论 (0)

0/200
声明:社区内容仅代表用户个人观点,不构成任何投资建议。投资有风险,入市需谨慎。