AscendCraft:基于领域专用语言引导转译的昇腾NPU算子自动生成框架

arXiv:2601.22760v1 [cs.DC] 2026年1月30日

作者

温忠振(南京大学新型软件技术国家重点实验室)
邵树迪(华为上海软件工程应用技术实验室)
李众(南京大学新型软件技术国家重点实验室)
葛宇(南京大学新型软件技术国家重点实验室)
徐彤彤(华为杭州软件工程应用技术实验室)
林元一(华为杭州软件工程应用技术实验室)
张田(南京大学新型软件技术国家重点实验室)

摘要

深度学习模型的性能高度依赖高效算子实现,但面向专用加速器开发高性能算子仍耗时耗力,且对开发者专业能力要求极高。现有研究证明大语言模型(LLM)可生成正确、高性能的GPU算子;但针对神经网络处理器(NPU)的算子生成领域仍缺乏充分探索——根源在于NPU具备领域专属编程模型、公开开发案例稀缺、配套文档匮乏。若直接使用大模型生成昇腾C(AscendC)算子,代码正确率极低,充分凸显了GPU与NPU算子自动生成领域存在巨大技术鸿沟。

本文提出AscendCraft:一套由领域专用语言(DSL)引导、全自动生成昇腾C算子的方案。该框架设计了一套轻量级DSL,在屏蔽底层冗余复杂逻辑的同时,显式建模昇腾硬件专属执行语义。整套流程分为两步:首先依托对应算子类别的专家示例,使用大模型生成DSL描述代码;再通过多轮约束驱动的大模型降级转译流程,将DSL代码转换为标准昇腾C代码。

本文基于MultiKernelBench基准套件,覆盖7大类算子完成评测:AscendCraft算子编译成功率达98.1%,功能正确率90.4%;其中46.2%生成算子性能持平或超越PyTorch eager模式基线,证明DSL引导转译方案可让大模型产出兼具正确性与性能竞争力的NPU算子。
除基准测试外,本文进一步验证了框架通用性:针对全新mHC架构的两类算子,AscendCraft均可生成正确实现,且性能大幅优于PyTorch eager执行模式。

关键词:大语言模型;昇腾;深度学习算子

1 引言

深度学习模型的性能由底层算子执行效率决定。开发高性能算子需要开发者深度理解硬件架构、存储层级与底层优化手段,整个过程人力成本极高;针对专用AI加速器开发算子的难度尤为突出——高性能实现需要精细调度数据搬运与片上硬件资源。

近年基于大语言模型自动生成算子代码的研究广受关注,但现有工作几乎全部聚焦GPU场景。GPU生态具备海量公开代码、完善文档、成熟编程体系,因此已有多项工作证实大模型可产出正确、高性能的CUDA/Triton算子。

与之形成鲜明对比,NPU算子自动生成领域仍存在大量空白。NPU编程模型高度定制化,公开开发案例稀少、配套文档零散,导致大模型难以充分学习NPU专属语法、执行模型与优化思路。MultiKernelBench基准测试数据显示:现有顶尖大模型直接生成昇腾C算子时,代码功能正确率不足5%,充分证明GPU与NPU算子生成存在难以逾越的技术鸿沟。

为解决该问题,本文提出AscendCraft——基于DSL引导的昇腾C算子全自动生成框架。框架核心是一套轻量级昇腾专属DSL,遵循三大设计原则:

  1. 简洁规整语法:DSL采用紧凑、规范的编程结构,消除冗余语法,强制清晰控制流。大模型可聚焦分块策略、数据流等核心算法设计,而非底层语法细节,同时生成代码简短、稳定性更强。
  2. 适度抽象封装:刻意屏蔽大幅增加开发负担、但不影响核心算子逻辑表达的硬件细节。例如昇腾C中非对齐内存访问需要冗长的DataCopyPad配置、大量参数,这类底层细节全部由DSL封装,简化生成流程且不损害代码正确性。
  3. 硬件定向扩展:显式建模昇腾特有执行语义,包含片上缓存分配(统一缓冲区UB)、分阶段执行(数据读入CopyIn、计算Compute、数据写出CopyOut)、多核并行执行结构,保证DSL足以表达高性能NPU算子设计思路。

