Skip to content

使用进程栈采集功能

AIStudio 训练服务提供进程栈采集功能,帮助您诊断任务挂起和性能问题。该功能可在任务挂起时自动采集进程栈数据,或在任务运行中手动触发采集,为分布式训练调试提供详细的执行状态信息。

前提条件

使用进程栈采集功能需要满足以下要求:

  • 任务处于运行状态:任务必须正在执行才能采集进程栈数据。
  • 开启 Hang 检测(自动采集):如需在任务挂起时自动采集进程栈,必须先在容错配置中开启 Hang 检测功能。
  • 了解任务特征:建议了解您的训练框架和代码结构,以便更好地解读进程栈信息。

开启进程栈采集

通过任务配置,您可以在任务 Hang 时自动采集进程栈。即使关闭自动采集,仍可手动采集。推荐在生产环境或历史上出现过挂起问题的任务中开启。

配置自动采集

在创建任务、改配任务、克隆任务时,均可配置自动采集进程栈。

  1. 容错配置区域,开启 Hang 检测功能。
  2. 进程栈采集配置区域,将开关切换为开启状态。

警告

进程栈采集配置区域仅在容错配置区域的 Hang 检测功能开启后可用。

手动采集进程栈

无论是否开启自动采集,都可在任务运行中手动触发采集。

  1. 进入任务详情
  2. 点击进程栈采集标签
  3. 点击手动采集按钮
  4. 等待采集完成(通常几秒到几十秒)

适用于性能分析、问题诊断或对比不同时间点的执行状态。

查看进程栈采集结果

进程栈采集数据保存在任务详情页的进程栈采集标签中,保留 30 天。

该标签包含三个子标签:

  • 报告:以 Markdown 呈现的栈分析摘要与函数调用统计表(覆盖整个任务所有 Worker / rank 的聚合结果)
  • 进程栈:原始进程栈跟踪数据(按线程组织的结构化数据)
  • NCCL 状态:NCCL 通信状态信息(如适用)

查看报告

报告标签展示 Stack Trace Analysis Report:先给出任务级摘要,再以 Markdown 表格列出函数调用统计,便于阅读、复制和与同事分享。一次采集的报告聚合整任务范围,无需在多个 Worker 之间分别打开即可对比各 rank 上的热点符号。

报告结构说明

典型章节如下(标题与字段以控制台为准):

  1. Summary(摘要)

    • Job ID:任务 ID
    • Analysis Time:分析时间(UTC)
    • Print ID:本次报告打印 ID,便于与平台支持沟通时引用
  2. Function Call Statistics(函数调用统计)Markdown 表格一般包含三列:

    列名含义
    Function Name符号名称及路径提示:可为 Python 源码位置,也可为 C++ 标准库PyTorch / CUDA 等动态库中的符号,便于区分用户代码与底层库
    Call Count该符号在统计中的调用次数(聚合后的计数)
    Sources该符号出现在哪些 Worker / rank 上;常附带各来源上的计数,例如 worker-rank0 (3), worker-rank1 (3)

表格通常按调用热度排序,方便快速定位最频繁的等待、同步或计算路径。

报告示例(节选)

以下为真实输出形式的节选,仅用于说明版式与内容类型:

language-markdown
Stack Trace Analysis Report

## Summary

- **Job ID**: `jo-dcpihjb32vcheeso`
- **Analysis Time**: `2026-03-20 09:57:19 (UTC)`
- **Print ID**: `1774000631934257167`

## Function Call Statistics

| Function Name | Call Count | Sources |
| --- | ---: | --- |
| `select /usr/lib/python3.12/selectors.py:415` | 24 | infiniai-a19-rank0 (3), infiniai-a19-rank1 (3), … |
| `std::condition_variable::wait /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.33:0` | 64 | infiniai-a19-rank0 (8), infiniai-a19-rank1 (8), … |
| `pretrain /mnt/public/.../megatron/training/training.py:801` | 8 | infiniai-a19-rank0, infiniai-a19-rank1, … |

完整报告中的行数较多,可在控制台内滚动查看,或使用复制将整份 Markdown 粘贴到本地编辑器、工单或文档中留存、对比。

查看进程栈详情

进程栈标签显示每个进程的原始栈跟踪信息,包含 Python 调用栈;在支持的环境下还可呈现 C++ 动态库等原生代码相关的栈帧,便于定位扩展模块与底层库中的阻塞点。

筛选和查看进程栈

进程栈标签支持按 Worker 和 GPU 筛选进程:

  1. 进程栈标签中,使用下拉菜单或筛选器选择特定的 Worker 和 GPU
  2. 例如:选择 worker-0-gpu-0 查看该 GPU 对应进程的栈跟踪
  3. 可以逐个查看不同 Worker 和 GPU 的进程栈,对比不同进程的执行状态

