news 2026/5/4 20:29:11

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/2 1:18:18

linux编译报错

/usr/bin/ld: 找不到 -lncursesw $:~/workspace/kernel-driver/linux-xlnx-xlnx_rebase_v5.4_2020.2$ make menuconfig HOSTLD scripts/kconfig/mconf /usr/bin/ld: 找不到 -lncursesw# 解决 $:sudo ln -s /usr/lib/x86_64-linux-gnu/libncurses.so /usr/lib/x86_64-linux-gn…

作者头像 李华
网站建设 2026/4/26 9:50:03

基于Spring Boot的人格测试网站

&#x1f345; 作者主页&#xff1a;Selina .a &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作。 主要内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据…

作者头像 李华
网站建设 2026/5/4 19:01:28

【无人机】根据任务需求(紧急程度、飞行距离、是否需冷链)智能筛选最优无人机,为选中的无人机生成平滑的 7 次多项式飞行轨迹附matlab代码

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

作者头像 李华
网站建设 2026/4/30 21:12:45

守护 AI 资产:用 `cann-security-kit` 实现安全可信的模型部署

守护 AI 资产&#xff1a;用 cann-security-kit 实现安全可信的模型部署 cann组织链接&#xff1a;https://atomgit.com/cann ops-nn仓库链接&#xff1a;https://atomgit.com/cann/ops-nn 在金融、医疗、政务等高敏感场景中&#xff0c;AI 模型不仅是算法成果&#xff0c;更是…

作者头像 李华
网站建设 2026/4/28 8:39:36

实测才敢推!AI论文平台 千笔ai写作 VS 灵感风暴AI,专科生写论文神器!

随着人工智能技术的迅猛发展&#xff0c;AI辅助写作工具正逐步成为高校学生完成毕业论文的重要助手。尤其是在专科生群体中&#xff0c;面对繁重的论文写作任务&#xff0c;越来越多的学生开始借助AI工具来提升效率、降低难度。然而&#xff0c;市场上的AI写作平台种类繁多&…

作者头像 李华