整套方案分为两大阶段:
阶段一:DSL代码生成
大模型输出高层DSL程序,完整描述算子核心计算逻辑、分块策略、片上数据流。供给大模型的DSL示例均由行业专家编写,并按算子类别划分;同一类别算子共享计算模式与优化目标,示例会编码该类算子通用优化方案与执行逻辑。依托简洁规整的DSL,大模型能够学习同类算子的核心设计思路,并泛化适配同类别下未见过的算子参数。

阶段二:DSL转译昇腾C
通过多轮结构化、大模型驱动的降级流程,将DSL分步转换为昇腾C代码。拆分转换流程为多个定义清晰的子任务,降低每一步生成难度,提升代码正确性与鲁棒性。转译过程中对昇腾C代码结构施加强约束:DSL中每一段CopyIn/Compute/CopyOut代码块,都会映射为昇腾C中对应的AI核函数,强制固定执行结构,杜绝数据搬运与计算逻辑非法交错。

本文基于MultiKernelBench、7大类算子开展实验:
相较于直接用大模型生成昇腾C代码,本方案编译成功率与功能正确率大幅提升,整体编译通过率98.1%、功能正确率90.4%;生成算子性能对标PyTorch eager基线:82.7%算子性能达到基线20%以上,57.7%达到基线80%,46.2%性能持平或超越基线。

除基准测试外,本文针对全新mHC架构的两类真实算子开展验证:AscendCraft单次生成即可产出功能完全正确的实现,性能分别是PyTorch eager的6.6倍、3.0倍。开发者基于生成代码,搭配大模型辅助迭代调优后,最终实现性能分别达到基线的15.9倍、7.2倍。
上述结果证明:精心设计的DSL搭配结构化约束转译流水线,不仅能让大模型可靠生成NPU算子,也为新型业务场景下的性能调优提供坚实基础。

2 背景与问题动机

2.1 昇腾NPU硬件架构

昇腾是面向深度学习场景从头设计的专用神经网络处理器。

计算单元

昇腾核心计算部件为AI核(AICore),集成三类异构计算单元,分别适配不同运算:

  1. 标量单元(Scalar):负责标量数据处理、程序控制流;
  2. 向量单元(Vector):执行类SIMD向量运算,逐元素计算、归一化、激活、规约操作均在此完成;
  3. 矩阵单元(Cube):专门处理矩阵运算,单次执行即可完成M×K矩阵与K×N矩阵相乘。
    三类单元可并行工作,让昇腾在各类算子场景下保持硬件高利用率。
存储层级

昇腾采用多层级存储架构:全局内存GM、L1缓冲区、统一缓冲区UB、L0缓冲区(L0A/L0B/L0C)。硬件向软件完整暴露片上存储层级,开发者可显式控制数据存放与搬运,便于优化数据局部性、提升数据复用率。

数据搬运引擎MTE

数据传输由专用硬件模块MTE(内存传输引擎)管理。不同存储层级对应独立MTE单元:同一MTE内传输串行执行,跨MTE传输可并行,最大化带宽利用率。

指令流水线

昇腾采用显式指令流水线,实现计算与数据搬运重叠执行。计算、内存搬运均封装为独立指令,下发至标量/向量/Cube/MTE各自执行队列;单队列内指令有序执行,不同队列指令可并发运行。合理调度即可精细协调计算与数据传输,提升整体吞吐。

2.2 昇腾C(AscendC)编程模型

昇腾C是基于C++、面向昇腾NPU高性能算子开发的流水线编程模型,底层开放硬件能力,同时提供结构化抽象简化开发。

流水线执行模型

