CANN-Profiler-昇腾NPU上推理慢到底慢在哪
推理服务上线前最重要的一步是性能 Profiling。ATB 的推理速度不达标可能有十几个原因——不拿数据说话就是瞎猜。CANN Profiler 给你精确到每个 kernel 的执行时间。开启 Profilingimporttorch_npu# 方法 1Python APIwithtorch_npu.profiler.profile(activities[torch_npu.profiler.ProfilerActivity.CPU,torch_npu.profiler.ProfilerActivity.NPU],record_shapesTrue,profile_memoryTrue)asprof:model.generate(Hello,max_new_tokens50)print(prof.key_averages().table(sort_bynpu_time_total,row_limit20))# 方法 2环境变量更底层exportPROFILING_MODE1exportPROFILING_OPTIONS{output:./profiling_data,task_trace:on}python infer.py方法 2 生成原始 profiling 数据需要用 CANN 的分析工具处理。看 Profiling 报告关键的几列列名含义关注点Name算子名称有没有FusedKernel融合了NPU TimeNPU 执行时间哪个算子最慢CPU TimeCPU 调度时间CPU 有没有成为瓶颈Calls调用次数有没有异常频繁的调用CPU Mem / NPU Mem内存占用有没有显存泄漏典型分析流程按 NPU Time 排序找 Top 10 最慢的算子检查这些算子有没有融合版本可用检查 CPU Time 是否异常高调度瓶颈检查 Calls 是否有异常重复计算常见性能问题诊断问题 1Softmax 没走融合Profiler 报告 Softmax 0.08ms × 32 层 2.56ms ← 太慢 期望 FusedKernel (FlashAttention 内部 Softmax) 0.03ms原因输入 tensor 不连续或 dtype 不对。检查x.is_contiguous()和x.dtype。问题 2CPU 调度瓶颈Profiler 报告 NPU Time: 3.1ms CPU Time: 4.8ms ← CPU 比 NPU 还慢 原因eager mode 下每个算子都有 Python→C 的调度开销 解决torch.compile(model, backendnpu)问题 3HBM 读写过多Profiler 报告 MatMul 0.5ms CopyH2D 0.3ms ← 数据在 HBM 进出太多 原因算子没融合中间结果频繁写回 HBM 解决确认 graph-autofusion 是否生效对比分析最有效的 Profiling 方法是做 A/B 对比# 版本 A标准 PyTorchmodel_aAutoModel.from_pretrained(model_id,torch_dtypetorch.float16).to(npu:0)# 版本 BATB 加速model_bLLM(model_id,devicenpu:0)# 分别 profile对比 kernel 列表对比两个版本的 profiler 输出看哪些 kernel 被替换了、哪些 kernel 消失了。这是验证优化是否生效的最直接方式。NPU 利用率Profiler 会输出 NPU 的整体利用率NPU Compute Utilization: 42% NPU Memory Utilization: 78% NPU DMA Utilization: 35%Compute 30%计算不够密集可能是 batch 太小或融合不够Memory 90%显存压力大需要减少 batch 或开启 KV Cache 优化DMA 50%数据搬运没跟计算重叠需要 double bufferdecode 阶段的 Compute 利用率低5-10%是正常的——M1 的 GEMM 打不满 Cube 单元。prefill 阶段应该 70%。线上持续 Profiling推理服务上线后可以用采样 Profiling每隔 N 个请求采集一次importrandomclassSamplingProfiler:def__init__(self,sample_rate0.01):self.sample_ratesample_ratedefshould_profile(self):returnrandom.random()self.sample_ratedefrecord(self,request):ifself.should_profile():withtorch_npu.profiler.profile(...)asprof:resultmodel.generate(request.prompt)self.save_profile(prof)returnresultelse:returnmodel.generate(request.prompt)1% 的采样率对性能影响 1%但能持续监控线上服务的算子执行时间。不 Profile 就优化是盲人摸象。CANN Profiler 给你精确到微秒的算子执行数据用 A/B 对比验证优化效果用线上采样持续监控。推理性能问题 90% 可以靠 Profiling 定位。仓库在这里https://atomgit.com/cann/ATB
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2638858.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!