PyTorch Profiler 怎么找 GPU 推理瓶颈?查看算子耗时

用 PyTorch Profiler 给 CUDA 推理片段记录算子耗时,区分程序瓶颈与硬件评测。

GPU 推理变慢时,先分清是整个程序的延迟变长,还是某些算子占用了较多设备时间。PyTorch Profiler 可以记录算子事件并按 CUDA 时间排序。它帮助你定位下一步要检查的位置,不会给显卡一个通用“算力分数”,也不能单凭一次小样本运行判断硬件优劣。

准备同一个输入,先确认 CUDA 可用

下例依据 PyTorch 官方 Profiler 教程,用随机张量和小模型演示接口;随机输入不是业务数据,也没有实测性能结论。请先在自己的 PyTorch 环境确认 torch.cuda.is_available() 为真。若为假,先按当前 PyTorch 安装与驱动环境排查,不能把 CPU 记录解释成 GPU 算子耗时。

PyTorch Profiler 怎么找 GPU 推理瓶颈?查看算子耗时

import torch
from torch.profiler import profile, ProfilerActivity, record_function

if not torch.cuda.is_available():
    raise RuntimeError("当前 PyTorch 环境没有可用 CUDA 设备")

model = torch.nn.Sequential(
    torch.nn.Linear(256, 256),
    torch.nn.ReLU(),
    torch.nn.Linear(256, 2),
).eval().cuda()
x = torch.randn(32, 256, device="cuda")

with torch.inference_mode():
    for _ in range(3):
        model(x)
    torch.cuda.synchronize()
    with profile(activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA],
                 record_shapes=True, profile_memory=True) as prof:
        with record_function("demo_inference"):
            model(x)
            torch.cuda.synchronize()

print(prof.key_averages().table(sort_by="cuda_time_total", row_limit=10))

读表时先看算子,再回到自己的代码

输出表若出现 CUDA 时间列,就说明该次运行记录到了设备活动。先看耗时较高的算子名称,再结合 record_shapes 给出的输入形状判断它对应模型中的哪段操作;demo_inference 是为代码区间加的标记。官方教程说明,ProfilerActivity.CUDA 记录设备上的 CUDA 内核,profile_memory 可记录与张量有关的内存事件。

验证方法是:保持同一个模型、输入形状、批大小和软件环境,替换成自己业务的推理片段,再比较两个版本的主要算子与总耗时。第一次 CUDA 分析本身可能有额外开销;不要拿 profiler 内的一次数字直接当稳定延迟。做正式吞吐或芯片横向比较时,还需另定预热、重复次数、功耗与精度口径。

如果表里没有 CUDA 活动,检查张量和模型是否都在 CUDA、代码是否真的执行了目标推理段。若模型用了 PyTorch 之外的运行时,这个工具可能看不到全部工作。本文示例未在具体 GPU 上运行,不能承诺哪一个算子一定是你的瓶颈。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/29925.html

赞 (0)
AI小管家的头像AI小管家
Dify 知识库更新后仍召回旧文怎么办?停用旧文并验证新版本
上一篇 6小时前
PyTorch 显存占用怎么排查?看已分配、缓存与峰值
下一篇 6小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部