算子执行拆分为三段逻辑:CopyIn(全局内存→片上缓存)、Compute(硬件单元计算)、CopyOut(片上结果写回全局内存)。三段分离设计支持流水线、计算与数据搬运重叠,但开发者需要精细协调缓存占用、跨阶段数据依赖。
算子执行划分为多个Block,Block是最小逻辑执行单元;启动算子时指定Block数量,实现多核并行。同时提供SyncAll等同步原语,用于多核间协同。

张量与缓存管理

GlobalTensor代表全局内存张量,作为算子输入输出接口;LocalTensor代表片上缓存张量,包含UB、L1、L0系列缓存。
硬件强制开发者手动管理缓存分配与存放位置,UB等片上缓存存在严格硬件约束(如32字节对齐、尺寸粒度限制),开发者需要反复推导张量形状、分块参数、内存布局,大幅提升开发成本。

队列与数据依赖管理

为协调异构单元的数据搬运与计算,昇腾C采用队列机制管理依赖:硬件单元完成张量运算后将张量句柄入队,后续阶段出队读取数据,数据未就绪时自动阻塞。该机制显式表达依赖,无需开发者手动同步流水线;队列可扩容实现双缓冲等优化,但合理使用队列需要精心设计,保证执行顺序、最大化计算与传输重叠。

算子开发复杂度

昇腾C提供完整硬件接口:DataCopy搬运接口、Cube矩阵乘Mmad、向量运算Adds等。高性能算子需要开发者跨流水线调度指令、管理缓存复用、对齐硬件队列。
尽管昇腾C表达能力强大,但编写正确、高性能算子要求开发者精通硬件底层,精细协调内存分配、数据搬运与计算逻辑,亟需高层抽象与自动生成方案。

2.3 基于大模型的算子生成研究现状

大语言模型在代码生成、程序综合领域表现优异,已有大量工作尝试自动化底层系统开发。现有算子生成研究绝大多数聚焦GPU场景:CUDA/Triton算子具备海量开源代码、完善文档、标准化抽象,大模型可从中学习分块、共享内存、指令级并行等通用优化思路。

NPU算子生成独有挑战
  1. 严苛硬件约束:昇腾C强制内存对齐、多核异构同步,开发者必须手动管控内存、搬运、流水线,代码容错率极低;
  2. 语料稀缺:公开NPU算子代码远少于GPU,大模型缺少高质量训练素材;
  3. 直接生成缺陷:直接让大模型输出底层NPU代码极易出现语法错误、逻辑幻觉,内存使用、同步逻辑、硬件对齐等约束难以满足,端到端正确率极低。

综上,纯端到端大模型直接生成NPU算子的方案无法产出功能正确、性能达标的代码。

2.4 研究动机

大模型难以直接生成带强硬件约束的底层NPU代码,但擅长推理高层算法结构、数据流、分块策略。为弥合高层算子逻辑与底层昇腾C代码的鸿沟,现有研究提出引入结构化中间表示/DSL引导大模型生成代码:通过约束生成空间、在合适抽象层级编码硬件语义,提升代码正确性与可控性。本文遵循该思路,设计大模型友好的DSL作为中间层,系统化自动生成昇腾C算子。

3 领域专用语言DSL定义

本文设计一套面向昇腾算子生成的轻量级DSL,平衡高层算子意图与底层昇腾C实现,兼顾大模型友好性、适度抽象、高性能表达能力。DSL提供硬件感知的结构化表示,暴露分块、数据流、片上执行等核心逻辑,同时屏蔽无关硬件底层细节。

整体结构

一段昇腾DSL程序分为两部分:Host主机函数、Kernel核函数,分别描述主机侧调度逻辑、片上计算逻辑。该架构贴合加速器通用开发范式,各模块语义清晰、代码简洁;语法风格类似Triton,消除冗余模板代码,让大模型专注分块、数据流、计算结构等核心算法决策。

Host主机函数:全局调度规划

定义全局执行策略,包含:

  1. 核心划分:指定硬件核数量、每核负载分配,显式描述多核并行结构;
  2. 分块策略:将全局张量切分为适配片上UB/L1缓存的小块,显式定义所有分块尺寸参数,并标注对应内存约束;
  3. 算子启动:调用Kernel,将分块参数传入片上计算逻辑。
