昇腾 AI 模型迁移赛参赛经验总结
一、背景与结果概述 本次模型迁移赛的任务,是将 BERT、CLIP 等 Transformer 类模型迁移到昇腾平台,并在保证精度的前提下尽可能降低单次推理耗时。经过完整的优化迭代,BERT 单次推理从约 48ms 降至 5-6ms,CLIP 从 80-90ms 降至约 10ms,量级上均为 8 倍左右的提升。 这一提升并非来自某个单点技巧,而是三个层次优化叠加的结果: 层次 优化内容 作用机理 代码写法层 Tensor 索引、切片、permute、broadcast 的等价重写 减少 Host 侧算子下发次数与冗余小算子 算子与结构层 QKV 融合、FlashAttention、mask 预构造、局部 fp16 提高单次下发的计算密度,降低访存量 执行模式层 静态图与整图静态化 消除 Python/Host 侧逐算子调度,转为整图连续执行 理解这三层的边界,是整个比赛中最关键的认知。初看 BERT、CLIP 这类模型时,注意力很容易集中在 attention、GELU、LayerNorm 等局部算子上,认为优化就是"把慢算子换成快算子"。但实测数据表明:在动态图推理下,真正的瓶颈大量分布在 Host 侧调度、单算子下发、动态 shape 处理和 Python 分支上,Device 侧计算反而不是第一约束。因此,优化的主线可以概括为一句话——先稳定测量,再定位热点,然后把动态图、小算子、动态 shape 和低效写法,系统性地改造成静态 shape、大算子、图模式与硬件友好的执行路径。 二、性能台阶图示 为避免 BERT 与 CLIP 的阶段标注相互挤压,下面将二者分开展示。图中区间值采用代表值绘制,重点表达优化路线中的性能下降台阶,而非将不同实验分支做严格线性叠加。 三、先建立可靠基线,而不是马上改代码 优化初期最容易犯的错误,是看到某个慢算子就直接动手改。但如果测量环境本身不稳定,优化方向很容易被噪声误导。 首先要处理的是运行稳定性。动态图推理中,Python 侧与 Host 侧调度占比很高,一旦 CPU 发生跨核调度,缓存失效与上下文切换会让耗时明显波动。绑核在这里价值显著:BERT 原始耗时约 48ms,绑核后可降到 41ms 甚至 38ms;CLIP 也从 80-90ms 降到约 76ms。这部分收益本身不是最终核心,但它让后续 profile 与版本对比变得可信。 ...