news 2026/2/11 2:34:43

CANN 性能剖析实战:从原始事件到交互式火焰图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN 性能剖析实战:从原始事件到交互式火焰图

CANN 性能剖析实战:从原始事件到交互式火焰图

cann组织链接:https://atomgit.com/cann
ops-nn仓库链接:https://atomgit.com/cann/ops-nn

🎯 目标

  • 利用aclprof采集 NPU kernel 执行事件
  • 转换为Chrome Trace Event 格式
  • 渲染为可缩放、可搜索的火焰图
  • 嵌入 WebUI,支持按请求 ID 过滤
  • 定位瓶颈:如Int4Gemm占比过高、PagedAttention内存带宽受限

✅ 全流程自动化,无需手动导出.json


一、整体数据流

启动 Profiling

CANN-LLM Engine

aclprof API

原始事件: kernel_name, start, duration

TraceEventConverter

trace.json

WebUI FlameGraph 组件

用户交互:缩放/搜索/聚焦

关联到具体请求 ID


二、后端实现:Profiling + 转换

1.启用 CANN Profiling

// profiler_manager.cpp#include"acl/acl_prof.h"voidProfilerManager::start_profiling(){// 配置 profiling 类型:ACL_PROF_TASK_TIME(kernel 级)aclprofConfig*config=aclprofCreateConfig(nullptr,0,// device list (nullptr = all)ACL_PROF_TASK_TIME,// typenullptr,0// data type (default));aclprofStart(config);}std::vector<KernelEvent>ProfilerManager::stop_and_collect(){aclprofStop();// 获取原始数据size_t data_size=0;void*data=aclprofGetProfileData(ACL_PROF_TASK_TIME,&data_size);// 解析为结构化事件returnparse_aclprof_data(data,data_size);}

🔑aclprofGetProfileData返回二进制 blob,需按aclprofTaskTimeInfo结构解析


2.转换为 Trace Event 格式

Chrome Trace 格式示例:

[{"name":"Int4Gemm","cat":"NPU","ph":"X","ts":123456789000,"dur":1500,"pid":0,"tid":1,"args":{"request_id":"req-abc123"}},...]

转换逻辑:

// trace_converter.cppnlohmann::jsonconvert_to_trace_format(conststd::vector<KernelEvent>&events,conststd::unordered_map<uint64_t,std::string>&stream_to_req_id){nlohmann::json trace;for(constauto&e:events){// 通过 stream ID 关联 request_id(需在 launch kernel 时记录映射)std::string req_id=stream_to_req_id.at(e.stream_id);trace.push_back({{"name",e.kernel_name},{"cat","NPU"},{"ph","X"},// Complete event{"ts",e.start_ns/1000},// microseconds{"dur",e.duration_ns/1000},{"pid",0},{"tid",static_cast<int>(e.stream_id)},{"args",{{"request_id",req_id}}}});}returntrace;}

💡关键技巧:在调用ge::Session::Run()前,将当前request_idaclrtStream绑定


3.按请求 ID 过滤(WebUI 需求)

提供 REST API:

// GET /api/profile?request_id=req-abc123std::stringget_trace_for_request(conststd::string&req_id){autoall_events=profiler_.collect_recent_events();autofiltered=filter_by_request_id(all_events,req_id);returnconvert_to_trace_format(filtered).dump();}

三、前端集成:嵌入火焰图

使用开源库perfetto或轻量级d3-flame-graph

在 WebUI 中添加 Tab