Kernel核函数:片上执行逻辑

描述所有片上行为,包含缓存分配、计算流程:

  1. 片上缓存声明:使用DSL原生原语显式分配UB/L1临时缓存,禁止隐式别名,保证数据流、缓存复用逻辑对大模型与转译流程完全透明;
  2. 分阶段执行:全局→片上数据搬运必须放在copyin代码块,计算逻辑放入compute,片上结果写回全局内存放入copyout。支持多段流水线、迭代计算,显式分段建模昇腾硬件语义,同时结构规整,便于大模型生成与解析。

DSL内置向量、规约等通用计算原语,参数设计与昇腾C API高度对齐,保障转译流程稳定可靠。

设计思路

DSL精准平衡抽象与可控性:屏蔽内存对齐、冗长DataCopyPad等底层开发负担,同时完整保留决定性能的核心逻辑——片上缓存分配、分阶段流水线、多核并行结构。降低大模型生成代码的歧义,支撑无损结构化转译,成为生成正确、高效昇腾C算子的高效中间表示。

4 方法:AscendCraft整体框架

AscendCraft分为两大阶段:DSL代码生成、多轮转译降级。输入为PyTorch算子逻辑与张量尺寸,最终输出可编译、高性能昇腾C算子。

4.1 第一阶段:DSL代码生成

给定算子需求,大模型依托DSL规范、同类算子示例生成DSL代码。

提示词设计

提示词由两部分构成:

  1. DSL语法规范:定义语言语法、Host/Kernel分离、显式缓存分配、三段式执行结构;DSL语法简洁,仅需简短规范即可让大模型掌握语法,生成合法代码;
  2. 算子类别+尺寸专属示例:示例编码昇腾硬件适配优化方案(分块、缓存、数据流),匹配目标算子类型与张量形状,帮助大模型推导合理执行策略,避免不符合硬件特性的设计。
DSL抽象的核心价值

DSL紧凑且具备完整表达能力,覆盖高性能算子必需的存储层级调度、流水线结构。抽象屏蔽底层硬件杂项后,大模型仅需聚焦算子算法意图与优化策略;仅依靠少量专家示例即可泛化,产出高质量DSL代码适配各类算子。

4.2 第二阶段:DSL转译为昇腾C

不一次性生成完整昇腾C代码,而是拆分为多轮结构化大模型降级流程,每轮仅处理一小部分语义,大幅提升在强约束昇腾C编程模型下的代码正确性与鲁棒性。
整体分为4轮降级流程,前3轮为必需,第4轮对齐补全为可选:

  1. 流程1:主机侧代码翻译
  2. 流程2:算子初始化逻辑翻译
  3. 流程3:核心计算逻辑翻译
  4. 流程4:内存对齐与填充优化(可选)

每一轮输入提示词包含4部分:本轮DSL→昇腾C映射规则、昇腾C接口文档、转换示例、上一轮生成的半成品代码。

流程1:主机侧翻译

将DSL Host函数转换为昇腾C主机代码:定义分块数据结构、计算每核负载与分块尺寸、调用昇腾C主机API配置参数,最终指定Block数量并启动算子。

流程2:算子初始化翻译

生成算子执行前所有初始化逻辑:将主机分块参数拷贝至算子内部变量;算子通过GetBlockIdx()获取自身核编号,计算分配数据对应的全局内存偏移;同时基于DSL缓存注解初始化片上资源:数据传输缓存映射为张量队列TQue,临时计算缓存映射为张量缓冲区TBuf;配置队列容量支持流水线、双缓冲。

流程3:核心计算翻译

