使用进程栈采集功能
AIStudio 训练服务提供进程栈采集功能,帮助您诊断任务挂起和性能问题。该功能可在任务挂起时自动采集进程栈数据,或在任务运行中手动触发采集,为分布式训练调试提供详细的执行状态信息。
前提条件
使用进程栈采集功能需要满足以下要求:
- 任务处于运行状态:任务必须正在执行才能采集进程栈数据。
- 开启 Hang 检测(自动采集):如需在任务挂起时自动采集进程栈,必须先在容错配置中开启 Hang 检测功能。
- 了解任务特征:建议了解您的训练框架和代码结构,以便更好地解读进程栈信息。
开启进程栈采集
通过任务配置,您可以在在任务 Hang 时自动采集进程栈。即使关闭自动采集,仍可手动采集。推荐在生产环境或历史上出现过挂起问题的任务中开启。
配置自动采集
在创建任务、改配任务、克隆任务时,均可配置自动采集进程栈。
- 在容错配置区域,开启 Hang 检测功能。
- 在进程栈采集配置区域,将开关切换为开启状态。

重要
进程栈采集配置区域仅在容错配置区域的 Hang 检测功能开启后可用。
手动采集进程栈
无论是否开启自动采集,都可在任务运行中手动触发采集。
- 进入任务详情页
- 点击进程栈采集标签
- 点击手动采集按钮
- 等待采集完成(通常几秒到几十秒)
适用于性能分析、问题诊断或对比不同时间点的执行状态。
查看进程栈采集结果
进程栈采集数据保存在任务详情页的进程栈采集标签中,保留 30 天。

