首页/新闻资讯/正文详情

Ray Data 基准测试 Profile 分析:speedscope / collapsed stacks 命令行分析工具实战

发布时间:2026/9/25 14:47:08 来源:云帆数科 栏目:资讯中心
Ray Data 基准测试 Profile 分析:speedscope / collapsed stacks 命令行分析工具实战
人工智能分布式训练强化学习任务调度模型推理服务【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址https://gitcode.com/gh_mirrors/ra/ray点击查看免费下载本篇指南围绕 Ray 仓库中release/nightly_tests/dataset/profiling/analysis/目录下的 Profile 分析脚本展开它们用于在 Ray Data 基准测试如image_embedding_from_jsonl运行结束后对 py-spy 与 perf 产出的剖析数据做离线分析。读完本文你将掌握如何用analyze_pyspy_profile.py从 speedscope JSON 中提取叶子函数自耗时、包含耗时、调用者/被调用者栈与调用图如何把 perf 的 collapsed stacks 文本转换为 speedscope JSON 并批量汇总线程耗时以及如何从 Anyscale 下载作业日志与 S3 遥测数据跑通跑基准 → 下载产物 → 分析热点的完整工作流。一、脚本总览一套独立于剖析模块的 CLI 工具profiling/analysis/下的四个脚本操作的是标准格式speedscope JSON、collapsed stacks不依赖 profiling 模块 本身因此可以脱离基准测试单独使用脚本作用输入输出analyze_pyspy_profile.py分析 speedscope JSON支持叶子自耗时、包含耗时、调用者/被调用者栈、调用图、类别分组、全栈转储*.speedscope.json终端 Markdown 表格 / 调用栈文本collapsed_to_speedscope.py将 collapsed stacksperf.generate_collapsed_stacks()的产物转换为 speedscope JSON*_collapsed.txt*.speedscope.jsondownload_job_output.sh下载 Anyscale 作业日志与 S3 遥测数据到本地job ID S3 prefixprodjob_xxx/目录analyze_perf_profiles.sh批量把目录下所有perf_*_collapsed.txt转为 speedscope JSON 并生成线程汇总多个perf_*_collapsed.txt*.speedscope.jsonperf_thread_summary.txt所有脚本入口都有#!/usr/bin/env与 ABOUTME 注释可直接执行或作为参考实现阅读。二、analyze_pyspy_profile.pyspeedscope JSON 分析主力该脚本读取 speedscope 采样格式type: sampled的 JSON核心数据结构是shared.frames帧表与每个 profile 的samples帧索引栈列表和weights每个栈的采样权重。分析类型由参数决定主要分五类。2.1 线程列表先看清有哪些线程--list-threads会遍历data[profiles]统计每个 profile线程的采样数、总 CPU 时间与占比按耗时降序输出表格./analyze_pyspy_profile.py pyspy_driver.speedscope.json --list-threads输出示例格式由脚本中的format_table生成SamplesCPU time% totalThread name523152.31s42.3%StreamingExecutor............从源码看analyze_pyspy_profile.py线程名取自 profile 的name字段py-spy 记录的线程名形如Process NNNN Thread 0xHEX name分析脚本会在打印调用栈时用rsplit(, 2)提取引号内的短线程名。2.2 叶子函数自耗时self-timeTop N叶子函数即每个采样栈的最深一帧代表这个函数自己执行时被采样到的时间。脚本核心逻辑在analyze_self_time对每个样本取stack[-1]作为叶子累加其权重。# 默认全部线程、Top 20 ./analyze_pyspy_profile.py pyspy_driver.speedscope.json # 只看 StreamingExecutor 线程、Top 30 ./analyze_pyspy_profile.py pyspy_driver.speedscope.json --thread StreamingExecutor --top 30--thread是子串匹配不区分大小写匹配到的多个 profile 的样本会合并分析。输出表格列为Samples / Self % / Self time / Function / Location其中 Location 是文件名:行号取自帧的file/line字段仅取 basename。2.3 包含耗时inclusive time对比--inclusive接受逗号分隔的函数名统计目标函数出现在栈中任意位置不一定是叶子时的权重与样本数。源码analyze_inclusive_time特别处理了递归场景同一函数在一个栈中出现多次只计一次避免递归调用重复计费。./analyze_pyspy_profile.py pyspy_driver.speedscope.json \ --thread StreamingExecutor \ --inclusive invoke_detectors,detect,get_task输出Samples / Inclusive % / Inclusive time / Function请求的函数未在样本栈中出现时会以(not found)标记补零行便于排查我以为在跑但实际没跑到的热点。2.4 调用者栈callers与调用图call-graph--callers func输出目标函数的所有唯一调用链从栈根到目标函数按累计权重排序并用缩进层级展示调用深度目标函数以** func **高亮。--depth控制展示的最大栈深度默认 50表示不限--top控制展示条数此处默认 5。源码analyze_caller_stacks取目标在栈中的最深出现位置以覆盖递归场景并按(调用链, 线程名)分组。# readinto 的 Top 10 调用者栈 ./analyze_pyspy_profile.py pyspy_driver.speedscope.json \ --thread StreamingExecutor --callers readinto --top 10 # 最多 8 帧上下文 ./analyze_pyspy_profile.py pyspy_driver.speedscope.json \ --thread StreamingExecutor --callers readinto --depth 8--call-graph func更进一步一次性输出三块内容Inclusive / Self-time 汇总目标函数在样本栈中出现任意位置与作为叶子栈底的样本数与耗时Callers从根到目标函数的唯一调用链此处取最浅出现位置保证与 callee 在同一处切分Callees从目标函数到叶子的唯一被调用链单独列出目标即叶子的自耗时条目。./analyze_pyspy_profile.py pyspy_driver.speedscope.json \ --thread StreamingExecutor --call-graph detect \ --depth 8 --top 10这在定位detect 由谁调用、又消耗在哪里时非常有用一张命令同时回答来源与去向。2.5 类别分组把同类热点函数归并脚本内置了DEFAULT_CATEGORIES把常见热点按语义归类例如Actor state__hash__、_get_local_state、refresh_actor_state、running_actors、max_tasks_in_flight_per_actor等HTTP/detectreadinto、_make_http_get_request、ray_address_to_api_server_url、internal_kv_get_with_retry等List/set comprehensionslistcomp、setcomp、dictcompHeapDict_decrease_key、_swap、_build_actor_busyness_heap等Scheduling miscwait、safe_round、select_operator_to_run。默认输出 Self-Time by Category 汇总表Self % / Self time / Category / Functions未匹配的函数归入Other。也可以传入自定义分类 JSON{category: [func_names]}覆盖默认分类或用--no-categories关闭分类只显示叶子明细./analyze_pyspy_profile.py pyspy_driver.speedscope.json \ --thread StreamingExecutor --categories categories.json从源码看categorize_functions先建立 函数名→类别 反查表再把叶子自耗时按类别累加每个类别最多展示 6 个函数名超出以, ...省略。这类分组尤其适合把分布式的调度开销Actor 状态刷新开销从海量叶子函数中聚合出来。2.6 全栈转储--full--full把所有唯一栈完整函数名序列按累计权重分组并降序输出默认全部展示若同时传--top N则只展示前 N 条。每条栈同样以缩进 **标记叶子./analyze_pyspy_profile.py pyspy_driver.speedscope.json --thread StreamingExecutor --full2.7 参数速查表参数别名默认值说明profile—必填speedscope JSON 路径--thread-t全部按线程名子串过滤大小写不敏感--top-n20Top N 数量对 callers/call-graph 默认 5--inclusive-i无逗号分隔函数名统计包含耗时--categories-c内置分类自定义分类 JSON 文件--no-categories—关闭跳过类别汇总只显示叶子函数--callers—无输出该函数的调用者栈--depth—5--callers/--call-graph最大栈深0不限--call-graph—无输出 callers self-time callees--full—关闭按权重输出所有唯一栈--list-threads—关闭列出所有线程后退出三、collapsed_to_speedscope.py把 collapsed stacks 变成标准格式perf 数据经过折叠后是分号分隔栈 权重的文本行perf.generate_collapsed_stacks()的产物格式为stack;frame1;frame2;... leaf weight。该脚本将其解析为 speedscope JSON使其既能导入 speedscope 可视化又能被analyze_pyspy_profile.py复用。./collapsed_to_speedscope.py perf_gcs_collapsed.txt -o gcs.speedscope.json关键实现细节collapsed_to_speedscope.py帧名清洗_clean_frame用正则\0x[0-9a-f]$剥掉帧名尾部的十六进制偏移如func0x1a2b3c保证同名函数聚合按首帧分组线程perf 输出的每个栈首帧是线程/进程名脚本把它当作 profile线程名每个线程生成一个独立的sampledprofileunit为seconds权重单位自适应取全部权重的中位数若大于 100,000 判定为纳秒周期stackcollapse-perf.pl 风格统一乘以1e-9转秒否则按采样计数处理以--freq默认 99 Hz即每样本约 0.0101s折算成秒——这与 perf record 的-F 99采样频率一致去重帧表通过frame_index字典把函数名去重到共享帧表输出含$schema、shared.frames、profiles、exporter字段的合法 speedscope JSON。默认输出名由输入文件名推导依次去掉.collapsed.txt/_collapsed.txt/.txt后缀后拼.speedscope.json也可用-o指定用--name指定 profile 名。四、download_job_output.sh取回作业产物基准测试结束后产物由 telemetry.py 上传到 S3默认 bucket 由PROFILING_S3_BUCKET环境变量指定默认值为anyscale-staging-data-cld-kvedzwag2qa8i5bjxuevf5i7。下载脚本把作业日志和 S3 遥测一起拉到以 job ID 命名的本地目录./download_job_output.sh prodjob_abc123 image-embedding-jsonl/prodjob_abc123 # Creates prodjob_abc123/ with logs and telemetry files脚本流程download_job_output.shanyscale logs job --id $JOB_ID --download --download-dir .下载作业日志进入$JOB_ID目录aws s3 cp s3://${S3_BUCKET}/${S3_PREFIX}/ . --recursive递归拉取该前缀下的全部遥测文件py-spy、perf、nsys、GPU/网络监控、object store 状态等匹配 telemetry.py 中的DEFAULT_UPLOAD_PATTERNSpyspy_*、perf_*、nsys_*、gpu_usage*、net_counters*、object_store_state*等。注意S3_PREFIX由基准脚本通过profiling.stop(s3_prefixmy-benchmark/job_id)写入 S3下载时需保持一致。前置依赖本机需安装并配置anyscaleCLI 与awsCLI含凭据。五、analyze_perf_profiles.sh批量转换 线程汇总从 S3 下载的遥测目录里通常有多个perf_*_collapsed.txt每个采样节点一个。批量脚本遍历当前目录下所有匹配perf_*_collapsed.txt的文件逐个转成*.speedscope.json并把每个文件的线程列表追加写入perf_thread_summary.txtcd /path/to/downloaded/telemetry analyze_perf_profiles.sh # Produces: *.speedscope.json files perf_thread_summary.txt脚本逻辑analyze_perf_profiles.sh对每个perf_label_collapsed.txt取 basename 前缀作为$base调用collapsed_to_speedscope.py $collapsed -o $base.speedscope.json随后对该 speedscope 文件执行analyze_pyspy_profile.py --list-threads并把结果段落写入perf_thread_summary.txt。这样一条命令即可在数十个 perf 文件间快速横向对比各节点/各线程的 CPU 消耗。若目录中无匹配文件循环内的[ -f $collapsed ] || continue保证脚本安全退出。六、典型工作流从基准测试到热点定位结合 profiling 模块 README 的完整链路一个典型分析流程如下第 1 步开启剖析环境变量。在基准测试的job.yaml中设置PYSPY_ENABLED1driver 与工作节点 py-spy与PERF_PROFILING_ENABLED1GCS/raylet 的perf record采样频率 99Hz、fp 调用图运行基准测试。第 2 步下载作业输出./download_job_output.sh prodjob_abc123 image-embedding-jsonl/prodjob_abc123 cd prodjob_abc123第 3 步分析 py-spy 输出driver 侧文件名为pyspy_driver.speedscope.json见 pyspy.py 的start()./analyze_pyspy_profile.py pyspy_driver.speedscope.json --list-threads ./analyze_pyspy_profile.py pyspy_driver.speedscope.json --thread StreamingExecutor --top 30第 4 步转换并分析 perf 输出工作节点上pyspy_worker_nodeip_name.speedscope.json对应 UDF worker 剖析perf_*_collapsed.txt对应 GCS/raylet 剖析./analyze_perf_profiles.sh ./analyze_pyspy_profile.py perf_gcs.speedscope.json --list-threads6.1 产物命名的来源约定pyspy_driver*.speedscope.jsonpy-spy 以--subprocesses方式 attach 到 driver 进程默认 100Hz 采样、speedscope 格式日志写入同目录pyspy_driver.logpyspy_worker_nodeip_name.speedscope.json由_UDFPySpyProfileractor 在采样节点上 attach 到 UDF worker默认每节点最多 3 个、跳过 DashboardAgent/RuntimeEnvAgent 等基础设施进程同名进程自动追加_pidpid后缀perf_label_nodeip.data/_collapsed.txthead 节点对gcs_server与raylet采样工作节点由_RayletPerfProfileractor 对本地 raylet 采样数据在采集所在节点上即转为 collapsed stacks此时 runtime_env 动态库尚未卸载符号解析最完整详见 perf.py 中的说明。6.2 常见排错点No profiles matching thread filter先用--list-threads确认线程名的准确写法--thread是子串匹配例如Streaming即可命中StreamingExecutorperf 转换后大量[unknown]collapsed stacks 必须在录制数据的节点上、/tmp/ray/session_*目录尚在时转换否则动态库符号解析失败权重单位异常若 perf 数据来自不同采样频率转换时用--freq指定正确的 Hz 数否则每秒折算误差会直接放大到耗时数字上uncategorized/Other占比过高参考DEFAULT_CATEGORIES的结构自定义categories.json把业务函数归入可读类别再重新分析。七、小结profiling/analysis/是一套小而精的标准格式分析工具链download_job_output.sh负责把分布式基准的剖析产物汇总到本地collapsed_to_speedscope.py打通 perf 原生格式与 speedscope 生态analyze_pyspy_profile.py提供从叶子自耗时、包含耗时到调用者栈/调用图/类别归并的全方位视角analyze_perf_profiles.sh则把多节点 perf 数据批量整理成可横向对比的线程汇总。由于它们只依赖 speedscope JSON 与 collapsed stacks 两种公开格式完全可以从 Ray Data 基准测试中剥离出来直接服务于任何 py-spy / perf 剖析场景。结合 profiling 模块 README 与各脚本源码如 analyze_pyspy_profile.py、perf.py即可完整复现并定制这一套分布式性能剖析方案。赞分享人工智能分布式训练强化学习任务调度模型推理服务【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址https://gitcode.com/gh_mirrors/ra/ray点击查看免费下载相关推荐speedscope性能基准测试与其他分析工具的对比分析speedscope性能基准测试与其他分析工具的对比分析 在当今复杂的软件开发环境中性能分析工具已成为开发者的必备利器。 speedscope 作为一款快速开发工具前端how2性能基准测试终极指南AI命令行工具对比分析how2性能基准测试终极指南AI命令行工具对比分析 how2作为一款革命性的 AI命令行工具 通过自然语言查询帮助用户快速找到Unix命令极大地提升了命令开发工具AI 应用hyperfine命令行基准测试工具快速入门与实战指南hyperfine命令行基准测试工具快速入门与实战指南 项目介绍 hyperfine 是一个用于快速比较 shell 命令执行时间的开源工具。由 sharkd性能测试CLI开发工具上一篇CMS-Hunter终极教程从零开始构建完整的CMS安全测试平台下一篇ComfyUI-AnimateDiff-Evolved中的CameraCtrl自定义轨迹功能解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