DSL强制CopyIn/Compute/CopyOut分段,转译时严格保留该结构,每段DSL代码对应独立昇腾C aicore 内联函数(CopyInX/ComputeX/CopyOutX),算子主循环Process()依次调用分段函数:

  1. CopyIn:调用DataCopy将全局内存数据搬运至片上缓存,写入输入队列;
  2. Compute:从队列取出输入张量,通过TBuf访问临时缓存,DSL运算映射为昇腾C硬件接口,计算结果写入输出队列;
  3. CopyOut:取出结果张量,通过DataCopy写回全局内存;
    仅跨核依赖场景插入SyncAll同步原语。
    分段函数强制固定执行结构,杜绝数据搬运与计算逻辑非法交错。
流程4:对齐与填充优化(可选)

处理内存对齐、非规整张量边界等硬件边缘场景:UB访问要求32字节对齐,若DSL分块、张量尺寸无法天然满足约束,将标准DataCopy替换为DataCopyPad,配置填充尺寸、步幅、布局转换参数。该流程后置,不干扰前序核心降级逻辑,提升整体鲁棒性。

每轮编译反馈修正

每一轮转译完成后都会编译生成代码,捕获编译器报错;将错误信息回传给大模型,修正代码后再进入下一轮降级流程。

多阶段转译的优势

拆分降级任务,每一轮仅处理窄范围语义,减少大模型幻觉、保证代码结构合规,同时让生成的昇腾C算子同时满足DSL语义约束与昇腾底层硬件规范。

5 实验评测

本文围绕三大研究问题开展实验:
RQ1:AscendCraft能否生成功能正确的昇腾C算子?
RQ2:自动生成算子性能对比PyTorch eager基线表现如何?
RQ3:框架能否泛化到基准外全新算子,支撑真实算子开发流程?

5.1 实验配置

基准数据集

采用MultiKernelBench多平台算子基准套件,支持昇腾C、CUDA等加速器后端。实验选用KernelBench一级任务:单算子、中等复杂度、计算与访存模式清晰,适合评测算子正确性与性能;采用最新版本张量尺寸,保证算子运行时长超过15ms,消除算子启动开销干扰,性能对比更客观。

硬件软件环境

硬件:昇腾910B2 NPU;
工具链:CANN 8.1、PyTorch 2.6;
系统:Ubuntu 22.04,配套官方昇腾驱动与固件;
编译器:昇腾默认编译工具链。

评测指标
  1. 编译成功率Comp@1:生成代码无编译错误的算子占比;
  2. 功能正确率Pass@1:编译通过、数值结果与参考实现完全一致的算子占比;
  3. 性能指标Fastₓ:正确算子中,运行速度达到PyTorch eager基线x倍以上的算子占比。
    • Fast₀.₂:基础性能达标,充分利用向量单元、多核并行;
    • Fast₀.₈:工程可用高效算子,数据流与分块策略合理;
    • Fast₁.₀:性能持平或超越PyTorch eager基线。

5.2 RQ1:算子正确性评测

表1 各类算子编译与功能正确率

算子类别(算子数量) 编译成功率Comp@1(%) 功能正确率Pass@1(%)
激活函数(15) 100.0 100.0
损失函数(7) 100.0 85.7
数学运算(6) 83.3 83.3
归一化算子(8) 100.0 87.5
优化器算子(5) 100.0 100.0
规约算子(5) 100.0 100.0
池化算子(6) 100.0 66.7
总计(52个算子) 98.1 90.4

整体52个算子编译成功率98.1%、功能正确率90.4%,大幅优于直接大模型生成昇腾C代码(同类基准下顶尖模型正确率仅13%)。

  • 激活、归一化、优化器、规约、池化算子编译通过率100%;数学算子略低,源于mask_cumsum布尔类型覆盖不足;
  • 激活、优化器、规约算子功能正确率100%,数据流结构规整、规约逻辑清晰;池化算子边界计算复杂、控制流繁琐,正确率相对偏低。

实验证明:结构化DSL、类别专家示例、带约束多轮转译可显著提升自动生成算子的正确性,覆盖绝大多数通用算子类型。

5.3 RQ2:算子性能评测

表2 各类算子性能指标占比

