LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

ROCm Compute Profiler概述:Standalone GUI(Web UI)

 Standalone GUI 的目标是:

  • 从几 MB 到几百 MB 的 profiling trace / counter 数据中,构建可视化的 Timeline / Counter / Heatmap / 指标图表
  • 在浏览器中提供 可交互 的体验(缩放、过滤、选择 kernel/GPU/metric);
  • 在开发效率和性能之间取得平衡:后端 Python + 前端 Dash/Plotly + 数据层 DataFrame 分析

1. Standalone GUI启动

执行rocprof-compute analyze -p workloads/vcopy/MI200/ --gui启动Profile Workload的分析:

                                 __                                       _
 _ __ ___   ___ _ __  _ __ ___  / _|       ___ ___  _ __ ___  _ __  _   _| |_ ___
| '__/ _ \ / __| '_ \| '__/ _ \| |_ _____ / __/ _ \| '_ ` _ \| '_ \| | | | __/ _ \
| | | (_) | (__| |_) | | | (_) |  _|_____| (_| (_) | | | | | | |_) | |_| | ||  __/
|_|  \___/ \___| .__/|_|  \___/|_|        \___\___/|_| |_| |_| .__/ \__,_|\__\___|
               |_|                                           |_|

   INFO Analysis mode = web_ui
WARNING Detected mismatch in sysinfo versioning. You need to reprofile to update data.
   INFO [analysis] deriving rocprofiler-compute metrics...
   INFO Could not find profiling_config.yaml in /home/lbq/rocm/rocm-systems/projects/rocprofiler-compute/tests/workloads/vcopy/MI200 for filtering analysis report
WARNING PC sampling: can not detect pc sampling method without /home/lbq/rocm/rocm-systems/projects/rocprofiler-compute/tests/workloads/vcopy/MI200/ps_file_pc_sampling_host_trap.csv
Dash is running on http://0.0.0.0:8050/
...

在浏览器中打开:

image

2. 整体架构

2.1 关键文件清单--入口与控制

关键文件清单(快速索引) -- 入口与控制

  • bin/rocprof-compute — 主脚本

  • libexec/rocprofiler-compute/rocprof_compute_base.py — RocProfCompute 控制器与主流程

  • libexec/rocprofiler-compute/rocprof_compute_analyze/analysis_webui.py — webui_analysis(GUI 主逻辑、回调)

  • libexec/rocprofiler-compute/rocprof_compute_analyze/analysis_base.py — OmniAnalyze_Base(通用分析方法)

  • IO / 数据组装

  • libexec/rocprofiler-compute/utils/file_io.py

    • create_df_pmc(...) — 读 CSV(pmc_perf.csv, SQ*.csv 等),用 pandas 合并为“mega” DataFrame
    • create_df_kernel_top_stats(...) — 生成 pmc_kernel_top.csv 与 pmc_dispatch_info.csv
    • load_panel_configs(...) — 读取 panel YAML 配置
  • 指标解析 / 计算

  • libexec/rocprofiler-compute/utils/parser.py

    • load_table_data(...) — 入口:load_kernel_top() + eval_metric(...)
    • eval_metric(...) / AST 转换 / 表达式求值 / apply_filters(...)(CPU/内存密集)
  • 绘图 / UI 生成

  • libexec/rocprofiler-compute/utils/gui.py — build_bar_chart, build_table_chart

  • libexec/rocprofiler-compute/utils/gui_components/* — header、memory chart 等小组件

2.2 Standalone GUI架构图

启动脚本 `bin/rocprof-compute` → 控制器 `RocProfCompute`(`libexec/rocprofiler-compute/rocprof_compute_base.py`)→ 分析器 `webui_analysis`(`libexec/rocprofiler-compute/rocprof_compute_analyze/analysis_webui.py`)→ Dash 回调 `generate_from_filter` → 数据加载 `file_io.create_df_pmc`(`libexec/rocprofiler-compute/utils/file_io.py`)→ 指标计算 `parser.load_table_data`(`libexec/rocprofiler-compute/utils/parser.py`)→ 图表生成 `utils.gui`(`libexec/rocprofiler-compute/utils/gui.py`)并返回给 Dash 前端。

image

 

总体架构图从“分层 + 入口控制器 + 技术栈”的角度,可以分块理解:

  • 入口与分层说明
    • Entry 对应脚本 bin/rocprof-computeRocProfCompute 是主控制器类,负责根据 mode 选择 webui_analysis
    • webui_analysis 在 pre_processing 中调用 DataIO/Analysis 层,在 run_analysis 中初始化并运行 WebServer 层(Dash/Flask);
    • Socs 节点代表 OmniSoC/架构模块(roofline_objspec),在 pre_processing 和 roofline 相关图表中被 Analysis 层使用。
    • WebServer 层通过 Dash/Flask 把下方 DataIO/Analysis/GUI/UX 的计算结果暴露为 Web UI。
    • 图中的 FileIOKernelTopWorkload 等节点体现了数据从 CSV → DataFrame → 业务指标 → 图表的流转;
    • DataIO 层由 file_io.create_df_pmccreate_df_kernel_top_stats 等函数组成,将磁盘 CSV 转换为内存 DataFrame/统计 CSV;
    • Analysis 层使用 parser.load_table_data 和 eval_metric 把原始计数器数据转换为面向 GUI 的业务指标表,存放在 workload.dfs 中;
    • GUI 层通过 utils.gui 和 Dash 组件把业务表渲染为 Plotly 图表/表格;
    • UX 层由 generate_from_filter 回调和前端筛选控件共同构成,负责收集用户输入并驱动各层重新计算。
  • 技术栈映射
    • Python 3.x 作为语言运行时;Dash/Flask 提供 Web 框架和 HTTP Server;Plotly/dcc/dash_table/dbc 构成前端可视化和 UI 组件;
    • pandas 提供 CSV 读取和 DataFrame 运算,ast/astunparse 提供指标表达式解析与转换,共同支撑 Analysis 层的指标计算。

3. 控制流 & 数据流

3.1 控制流

rocprof_analysis_ui

该控制流图从 CLI 到浏览器的完整执行步骤可以细分为:

  1. 命令行入口与模式分发
    • 用户调用 bin/rocprof-compute --mode analyze --web-ui ...
    • main() 中构造 RocProfCompute 实例,根据 mode/子参数选择 webui_analysis 作为分析器。
  1. 分析器初始化与预处理
    • 在 webui_analysis.__init__ 中创建 dash.Dash 应用并持有 self.app
      • self.app 是通过 dash.Dash(...) 创建的 Dash 应用实例。Dash 本身封装了一个 Flask 应用在 self.app.server(类型为 flask.app.Flask)。
    • 调用 pre_processing()
      • 通过 OmniAnalyze_Base.pre_processing 加载 profiling 配置、sysinfo、SoC 定义;
      • 调用 initalize_runs() 为每个输入目录创建 self._runs[...] 结构;
      • 通过 file_io.create_df_pmc / create_df_kernel_top_stats 构建初始 raw_pmc 与 kernel top CSV;
      • 再由 parser.load_kernel_top 将 kernel top 读入 DataFrame,并设置 self.arch 等元信息。
  1. 启动 Web 服务
    • run_analysis() 中根据当前架构配置调用 build_layout(...) 构建页面布局:
      • 生成页面 header(utils.gui_components.header.get_header
      • 插入 spinner 与 html.Div(id="container")
      • 注册 Dash 回调 generate_from_filter(监听多个 Input/State)
    • 调用 self.app.run(...) 启动 Dash/Flask Web Server,监听指定端口等待浏览器请求。
      • 调用 self.app.run(...) 最终等效于对底层 Flask 应用的 run 方法(flask.app.Flask.run)进行调用——该方法会用 werkzeug 的开发服务器(werkzeug.serving.run_simple)监听你传入的 host/port 并处理请求。
  1. 浏览器访问与事件派发
    • 浏览器访问 http://host:port,Dash/Flask 返回初始布局 HTML + JS;
    • 用户在前端页面上操作筛选控件(Dispatch 下拉框、Kernel 过滤、GCD 选择、Normalization、Top-N 等),这些操作被 Dash 前端 JS 打包成 HTTP 请求发回后端。
  1. 回调执行与结果返回
    • Dash Server 收到请求后,根据触发的 Input/State 调用服务器端的 generate_from_filter(...)
      • 重新初始化 runs:base_data = self.initalize_runs(normalization_filter=norm_filt)
      • 复制 panel configs:panel_configs = copy.deepcopy(arch_configs.panel_configs)
      • 重新生成原始 pmc dataframe:
        • base_data[base_run].raw_pmc = file_io.create_df_pmc(self.dest_dir, nodes, ...)
        • 若需要:spatial_multiplex_merge_counters(...)
      • 设置过滤条件(kernel/gpu/dispatch/top_n)
      • 重新生成 Top Stats(file_io.create_df_kernel_top_stats(...)
      • 条件下只保留基本指标(若无筛选)
      • 关键一步:parser.load_table_data(workload=base_data[base_run], dir=self.dest_dir, is_gui=True, args=self.get_args())
        • load_table_data 会调用 load_kernel_top(...)(除 skip),然后 eval_metric(...)
        • eval_metric(...) 在内存 DataFrame 上执行 AST 转换、表达式求值、groupby/agg 等,最后更新 workload.dfs
      • 生成 UI 元素:
        • memory chart:get_memchart(...)utils/gui_components/memchart.py
        • roofline(可选):self.get_socs()[self.arch].empirical_roofline(...)
        • 遍历 panel_configs,每个 table:
          • original_df = base_data[base_run].dfs[table_config["id"]]
          • determine_chart_type(...) → 内部调用:
            • utils.gui.build_bar_chart(...) 或 utils.gui.build_table_chart(...)
          • 组装返回的 Plotly 图/表到 div_children
      • 返回 div_children 给 Dash(更新前端)
    • Dash 将更新后的组件树序列化回前端,浏览器据此更新页面中的 Graph/Table 部分,实现一次交互闭环。

3.2 数据流(强调 CSV → Pandas)

profiling_data_pipeline

这张数据流图强调“数据对象”的生命周期,各阶段可以总结为:

  • 输入阶段(磁盘 CSV / 配置)
    • Profiling 输出目录中包含 pmc_perf.csv、各类 SQ*.csvpmc_kernel_top.csvpmc_dispatch_info.csvsysinfo.csvprofiling_config.yaml 等文件;
    • 这些文件由 Profiling Pipeline 生成,是 GUI 端所有分析的原始数据源。
  • 装载与预聚合阶段(DataIO)
    • file_io.create_df_pmc 扫描指定目录的多个 CSV,依据节点/时间/计数器类型等信息合并为一个多层列索引的 raw_pmc DataFrame;
    • file_io.create_df_kernel_top_stats 基于 raw_pmc 计算 kernel top、dispatch 级别的统计信息,输出新的 CSV 文件;
    • parser.load_kernel_top 将这些统计 CSV 装载到 DataFrame 中,挂到对应的 run 结构下。
  • 分析计算阶段(Analysis Engine)
    • parser.load_table_data 根据 panel 配置和当前筛选条件,对 raw_pmc、kernel top 等 DataFrame 进行过滤、分组聚合和表达式求值(eval_metric);
    • 计算结果以多张命名 DataFrame 的形式存入 workload.dfs[...],这些表直接驱动后续 GUI 渲染。
  • 可视化阶段(GUI)
    • utils.gui.build_bar_chart / build_table_chart 等函数从 workload.dfs 中取出指定 ID 的 DataFrame,转换为 Plotly Figure 或 Dash DataTable;
    • 这些 Figure/表与周围的布局组件(标题、说明、控制按钮等)一起构成返回给前端的组件树。
  • 交互闭环阶段(前端筛选 → 后端重算)
    • 用户在浏览器中修改 Dispatch/Kernel/GCD/Normalization/Top-N 等筛选控件,Dash 前端 JS 将新状态发送到后端;
    • 后端重新执行上述 DataIO + Analysis + GUI 过程,返回新的图表和表格;
    • 因为核心数据读取/合并逻辑依赖 create_df_pmc,如果没有缓存机制,这一阶段会重复大量 CSV IO 和 Pandas 计算,是潜在性能瓶颈。

数据流与性能热点(要点)

  • 数据流简述:

    • 原始 profiling 输出(目录下 pmc_perf.csvSQ*.csvpmc_kernel_top.csv 等) → file_io.create_df_pmc 用 pandas 读入并合并为 raw_pmc → parser.load_table_data(apply_filters + eval_metric)计算并填充各个 workload.dfs → utils.gui 生成 Plotly figure → Dash 前端渲染。
  • 性能热点(可改进点):

    1. create_df_pmc: 每次 Dash 回调都会读 CSV 并合并(高 IO 开销)。
    2. parser.eval_metric: 在内存 pandas 上做大量 groupby/表达式求值,CPU 密集。
    3. Dash 回调是同步阻塞:回调执行期间页面无响应,可能超时或卡顿。

4. 关键技术栈 & 业内对比

分类当前短期建议长期建议简要理由
数据格式 CSV + pandas DataFrame 保留 CSV 原始输入;在 create_df_pmc 输出写 Parquet 做缓存 Parquet 为主持久层,按 workload/参数分区;支持 DuckDB/Polars Parquet 列式、高压缩、与加速引擎兼容,减少重复 IO
数据处理 pandas + 自定义 AST 优先命中 Parquet 缓存;关键聚合可用 DuckDB SQL 把热点计算迁移到 Polars 或 DuckDB(并行化) 提升并行与内存效率,降低 GIL/CPU 瓶颈
存储 / 查询引擎 无专门引擎(文件为主) 本地使用 Parquet + 可选嵌入 DuckDB 做聚合 引入 DuckDB 为主或 ClickHouse(规模大时) DuckDB 对本地分析友好,ClickHouse 支持高并发 OLAP
缓存 / 状态 无或有限(内存) 使用 Parquet 文件做持久缓存;短期可引入 Redis 作小对象缓存 Redis + 本地/对象存储(S3)做缓存层,结合 CDN/反向代理 减少重复计算与IO,提升并发响应
异步任务队列 无(回调同步阻塞) 将重计算任务封装为后台任务(RQ/Celery + Redis),前端轮询/WS 完整异步架构:任务队列 + 可扩展 worker 池 + 结果持久化 避免回调阻塞,提高并发与用户体验
Server(API) Dash (Flask),dev server self.app.run 明确使用 self.app.run_server()生产用 gunicorn/nginx 拆为 FastAPI 后端 + workerASGI (uvicorn) + gunicorn 管理 短期稳定化,长期可异步并水平扩展
Client(交互层) Dash 前端(dcc、dash_table、dbc) 保留 Dash;减少阻塞逻辑,使用 WS/轮询展示后台任务结果 前端改用 React + Plotly.js/Vega;采用 WebSocket 推送 Dash 快速开发,React 更灵活、高性能的生产级 UI
GUI / 可视化 Plotly / plotly.express,custom helpers Plotly + WebGL(scattergl)/服务端下采样 Plotly.js/Deck.gl/Vega 联合,GPU 加速前端渲染 支持大量点和复杂图交互
部署 / 编排 手动 / dev server 使用 gunicorn 多 worker + nginx 反向代理 Docker + Kubernetes / Nomad + CI/CD 生产化、可扩展、自动化部署
观测 / 日志 / 追踪 基本日志 增加结构化日志(JSON)、指标(Prometheus)和简单追踪 Prometheus + Grafana + Jaeger/OpenTelemetry 监控性能、定位瓶颈、报警与用户可视化
认证 / 安全 未见专门机制 在前端/服务层增加简单访问控制(IP 或 基本 auth) OAuth2 / JWT + HTTPS + RBAC + 审计日志 保护数据和远程访问,合规和生产安全需求
测试 / CI 未见完备测试 增加单元测试与集成测试(关键 compute 函数) 完整 CI/CD(lint/test/build/deploy)与回归套件 保证改动安全、降低回归风险
数据采集 / 预处理 CSV 由 profiler 输出 保持 profiler 输出;在 ingest 层做预检和元数据生成 建立 ETL/调度(定期预处理、增量导入) 稳定数据输入,便于后续缓存与查询
硬件 / 加速 CPU + pandas(无特化加速) 对昂贵计算使用多核或分批处理 使用 SIMD/Rust(Polars)、GPU 加速(如 Rapids)在需要时 加速大数据集处理,缩短响应时间
包 / 依赖 / 环境 requirements.txt / pyproject 明确 requirements.txt、虚拟环境和可复现镜像 使用 lockfile(pipenv/poetry/pip-tools),提供 Docker 镜像 可复现环境,便于部署与协作

5 增强

5.1 打开Debug mode

修改/opt/rocm-7.0.1/libexec/rocprofiler-compute/rocprof_compute_analyze/analysis_webui.py:

    def run_analysis(self):
        """Run CLI analysis."""
        super().run_analysis()
        args = self.get_args()
        input_filters = {
            "kernel": self._runs[self.dest_dir].filter_kernel_ids,
            "gpu": self._runs[self.dest_dir].filter_gpu_ids,
            "dispatch": self._runs[self.dest_dir].filter_dispatch_ids,
            "normalization": args.normal_unit,
            "top_n": args.max_stat_num,
        }

        self.build_layout(
            input_filters,
            self._arch_configs[self.arch],
        )
        if args.random_port:
            self.app.run(debug=True, host="0.0.0.0", port=random.randint(1024, 49151))
        else:
            self.app.run(debug=True, host="0.0.0.0", port=args.gui)

 

 

 

posted on 2025-11-16 23:59  ArnoldLu  阅读(48)  评论(0)    收藏  举报

导航