C#实现海康设备批量校时:高精度、高容错、可验证的时间同步方案
C#实现海康设备批量校时:高精度、高容错、可验证的时间同步方案

1. 项目概述:为什么批量校时不是“点一下就完事”的操作在安防监控系统集成现场,我见过太多人把“给海康威视设备校时”当成一个鼠标点击就能解决的小功能——打开iVMS-4200,选中几十台设备,右键“同步时间”,然后盯着… · 2026/9/25 14:47:04

open-im-server S3 存储引擎切换与数据迁移指南:使用 s3convert 工具迁移对象存储数据
open-im-server S3 存储引擎切换与数据迁移指南:使用 s3convert 工具迁移对象存储数据

即时通讯后端微服务WebSocket 【免费下载链接】open-im-server IM Chat OpenClaw 项目地址: https://gitcode.com/gh_mirrors/op/open-im-server 点击查看 免费下载 导读 当 open-im-server 中的对象存储(S3 兼容存储)从 MinIO 切换到腾讯云… · 2026/9/21 23:17:36

搞懂3种核心架构模式,后端性能优化面试不再慌
搞懂3种核心架构模式,后端性能优化面试不再慌

搞懂3种核心架构模式,后端性能优化面试不再慌 翻开官方开发者文档,满屏的 UML 图和抽象概念,是不是让你一眼就想关掉?很多转岗后端的朋友,卡在“架构模式”这个坎上,不是代码写不出来,而是不知道什么时候该用哪种结构。面试被问“为什么这么设计… · 2026/9/21 23:17:36

