在 Linux 系统中,查询运行在某个特定 GPU 上的进程主要有以下几种方法,最常用的是 NVIDIA 官方提供的工具。
1. 使用 nvidia-smi (最常用)
这是最直接的方法。在终端输入以下命令:
bash
nvidia-smi
如何查看:
- 在输出的上半部分,你会看到 GPU 的列表(ID 从 0 开始)。
- 往下看,找到 "Processes"(进程)表格。
- 关键列:
- GPU UUID / GPU: 标识该进程运行在哪个 GPU 上。
- PID: 进程 ID。
- Type: 通常是
C(Compute 计算进程,如 Python/PyTorch) 或G(Graphics 图形进程)。 - Process Name: 进程名称。
只显示特定 GPU 的进程:
如果你只想看 GPU 0 上的进程,可以使用:
bash
nvidia-smi --query-compute-apps=gpu_uuid,pid,process_name,used_memory --format=csv -i 0
2. 使用 fuser 查询设备文件
GPU 在 Linux 中被视为设备文件。你可以通过查询这些文件的使用者来找到进程。
步骤:
-
查看哪些进程占用了
/dev/nvidia*设备:bashsudo fuser -v /dev/nvidia* -
输出解读:
- 列表会显示 PID。
- 通常
/dev/nvidia0对应 GPU 0,/dev/nvidia1对应 GPU 1,以此类推。
3. 结合 ps 和 nvidia-smi 进行关联查询
如果你通过 nvidia-smi 看到了 PID,想进一步查看这个 PID 具体是什么任务(例如是哪个 Python 脚本),可以使用 ps 命令。
查询特定 PID 的详细信息:
bash
ps -fp <PID>
或者
bash
ps aux | grep <PID>
批量查询(高级用法):
你可以编写一行命令,直接列出 GPU 进程及其对应的命令行参数:
bash
# 先获取所有 GPU 进程的 PID,然后查询这些 PID 的详细信息
nvidia-smi --query-compute-apps=pid --format=csv,noheader,nounits | xargs -I {} ps -p {} -o pid,ppid,cmd,%mem,%cpu --sort=-%mem
4. 使用 gpustat (第三方工具,更美观)
如果你安装了 gpustat (可以通过 pip install gpustat 安装),它提供了一个更简洁的界面。
安装与使用:
bash
pip install gpustat
gpustat -cp
输出特点:
-c参数显示命令名(Command)。-p参数显示 PID。- 它通常能直接显示是哪个 Python 脚本在占用,比原生
nvidia-smi更直观。