昇腾 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 与版本对比变得可信。 ...

January 1, 2025 · 3 min · Javey

SDXL 推理极限优化实战(三):混合优化与吞吐工程部署

系列导读:本系列共三篇文章,渐进式地探讨 Stable Diffusion XL(SDXL)模型的推理优化。第一篇聚焦于问题背景与性能剖析,第二篇展开全面的单项优化实践,本篇(终篇)进行混合组合优化与吞吐工程部署。 在前两篇中,我们完成了 SDXL 推理的性能 Profiling 和逐项优化实践。每种单项优化都有其收益上限,而实际工程中往往需要 将多种优化叠加组合 才能逼近性能极限。更进一步,生产部署不仅关注单次延时,更关注 单卡吞吐量(image/s)——这需要从 Batch 策略、多实例部署、GPU 资源调度等系统层面进行优化。 本篇将回答两个核心问题: 哪些优化可以叠加?叠加后的实际效果如何? 如何最大化单卡吞吐?Batch、多实例、MPS 分别适合什么场景? 实验环境:NVIDIA L20, CUDA 12.x, PyTorch 2.x, 分辨率 1024×1024。 Baseline:FP16, 20 步, 单张推理延时 3.9s, 吞吐 0.256 image/s。 注意:与前两篇不同的是, 为了更接近生产环境,本篇步数统一设置为20步。 1. 混合优化组合实践 1.1 组合策略设计 并非所有优化都能自由叠加。根据第二篇的分析,各优化作用于 Pipeline 的不同层级: 组合兼容性矩阵 ═══════════════════════════════════════════════════════════ torch.compile StableFast OneDiff TensorRT VAE FP16 Fix ✅ ✅ ✅ ✅ Tiny VAE ✅ ✅ ✅ ✅ 禁用 CFG ✅ ✅ ✅ ✅ DeepCache ✅ ⚠️ ⚠️ ❌ ⚠️ = 部分兼容,需要额外适配 ❌ = 不兼容或收益冲突 ═══════════════════════════════════════════════════════════ 组合原则: ...

November 1, 2024 · 8 min · Javey

SDXL 推理极限优化实战(二):全面优化实践指南

系列导读:本系列共三篇文章,渐进式地探讨 Stable Diffusion XL(SDXL)模型的推理优化。第一篇聚焦于问题背景与性能剖析,本篇展开全面的单项优化实践,第三篇进行混合组合优化与吞吐工程部署。 在上一篇中,我们通过 Profiling 明确了 SDXL 推理的性能瓶颈:UNet 去噪循环占据 90%+ 的推理时间,Attention 层受限于访存带宽,大量小 Kernel 引入启动开销,CFG 使计算量翻倍。本篇将基于这些发现,从三个维度逐一展开优化实践: 优化维度总览 ══════════════════════════════════════════════════════ 精度 维度 1 数值精度优化 无损 ──────▶ 有损 FP32 → FP16 / BF16 / TF32 ████░░░░░░ 维度 2 编译与算子层优化 无损 torch.compile / StableFast ██████████ OneDiff / TensorRT 维度 3 模型组件级优化 无损 ──────▶ 有损 VAE Fix / TinyVAE / CFG / ████████░░ DeepCache / 蒸馏 / 显存优化 ══════════════════════════════════════════════════════ Baseline 约定:所有实验以 FP16、30 步、1024×1024 为基准(延时 5.5s,显存 11.24GB),在 NVIDIA L20 上执行。 ...

October 1, 2024 · 10 min · Javey

SDXL 推理极限优化实战(一):模型剖析与性能 Profiling

系列导读:本系列共三篇文章,渐进式地探讨 Stable Diffusion XL(SDXL)模型的推理优化。第一篇聚焦于问题背景与性能剖析,第二篇展开全面的优化实践,第三篇进行混合组合优化与吞吐工程部署。 1. 为什么要优化 SDXL 推理? 1.1 SDXL 的工程地位 Stable Diffusion XL(SDXL)是 Stability AI 于 2023 年发布的旗舰级文生图模型,相较于 SD 1.5,它在图像质量、分辨率(原生支持 1024×1024)和语义理解能力上有了质的飞跃。SDXL 已成为开源社区中应用最广泛的高分辨率生成模型之一,广泛用于创意设计、电商素材生成、游戏概念图制作等场景。 然而,更强的模型能力伴随着更高的计算开销。SDXL 的参数量达到约 3.5B(Base UNet 2.6B + Text Encoders 等),相较于 SD 1.5 的 ~0.9B,推理成本大幅增加: 指标 SD 1.5 SDXL UNet 参数量 ~860M ~2.6B 原生分辨率 512×512 1024×1024 Text Encoder CLIP ViT-L/14 CLIP ViT-L/14 + OpenCLIP ViT-bigG FP32 显存占用 ~4 GB ~18 GB FP16 单次推理延时(30步) ~1.5s ~5.5s 1.2 优化的业务价值 在生产环境中,推理性能直接决定了: 用户体验:单张图片从 5.5s 降至 2.8s,交互延迟感知有本质差异 服务成本:GPU 是最昂贵的资源,推理加速 = 同等算力下服务更多用户 吞吐能力:高并发场景下,从 0.25 image/s 提升到 0.37+ image/s 意味着单卡产能提升近 50% 1.3 实验环境 本系列所有实验基于以下硬件与软件环境: ...

September 1, 2024 · 6 min · Javey