<template> <div v-if="activeTab === 'flamegraph'"> <input v-model="filterRequestId" placeholder="Filter by Request ID" /> <button @click="loadFlameGraph">Load</button> <div id="flamegraph-container"></div> </div> </template> <script> import 'd3-flame-graph/dist/d3-flamegraph.css'; import flamegraph from 'd3-flame-graph'; export default { methods: { async loadFlameGraph() { // 1. 获取 trace.json const resp = await fetch(`/api/profile?request_id=${this.filterRequestId}`); const trace = await resp.json(); // 2. 转换为 d3-flame-graph 所需的树形结构 const tree = this.traceToTree(trace); // 3. 渲染 const chart = flamegraph() .width(800) .cellHeight(18) .transitionDuration(750) .minFrameSize(5) .onClick(d => console.log('Clicked:', d)); d3.select("#flamegraph-container") .datum(tree) .call(chart); }, traceToTree(traceEvents) { // 将 flat events 聚合成 call stack tree // (简化:按时间排序后模拟栈) const stacks = group_events_into_stacks(traceEvents); return build_tree_from_stacks(stacks); } } } </script>

✅ 用户输入req-abc123,即可看到该请求的完整 kernel 调用栈耗时分布


四、典型性能问题诊断示例

场景 1:INT4 GEMM 成为瓶颈

  • 现象:火焰图中Int4Gemm占据 70%+ 高度
  • 根因:group_size 过小 → scale/zeros 访问频繁
  • 优化:增大 group_size 至 256,重力量化模型

场景 2:PagedAttention 内存带宽受限

  • 现象SparseFusedAttention中大量小 block 加载
  • 根因:block_size=8 太小,导致随机访存
  • 优化:调整 block_size=32,提升缓存命中率

场景 3:调度开销过高

  • 现象select_batch/prepare_inputsCPU 时间长
  • 根因:队列锁竞争激烈
  • 优化:改用无锁队列(如moodycamel::ConcurrentQueue

五、自动化性能回归测试

在 CI 中集成:

# .gitlab-ci.ymlperformance_test:script:-./llm_server--profile--test-prompt="..." &-sleep 10-curl http://localhost:8080/api/profile>trace.json-python tools/analyze_flamegraph.py trace.json--threshold=50msrules:-if:$CI_COMMIT_BRANCH == "main"

analyze_flamegraph.py可检测:

  • 是否出现预期 kernel(如Int4Gemm
  • 最大 kernel 耗时是否超阈值
  • 吞吐是否下降 >5%

六、结语:让性能瓶颈无所遁形

通过将CANN Profiling → Trace Event → 交互式火焰图全链路打通,我们实现了:

“所见即所得”的性能分析体验——无需专家知识,也能快速定位瓶颈。

这不仅提升了开发效率,更强化了 CANN-LLM 作为生产级推理引擎的可靠性与可维护性。


🔜 下一步建议:

  • 支持多卡 profiling 聚合视图
  • 实现自动性能优化建议生成(AI Copilot for Profiling)
  • 构建完整的 MLOps 流水线(训练→量化→部署→监控)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/9 13:41:08

‌数据主权法规下跨境测试环境搭建的法律风险与合规实践指南

一、核心法律风险全景图&#xff1a;三大法域的合规边界‌ 法域核心法规对测试环境的关键约束合规触发阈值‌中国‌《数据安全法》《个人信息保护法》《促进和规范数据跨境流动规定》测试数据若含个人信息或重要数据&#xff0c;出境需通过安全评估、标准合同或认证&#xff1…

作者头像 李华
网站建设 2026/2/9 0:02:28

BXMya 5SGX1060H0003 晶闸管(IGCT)控制模块

5SGX1060H0003是瑞士ABB公司旗下的工业级集成门极换流晶闸管&#xff08;IGCT&#xff09;控制模块&#xff0c;隶属于ABB高压电力电子器件系列&#xff0c;是中高压变频系统与电力电子控制设备的核心控制组件&#xff0c;对应物料编码3BHE024415R0101。该产品采用标准化模块化…

作者头像 李华
网站建设 2026/2/10 1:53:00

BXMya SPNPM22 网络通信处理模块

SPNPM22是瑞士ABB公司旗下的工业级网络处理模块&#xff0c;隶属于SPNP系列&#xff0c;是工业自动化系统中分布式控制系统&#xff08;DCS&#xff09;与可编程逻辑控制器&#xff08;PLC&#xff09;的核心通信组件。该产品采用标准化模块化设计&#xff0c;专为工业自动化场…

作者头像 李华
网站建设 2026/2/10 9:17:06

改进的麻雀算法优化BP神经网络的光伏功率预测附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…

作者头像 李华