WPScan 插件版本动态检测实战:以 plug-payments-gateway 插件的 Changelog 测试夹具为例
WPScan 插件版本动态检测实战:以 plug-payments-gateway 插件的 Changelog 测试夹具为例

网络安全漏洞扫描渗透测试应用安全CLI 【免费下载链接】wpscan WPScan WordPress security scanner. Written for security professionals and blog maintainers to test the security of their WordPress websites. Contact us via contactwpscan.com 项目地址: ht… · 2026/9/25 14:47:05

Atlas 300V 24G深度实战:YOLO模型部署与推理优化全攻略
Atlas 300V 24G深度实战:YOLO模型部署与推理优化全攻略

先回答那个高频问题:Atlas 300V 24G 到底是不是运算加速卡?是,但它不是你想的那种“显卡”。我实际拿它在 Ubuntu 服务器上部署过好几轮 YOLO 模型,从环境搭建、模型转换到推理调优都走了一遍。今天就把这条完整链路拆开讲清楚&am… · 2026/9/25 14:47:05

AIRI 开源AI伴侣部署指南:15分钟完成首次语音对话与Minecraft陪玩
AIRI 开源AI伴侣部署指南:15分钟完成首次语音对话与Minecraft陪玩

AIRI 开源AI伴侣部署指南:15分钟完成首次语音对话与Minecraft陪玩 【免费下载链接】airi 💖🧸 Self hosted, you-owned Grok Companion, a container of souls of waifu, cyber livings to bring them into our worlds, wishing to achieve N… · 2026/9/25 14:46:58

