在 AIStudio 镜像中心使用 Dockerfile 自助构建最新版 vLLM 镜像在 AIStudio 镜像中心使用 Dockerfile 自助构建最新版 vLLM 镜像 ,无需访问 DockerHub立即构建
Skip to content

使用进程栈采集功能

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

前提条件

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

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

开启进程栈采集

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

配置自动采集

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

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

重要

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

手动采集进程栈

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

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

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

查看进程栈采集结果

进程栈采集数据保存在任务详情页的进程栈采集标签中,保留 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 ID
  • PodName:Pod 名称
  • ProcessName:进程名称

报告数据示例

json
{
  "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 筛选进程:

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

进程栈数据格式

进程栈数据以 JSON 数组格式组织,每个元素代表一个线程的完整信息。

数据结构

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:进程 ID
  • thread_id:线程 ID
  • thread_name:线程名称(如 MainThreadQueueFeederThread
  • os_thread_id:操作系统线程 ID
  • active:线程是否活跃
  • owns_gil:是否持有 Python GIL(全局解释器锁)
  • frames:调用栈帧数组,从最内层函数到最外层函数排列
    • name:函数名称
    • filename:源文件完整路径
    • short_filename:源文件简短路径
    • line:行号

数据特点

  • 每个进程可能包含多个线程(主线程、数据加载线程、后台线程等)
  • active: trueframes 为空的线程通常是正在执行原生代码的线程
  • 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 或主要计算资源

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

相关文档