news 2026/5/10 14:05:05

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/5/10 2:24:46

leetcode 912. Sort an Array 排序数组

Problem: 912. Sort an Array 排序数组 堆排序可以通过&#xff0c;快速排序会超时 Code class Solution { public:vector<int> arr;void maxheapify(int dad, int len) {int son dad * 2 1;while(son < len) {if(son 1 < len && arr[son 1] > ar…

作者头像 李华
网站建设 2026/5/9 22:37:31

区块链测试规范:智能合约审计标准解读

第一章&#xff1a;智能合约审计的核心意义与行业背景智能合约作为区块链应用的执行引擎&#xff0c;其安全性直接决定去中心化系统的可靠性。2025年DeFi领域因合约漏洞导致的经济损失超$20亿&#xff0c;凸显审计的不可或缺性。对测试从业者而言&#xff0c;审计不仅是漏洞检测…

作者头像 李华
网站建设 2026/5/9 12:22:14

PTA乙级-1002 写出这个数

1002 写出这个数 1002 写出这个数 一、题目基础信息 二、完整可运行代码 三、核心代码解析 1. 输入处理:`string n; cin >> n;` (1)代码含义 (2)关键疑问:为什么不用整数类型(int/long long)? 2. 求和核心:`const string& numStr` 与 `sum += c - 0` (1)…

作者头像 李华
网站建设 2026/5/3 4:56:15

2026必备!千笔,专科生降AI率神器

在AI技术迅速渗透学术写作领域的当下&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率。然而&#xff0c;随着查重系统对AI生成内容的识别能力不断提升&#xff0c;AI率超标问题日益严峻&#xff0c;成为影响论文通过率的关键障碍。面对市场上五花八门的降AI率和降…

作者头像 李华
网站建设 2026/5/9 4:38:20

猫眼电影数据可视化与智能分析平台 | Python Flask框架 Echarts 预测/推荐算法 爬虫 大数据 deepseek 毕业设计源码(建议收藏)✅

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ > &#x1f345;想要获取完整文章或者源码&#xff0c;或者代做&#xff0c;拉到文章底部即可与…

作者头像 李华