单人
ascend-kernel

昇腾算子优化与模型加速

昇腾方向限定单人题

昇腾NPU算子优化ProfilingAgentSkill

一个模型在昇腾 NPU 上“能跑”和“跑得快”之间,隔着很长一段距离。vLLM-Ascend 和 LLaMA Factory 已经让大部分主流模型可以在昇腾上开箱推理和微调,但开箱配置追求的是覆盖面:一个新的模型结构出现时,框架往往先用若干通用的小算子把它拼出来,保证结果正确,再慢慢补上融合算子和图模式的支持。于是在 Profiler 的时间线上,经常能看到这样的画面:一次前向被拆成几百个细碎的小算子,每一个都很快,加起来却很慢;NPU 在两次计算之间空等 Host 下发下一个任务;中间结果在显存里被反复写入、读出,真正的计算反而只占一小部分时间。

Qwen3.5 这一代模型让这个问题更加明显。它的大部分层不再是标准的 Attention,而是 Gated DeltaNet 这样的线性注意力,再配合卷积、门控和归一化组成新的结构。标准 Attention 在昇腾上已经有成熟的融合算子,而这些新结构的算子实现还在快速演进,其中往往藏着不少可以挖掘的性能空间。

任务要求

本题希望你通过算子优化等方式,实现至少一个模型(如 Qwen3.5-9B)在昇腾 NPU 上的推理加速和 LoRA 微调加速,并同时满足下面三个要求:

  • 推理加速:相较默认的 vLLM-Ascend 框架的开箱1 推理速度,至少有 10% 的加速;
  • 微调加速:相较原生的 LLaMA Factory 框架的开箱1 LoRA 微调速度,至少有 3% 的端到端加速;
  • 精度无损:优化后的算子不应造成计算精度的损失或结果偏差。

建议通过 MindStudio Insight(结合 Ascend PyTorch Profiler 接口)查看 Timeline、算子耗时统计和 Flame Graph 等信息,自己分析哪些算子值得优化。值得关注的现象包括:耗时占比最高的算子;被拆成大量细碎小算子的计算模式;Host 下发跟不上导致的 NPU 空闲;频繁的 Host 与 Device 之间的同步和数据拷贝;回退到 CPU 上执行的算子;以及图模式没有覆盖到的部分。

优化的手段不做限制:

  • 可以适当重构和优化已有算子的实现
  • 可以把连续调用的多个算子融合成一个 Fused Kernel,减少 Kernel 下发和中间结果读写的开销
  • 也可以实现时间掩盖,例如让 Host 侧的调度、采样和数据准备与 NPU 上的计算互相重叠,减少设备空等的时间

算子实现方式可使用原生的 AscendC 编写,也可以使用 TileLang、PyPTO 等更高层的 Kernel DSL

由于算力预算限制,本题暂时不考虑需要多卡或多机才可进行部署和微调的模型,亦不考虑 MoE 模型等的优化实现。

模型不限于 Qwen3.5-9B,但如果选择其他模型,请说明理由,并确保它在 vLLM-Ascend 和 LLaMA Factory 中都有开箱支持并给出推理和 LoRA 微调的运行基线数据。

本题需要昇腾算力,可以联系管理员获取算力代金券。初始将发放 48 核时的算力券(约 1600 元),每次速度提升达到 1% 时,可以获得等效 24 核时的算力券(约 800 元)。

基线说明

由于 910B4 或 910B2 性能存在一定差距,因此需固定实验环境并记录基线环境:

  • NPU 型号及驱动版本
  • CANN 版本号
  • vLLM-Ascend 版本
  • LLaMA Factory 版本
  • 测试模型权重与数值精度
  • 框架的全部启动参数

推理加速

推理场景下,请记录并固定如下基本情况:

  • 固定输入输出长度的分布
  • 并发数
  • 请求数量

推理我们主要关注吞吐量等性能情况,但请同步记录:

  • 吞吐量
  • 首 Token 延迟(TTFT)
  • 每个输出 Token 的延迟(TPOT)

微调加速

请记录并固定如下基本情况:

  • 数据集
  • 序列长度
  • Batch Size
  • 梯度累积步数
  • LoRA 的秩和目标模块

需要记录的性能情况包括:

  • 每步耗时
  • 每秒处理的 Token 数
  • 峰值显存
  • MFU(Model FLOPS Utilization)

注意,推理和微调加速的所有测量都需要预热,并重复多次取均值

重要提醒

下面这些方式带来的加速不计入本题的成绩:

  • 量化、剪枝,或者把数值精度从 BF16 降低到更低的格式。
  • 修改基准负载,例如缩短输入输出长度、改变并发数,或者调整 Batch Size、序列长度、梯度累积步数、LoRA 的秩和目标模块。
  • 开启基线没有开启的解码特性,例如投机解码。如果确实需要开启,基线也必须在同样的配置下重新测量。
  • 计时方式有误,例如没有等待 NPU 上的异步计算完成就停止计时,或者把部分计算挪到计时区间之外预先完成。
  • 优化后的 Kernel 在某些输入下悄悄回退到原有实现,却把这些输入计入了加速。

重要加分项:Profiler 分析 Skill

注意,本题推荐使用 Agent 完成探索。本题中的读取 Profiler 数据、定位热点、编写 Kernel、验证正确性、测量速度等环节均有可能有 Skill 化的可能性。如果能完成一个 MindStudio Insight 的 Skill,或者一个用于分析 Profiler 日志的 Skill,会有额外的高额加分。

一次 Profiling 产生的数据动辄几百 MB 甚至数 GB,不可能原样塞进 Agent 的上下文;而 Agent 直接阅读原始的 Timeline 数据,也很难从几十万个事件里看出规律。一个好的 Skill 应该把人分析 Profiler 数据的经验沉淀下来。包括不限于:

  • 如何配置采集的范围和选项
  • 如何解析和聚合原始数据
  • 如何把结果压缩成适合上下文的结构化摘要
  • 如何识别“Host 下发瓶颈”“小算子密集”“频繁同步”这类典型模式
  • 如何从热点算子回溯到 Python 调用栈和源代码
  • 如何对比优化前后的两份 Profiling 数据。

可以基于 msprof-analyze 等已有工具构建,也可以自己实现。


附录:参考资料

脚注

  1. “开箱”指的是按照框架官方文档推荐的方式运行,不做额外的调参。如果框架中已经存在默认没有开启的优化开关,打开这些开关带来的收益需要在报告中单独列出。 ↩︎ ↩︎

出题人:PEScn