Pixelle-Video 完整安装指南:三条路线从零到出片,整合包、源码、Docker 一次讲透
Pixelle-Video 完整安装指南:三条路线从零到出片,整合包、源码、Docker 一次讲透

Pixelle-Video 完整安装指南:三条路线从零到出片,整合包、源码、Docker 一次讲透 【免费下载链接】Pixelle-Video 🚀 AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pix… · 2026/9/25 14:46:58

Atlas 300V 24G推理加速卡与YOLO模型部署实战指南
Atlas 300V 24G推理加速卡与YOLO模型部署实战指南

最近好几个朋友问我同一个问题:Atlas到底是个啥?是不是一块运算加速卡?能不能直接拿来跑YOLO目标检测?这个问题问得很实在。Atlas这个名头在AI圈子里越来越响,但搜出来的信息要么是产品彩页,要么是官方文档… · 2026/9/25 14:46:58

buildah 依赖剖析:filepath-securejoin 安全路径连接库的旧/新双 API 设计
buildah 依赖剖析:filepath-securejoin 安全路径连接库的旧/新双 API 设计

云原生 【免费下载链接】buildah A tool that facilitates building OCI images. 项目地址: https://gitcode.com/gh_mirrors/bu/buildah 点击查看 免费下载 本文围绕 buildah 项目(go.podman.io/buildah)中实际 vendored 的第三方库 vendor… · 2026/9/25 14:46:52

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码