进程栈原始数据示例

进程栈原始数据通常以 JSON 数组形式展示,每个元素一般对应一个线程的采集结果。以下为简化示例,用于帮助理解数据结构与阅读方式;实际输出字段可能随版本演进、运行环境和采集方式调整。

示例结构

language-json
[
  {
    "pid": 4250,
    "thread_id": 140200437851456,
    "thread_name": "MainThread",
    "os_thread_id": 4250,
    "active": true,
    "owns_gil": false,
    "frames": [
      {
        "name": "cuStreamSynchronize",
        "filename": "/usr/local/cuda/lib64/libcuda.so",
        "module": "/usr/local/cuda/lib64/libcuda.so",
        "short_filename": "libcuda.so",
        "line": 0,
        "locals": null,
        "is_entry": true,
        "is_shim_entry": true
      },
      {
        "name": "train_step",
        "filename": "/mnt/public/project/training.py",
        "module": null,
        "short_filename": "training.py",
        "line": 1241,
        "locals": null,
        "is_entry": false,
        "is_shim_entry": false
      }
    ],
    "process_info": null
  }
]

信息

上述内容仅为示意示例,并非固定不变的完整 schema。平台可能在后续版本中调整字段、补充元数据,或优化原生栈帧展示方式。若您需要对原始 JSON 做自动化处理,请以实际环境输出为准并做好兼容。

常见字段说明

  • pid:进程 ID
  • thread_id:线程 ID
  • thread_name:线程名称,如 MainThreadQueueFeederThread;部分线程名称可能为空或为 null
  • os_thread_id:操作系统线程 ID
  • active:线程是否活跃
  • owns_gil:是否持有 Python GIL(全局解释器锁)
  • frames:调用栈帧数组,通常按采集结果顺序展示该线程的栈信息
  • process_info:进程级附加信息;当前可能为空或为 null

栈帧中的常见字段包括:

  • name:帧名称。可能是 Python 函数名、原生符号名、原始地址,少数情况下也可能为空字符串
  • filename:源文件路径、二进制路径或动态库路径
  • module:帧所属模块或动态库路径;部分 Python 源码帧可能为 null
  • short_filename:简化后的文件名或路径片段,便于快速阅读
  • line:对应源码行号;对于原生帧或无法映射到源码位置的帧,可能为 0
  • locals:局部变量信息;当前可能为空或为 null
  • is_entry:该帧是否被识别为入口帧或边界帧
  • is_shim_entry:该帧是否属于桥接层、封装层或兼容层入口帧

数据特点

  • 每个进程可能包含多个线程(主线程、数据加载线程、后台线程等)
  • 同一线程的栈中,可能同时出现 Python 源码帧、CPython 运行时帧,以及来自 C++ 动态库、PyTorch、CUDA 运行时等原生代码相关帧
  • 原始数据字段可能随平台能力迭代而调整,因此不建议将当前 JSON 结构视为稳定接口契约
  • 部分字段可能为空、缺失或仅在特定环境下返回;原生帧的符号解析完整度也可能因运行环境和调试符号情况而异
  • 对于系统动态库或框架原生库中的帧,line 字段可能为 0,这通常表示该帧无法直接映射到源码行,而不代表数据异常
  • active: false 的线程通常处于等待状态

信息

原生栈帧(C++ 动态库等):在支持的情况下,进程栈中除 Python 调用外,还可包含 C++ 动态库等原生代码相关帧,便于排查扩展与底层库问题。具体展示与完整度因运行环境而异,部分场景下原生栈可能较少或缺失。

查看 NCCL 状态

NCCL 状态标签显示 NCCL 通信系统的运行状态,帮助诊断分布式通信问题。

信息

NCCL 状态信息由 NCCL RAS Server 提供,仅在使用 NCCL 进行分布式通信时可用。

NCCL 状态报告内容

版本信息

text
NCCL version 2.26.3 compiled with CUDA 12.9
CUDA runtime version 12090, driver version 12080

任务摘要

text
Nodes  Processes  GPUs per process  Processes (total)  GPUs (total)
    1          8                 1                  8            8

显示任务的节点数、进程数和 GPU 数。

通信器状态(Communicators)

text
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)

text
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 天,过期后自动删除。

数据导出

进程栈数据无法直接导出下载,但可以通过直接复制到剪贴板。

性能影响

进程栈采集对训练任务的 GPU 算力占用可忽略,对日常训练影响通常很小。

  • 自动采集:仅在 Hang 检测触发时执行,正常运行时无额外开销
  • 手动采集:单次采集一般持续数秒至数十秒;采集瞬间可能对任务进程产生极短暂停顿,绝大多数场景可忽略,若对延迟极度敏感请酌情使用

建议在生产环境中开启自动采集,以便在问题发生时第一时间获取诊断数据。

相关文档