该标签包含三个子标签:
- 报告:自动分析的函数调用统计报告
- 进程栈:原始进程栈跟踪数据
- NCCL 状态:NCCL 通信状态信息(如适用)
查看报告
报告标签显示对进程栈数据的自动分析结果,包括函数调用统计和进程信息。
报告内容
报告包含以下关键信息:
摘要信息(summary):
- 分析时间(analysis_time)
- 任务 ID(job_id)
- 节点名称(node_name)
- 总进程数(total_processes)
- 成功/失败进程数(successful_processes / failed_processes)
- 函数调用总数(total_function_calls)
- 唯一函数数量(unique_functions)
函数调用统计(function_stats):
每个函数包含:
function:函数名称和源代码位置count:调用次数sources:调用该函数的 rank 列表
进程信息(process_infos):
每个进程包含:
Rank:进程 rank 编号GpuID:关联的 GPU IDPodName:Pod 名称ProcessName:进程名称
报告数据示例
{
"function_stats": [
{
"count": "8",
"function": "wait /usr/lib/python3.12/threading.py:655",
"sources": ["gpu33-rank0", "gpu33-rank1", "gpu33-rank2", ...]
},
{
"count": "7",
"function": "synchronize /usr/local/lib/python3.12/dist-packages/torch/cuda/__init__.py:1040",
"sources": ["gpu33-rank0", "gpu33-rank1", "gpu33-rank2", ...]
}
],
"summary": {
"total_processes": "8",
"successful_processes": "8",
"total_function_calls": "235",
"unique_functions": "34"
}
}报告按 count(调用次数)降序排列函数调用统计,方便识别最频繁执行的代码路径。
导出报告数据
报告数据以 JSON 格式显示,可以:
- 直接在浏览器中查看和分析
- 使用浏览器的复制到剪贴板功能复制数据
- 粘贴到文本编辑器或分析工具中进一步处理
查看进程栈详情
进程栈标签显示每个进程的原始栈跟踪信息,提供详细的 Python 层调用栈。
筛选和查看进程栈
进程栈标签支持按 Worker 和 GPU 筛选进程:
- 在进程栈标签中,使用下拉菜单或筛选器选择特定的 Worker 和 GPU
- 例如:选择
worker-0-gpu-0查看该 GPU 对应进程的栈跟踪 - 可以逐个查看不同 Worker 和 GPU 的进程栈,对比不同进程的执行状态
进程栈数据格式
进程栈数据以 JSON 数组格式组织,每个元素代表一个线程的完整信息。
数据结构:
[
{
"pid": 4090770,
"thread_id": 139911894196992,
"thread_name": "MainThread",
"os_thread_id": 19384,
"active": true,
"owns_gil": false,
"frames": [
{
"name": "forward_backward_pipelining_without_interleaving",
"filename": "/workspace/Megatron-LM-0.10.0/megatron/core/pipeline_parallel/schedules.py",
"short_filename": "core/pipeline_parallel/schedules.py",
"line": 1790
},
{
"name": "train_step",
"filename": "/mnt/public/.../nvidia/training.py",
"short_filename": "nvidia/training.py",
"line": 770
}
]
}
]字段说明:
pid:进程 IDthread_id:线程 IDthread_name:线程名称(如MainThread、QueueFeederThread)os_thread_id:操作系统线程 IDactive:线程是否活跃owns_gil:是否持有 Python GIL(全局解释器锁)frames:调用栈帧数组,从最内层函数到最外层函数排列name:函数名称filename:源文件完整路径short_filename:源文件简短路径line:行号
数据特点:
- 每个进程可能包含多个线程(主线程、数据加载线程、后台线程等)
active: true且frames为空的线程通常是正在执行原生代码的线程active: false的线程通常处于等待状态
注意
进程栈采集仅提供 Python 层的栈帧信息。栈跟踪不包含 C++、CUDA 或其他原生代码的栈帧。
查看 NCCL 状态
NCCL 状态标签显示 NCCL 通信系统的运行状态,帮助诊断分布式通信问题。
注意
NCCL 状态信息由 NCCL RAS Server 提供,仅在使用 NCCL 进行分布式通信时可用。
NCCL 状态报告内容
版本信息:
NCCL version 2.26.3 compiled with CUDA 12.9
CUDA runtime version 12090, driver version 12080任务摘要:
Nodes Processes GPUs per process Processes (total) GPUs (total)
1 8 1 8 8显示任务的节点数、进程数和 GPU 数。
通信器状态(Communicators):
Group Comms Nodes Ranks Ranks Ranks Status Errors
# in group per comm per node per comm in group
0 1 1 7 8 7 RUNNING INCOMPLETE
3 2 1 2 2 4 RUNNING OK每个通信组的状态:
- RUNNING:通信器正在运行
- INIT:通信器正在初始化
- OK:通信正常
- INCOMPLETE:部分 rank 数据缺失
错误信息(Errors):
DEAD
1 job process is considered dead (unreachable via the RAS network)
Process 19377 on node 172.25.9.225 managing GPU 0
#0-0 (0623e6289c3f6e3c) INCOMPLETE
Missing communicator data from 1 rank
Rank 0 -- GPU 0 managed by process 19377 on node 172.25.9.225显示检测到的通信错误:
- DEAD:进程不可达
- INCOMPLETE:缺失部分 rank 数据
警告信息(Warnings):
可能的性能或配置问题。
数据保留和管理
数据保留期限
进程栈采集数据保留 30 天,过期后自动删除。
数据导出
进程栈数据无法直接导出下载,但可以通过直接复制到剪贴板。
性能影响
进程栈采集基于 py-spy 工具实现,对任务性能的影响极小:
- 自动采集:仅在 Hang 检测触发时执行,正常运行时无性能开销
- 手动采集:采集过程通常持续几秒,对训练任务影响可忽略
- 后台进程:采集使用独立进程,不占用训练任务的 GPU 或主要计算资源
建议在生产环境中开启自动采集,以便在问题发生时第一时间获取诊断数据。
相关文档
- 容错功能 - Hang 检测:了解 Hang 检测功能及其配置
- 使用 atlctl 进行原地调试:了解手动调试工具
- 查看容错日志:了解如何查看任务的容错日志