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),仅供参考

相关新闻

零之轨迹改之理实战项目选型避坑指南

零之轨迹改之理实战项目选型避坑指南

零之轨迹改之理实战项目选型避坑指南 版本升级后 API 全变了,这种噩梦般的体验相信不少在实战项目中摸爬滚打过的老手都经历过。尤其是当项目核心逻辑依赖特定底层接口时,一次看似常规的更新可能让原本稳定的代码库瞬间崩塌,重构成本高昂且充满不确定…

2026/9/21 23:18:14 阅读更多 →
图解原理:周期函数计算慢?3招让性能提升10倍

图解原理:周期函数计算慢?3招让性能提升10倍

图解原理:周期函数计算慢?3招让性能提升10倍 看了一堆教程还是不会写项目?这是很多开发者在接触数学库或自定义算法时的真实困境。尤其是处理 周期函数 时,理论懂了,代码跑起来却卡得让人想砸键盘。别急,今天不整虚的,直接上干货。我们用…

2026/9/21 23:18:14 阅读更多 →
代数公式高频面试题:新手避坑指南与实战拆解

代数公式高频面试题:新手避坑指南与实战拆解

代数公式高频面试题:新手避坑指南与实战拆解 刚拿到面试笔试题,看到几道代数公式推导,心里直发虚?复制网上的代码或者公式跑不通,改了一晚上还是报 SyntaxError 或者逻辑全错?别慌,这其实是 代数公式…

2026/9/21 23:17:13 阅读更多 →

最新新闻

水利人转前端避坑指南:3招搞定乱插数据难题

水利人转前端避坑指南:3招搞定乱插数据难题

水利人转前端避坑指南:3招搞定乱插数据难题 很多刚转行前端的水利工程师,手里攥着《水力学》课本,代码敲得飞起,但一到真实业务就懵了:学会语法却不知怎么搭项目。特别是处理水文站点的实时数据流时,那种“乱插”——即非时序、乱序、甚至重复的数据插…

2026/9/22 3:37:04 阅读更多 →
3步搞懂盒图解原理告别Stack Trace报错

3步搞懂盒图解原理告别Stack Trace报错

3步搞懂盒图解原理告别Stack Trace报错 盯着屏幕满屏红色的 Stack Trace,你是不是感觉脑子像被塞了一团浆糊?那些 NullPointerException 、 Segmentation Fault…

2026/9/22 3:37:04 阅读更多 →
短线选股绝招保姆级教程:从零搭建量化实战项目

短线选股绝招保姆级教程:从零搭建量化实战项目

短线选股绝招保姆级教程:从零搭建量化实战项目 看了一堆教程还是不会写项目?别急,这篇短线选股绝招保姆级教程带你从零搭建。 项目目标与痛点直击…

2026/9/22 3:37:04 阅读更多 →
3个坑让你搞懂卡门序曲源码解析

3个坑让你搞懂卡门序曲源码解析

3个坑让你搞懂卡门序曲源码解析 版本升级后 API 全变了?别慌。很多刚入行的朋友发现,原本熟悉的代码跑不起来了,报错信息看得人一头雾水。这时候光看文档不够,直接去啃【源码解析】才是正解。特别是针对“卡门序曲”这类经典算法模型在移动端适配时…

2026/9/22 3:37:04 阅读更多 →
魔域3.2无敌版之富甲天下图解原理:3个方案选型避坑

魔域3.2无敌版之富甲天下图解原理:3个方案选型避坑

魔域3.2无敌版之富甲天下图解原理:3个方案选型避坑 报错堆了一屏幕,红色StackTrace密密麻麻,新手看着就头大。别慌,这种时候硬啃日志效率极低,不如直接看 图解原理…

2026/9/22 3:36:04 阅读更多 →
程序员自救指南:用3句鼓励语治好代码跑不通的焦虑,从入门到精通

程序员自救指南:用3句鼓励语治好代码跑不通的焦虑,从入门到精通

程序员自救指南:用3句鼓励语治好代码跑不通的焦虑,从入门到精通 盯着屏幕上一片红色的报错日志,手抖得连鼠标都握不住。 你复制了全网点赞最高的代码,结果一跑就崩,改了半小时还是没反应。 这种“我是不是不适合写代码”的自我怀疑,才是阻碍你从…

2026/9/22 3:36:04 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →