不通过大模型微调 AscendCraft:基于领域专用语言引导转译的昇腾NPU算子自动生成框架
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,遵循三大设计原则:
- 简洁规整语法:DSL采用紧凑、规范的编程结构,消除冗余语法,强制清晰控制流。大模型可聚焦分块策略、数据流等核心算法设计,而非底层语法细节,同时生成代码简短、稳定性更强。
- 适度抽象封装:刻意屏蔽大幅增加开发负担、但不影响核心算子逻辑表达的硬件细节。例如昇腾C中非对齐内存访问需要冗长的DataCopyPad配置、大量参数,这类底层细节全部由DSL封装,简化生成流程且不损害代码正确性。
- 硬件定向扩展:显式建模昇腾特有执行语义,包含片上缓存分配(统一缓冲区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),集成三类异构计算单元,分别适配不同运算:
- 标量单元(Scalar):负责标量数据处理、程序控制流;
- 向量单元(Vector):执行类SIMD向量运算,逐元素计算、归一化、激活、规约操作均在此完成;
- 矩阵单元(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算子生成独有挑战
- 严苛硬件约束:昇腾C强制内存对齐、多核异构同步,开发者必须手动管控内存、搬运、流水线,代码容错率极低;
- 语料稀缺:公开NPU算子代码远少于GPU,大模型缺少高质量训练素材;
- 直接生成缺陷:直接让大模型输出底层NPU代码极易出现语法错误、逻辑幻觉,内存使用、同步逻辑、硬件对齐等约束难以满足,端到端正确率极低。
综上,纯端到端大模型直接生成NPU算子的方案无法产出功能正确、性能达标的代码。
2.4 研究动机
大模型难以直接生成带强硬件约束的底层NPU代码,但擅长推理高层算法结构、数据流、分块策略。为弥合高层算子逻辑与底层昇腾C代码的鸿沟,现有研究提出引入结构化中间表示/DSL引导大模型生成代码:通过约束生成空间、在合适抽象层级编码硬件语义,提升代码正确性与可控性。本文遵循该思路,设计大模型友好的DSL作为中间层,系统化自动生成昇腾C算子。
3 领域专用语言DSL定义
本文设计一套面向昇腾算子生成的轻量级DSL,平衡高层算子意图与底层昇腾C实现,兼顾大模型友好性、适度抽象、高性能表达能力。DSL提供硬件感知的结构化表示,暴露分块、数据流、片上执行等核心逻辑,同时屏蔽无关硬件底层细节。
整体结构
一段昇腾DSL程序分为两部分:Host主机函数、Kernel核函数,分别描述主机侧调度逻辑、片上计算逻辑。该架构贴合加速器通用开发范式,各模块语义清晰、代码简洁;语法风格类似Triton,消除冗余模板代码,让大模型专注分块、数据流、计算结构等核心算法决策。
Host主机函数:全局调度规划
定义全局执行策略,包含:
- 核心划分:指定硬件核数量、每核负载分配,显式描述多核并行结构;
- 分块策略:将全局张量切分为适配片上UB/L1缓存的小块,显式定义所有分块尺寸参数,并标注对应内存约束;
- 算子启动:调用Kernel,将分块参数传入片上计算逻辑。
Kernel核函数:片上执行逻辑
描述所有片上行为,包含缓存分配、计算流程:
- 片上缓存声明:使用DSL原生原语显式分配UB/L1临时缓存,禁止隐式别名,保证数据流、缓存复用逻辑对大模型与转译流程完全透明;
- 分阶段执行:全局→片上数据搬运必须放在copyin代码块,计算逻辑放入compute,片上结果写回全局内存放入copyout。支持多段流水线、迭代计算,显式分段建模昇腾硬件语义,同时结构规整,便于大模型生成与解析。
DSL内置向量、规约等通用计算原语,参数设计与昇腾C API高度对齐,保障转译流程稳定可靠。
设计思路
DSL精准平衡抽象与可控性:屏蔽内存对齐、冗长DataCopyPad等底层开发负担,同时完整保留决定性能的核心逻辑——片上缓存分配、分阶段流水线、多核并行结构。降低大模型生成代码的歧义,支撑无损结构化转译,成为生成正确、高效昇腾C算子的高效中间表示。
4 方法:AscendCraft整体框架
AscendCraft分为两大阶段:DSL代码生成、多轮转译降级。输入为PyTorch算子逻辑与张量尺寸,最终输出可编译、高性能昇腾C算子。
4.1 第一阶段:DSL代码生成
给定算子需求,大模型依托DSL规范、同类算子示例生成DSL代码。
提示词设计
提示词由两部分构成:
- DSL语法规范:定义语言语法、Host/Kernel分离、显式缓存分配、三段式执行结构;DSL语法简洁,仅需简短规范即可让大模型掌握语法,生成合法代码;
- 算子类别+尺寸专属示例:示例编码昇腾硬件适配优化方案(分块、缓存、数据流),匹配目标算子类型与张量形状,帮助大模型推导合理执行策略,避免不符合硬件特性的设计。
DSL抽象的核心价值
DSL紧凑且具备完整表达能力,覆盖高性能算子必需的存储层级调度、流水线结构。抽象屏蔽底层硬件杂项后,大模型仅需聚焦算子算法意图与优化策略;仅依靠少量专家示例即可泛化,产出高质量DSL代码适配各类算子。
4.2 第二阶段:DSL转译为昇腾C
不一次性生成完整昇腾C代码,而是拆分为多轮结构化大模型降级流程,每轮仅处理一小部分语义,大幅提升在强约束昇腾C编程模型下的代码正确性与鲁棒性。
整体分为4轮降级流程,前3轮为必需,第4轮对齐补全为可选:
- 流程1:主机侧代码翻译
- 流程2:算子初始化逻辑翻译
- 流程3:核心计算逻辑翻译
- 流程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()依次调用分段函数:
- CopyIn:调用DataCopy将全局内存数据搬运至片上缓存,写入输入队列;
- Compute:从队列取出输入张量,通过TBuf访问临时缓存,DSL运算映射为昇腾C硬件接口,计算结果写入输出队列;
- 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,配套官方昇腾驱动与固件;
编译器:昇腾默认编译工具链。
评测指标
- 编译成功率Comp@1:生成代码无编译错误的算子占比;
- 功能正确率Pass@1:编译通过、数值结果与参考实现完全一致的算子占比;
- 性能指标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%性能持平或优于基线。
- 激活、优化器、损失算子性能最优,核心收益来自算子融合;数学算子依靠专属硬件优化实现大幅提速;
- 归一化算子性能偏弱,多阶段计算、多层规约对内存布局、执行顺序高度敏感,需要更多硬件优化示例;
- 规约、池化算子难以达到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倍。
该案例证明两大核心价值:
- 可快速为全新算子生成可用、正确的NPU算子实现,大幅降低从零开发成本;
- 生成代码结构清晰、可读性强,是人工深度性能调优的优质基线,规避直接从零生成底层昇腾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即时执行模式 |
更多推荐




所有评论(0)