算子类别 Fast₀.₂(%) Fast₀.₈(%) Fast₁.₀(%)
激活函数 100.0 80.0 40.0
损失函数 85.7 85.7 85.7
数学运算 83.3 66.7 66.7
归一化算子 50.0 37.5 37.5
优化器算子 100.0 100.0 100.0
规约算子 100.0 0.0 0.0
池化算子 50.0 0.0 0.0
整体平均 82.7 57.7 46.2

整体82.7%算子性能达到PyTorch eager基线20%以上,57.7%达到80%,46.2%性能持平或优于基线。

  1. 激活、优化器、损失算子性能最优,核心收益来自算子融合;数学算子依靠专属硬件优化实现大幅提速;
  2. 归一化算子性能偏弱,多阶段计算、多层规约对内存布局、执行顺序高度敏感,需要更多硬件优化示例;
  3. 规约、池化算子难以达到80%基线性能:底层指令调度、硬件规约原语优化无法仅靠高层DSL表达。

尽管部分复杂算子性能仍有提升空间,但AscendCraft可稳定产出正确、可运行的算子,为后续人工调优提供完善起点。

5.4 RQ3:真实场景落地验证

为验证框架工程实用性,本文选取DeepSeek提出的全新mHC(流形约束超连接)架构算子,该算子未收录于任何现有基准。
选取两个核心算子:mHC_post、mHC_post_grad。仅提供PyTorch参考逻辑与标准输入尺寸,AscendCraft一次性生成功能完全正确的昇腾C实现:

  • mHC_post:生成代码速度为PyTorch eager的6.6倍;
  • mHC_post_grad:生成代码速度为PyTorch eager的3.0倍。

资深昇腾C开发者基于框架生成代码,搭配大模型辅助迭代优化,仅1天完成深度调优:

  • 优化后mHC_post提速至基线15.9倍;
  • 优化后mHC_post_grad提速至基线7.2倍。

该案例证明两大核心价值:

  1. 可快速为全新算子生成可用、正确的NPU算子实现,大幅降低从零开发成本;
  2. 生成代码结构清晰、可读性强,是人工深度性能调优的优质基线,规避直接从零生成底层昇腾C代码的高失败率问题。

6 总结

本文提出AscendCraft:一套依托大语言模型、DSL引导全自动生成昇腾C算子的框架。通过设计轻量化昇腾硬件感知DSL、结构化多轮约束转译流水线,打通高层算子业务逻辑与底层NPU硬件执行语义之间的鸿沟。
该方案让大模型聚焦分块、数据流等核心算法设计,规避直接生成底层硬件代码带来的高错误率、脆弱性问题。

基于MultiKernelBench的大规模实验证明:相较于直接大模型生成昇腾C代码,AscendCraft编译成功率、功能正确率实现质的提升,大量生成算子性能可对标甚至超越PyTorch eager执行基线。针对全新mHC架构算子的案例进一步验证框架泛化能力,生成算子天然具备显著加速效果,适配真实工业NPU算子开发流程。

整体研究证明:适配硬件特性的抽象中间表示+结构化生成流程,能够让大模型驱动的NPU算子自动生成技术具备工程落地价值。
未来工作将聚焦两点:提升复杂性能敏感算子的自动优化能力;打通DSL层与昇腾C底层联合优化,进一步缩小自动生成算子与专家手工调优算子的性能差距。

参考文献(略)


术语对照表

英文术语 中文标准译法
Ascend NPU 昇腾神经网络处理器
AscendC 昇腾C(昇腾算子开发语言)
DSL(Domain-Specific Language) 领域专用语言
Transcompilation 转译/分层降级编译
AICore AI计算核
Cube/Vector/Scalar Unit 矩阵/向量/标量计算单元
GM(Global Memory) 全局内存
UB(Unified Buffer) 统一缓冲区
MTE(Memory Transfer Engine) 内存搬运引擎
CopyIn/Compute/CopyOut 数据读入/计算/数据写出流水线
Kernel/Host Function 算子核函数/主机调度函数
MultiKernelBench 跨平台算子生成基准套件
PyTorch eager PyTorch即时执行模式
Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