torch.profiler和nvprof的使用经验?如何profile PyTorch模型的性能?torch.profiler和nvprof的使用经验?
torch.profiler(或旧版 torch.autograd.profiler.profile)在 Python 侧记录:每个算子的 CPU/GPU 时间、调用次数、显存分配/释放、以及(若开 CUDA)kernel 级信息。可配合 Chrome Trace(tensorboard 的 trace viewer)看时间线,或导出表格做「谁最慢」的排序。
with torch.profiler.profile(...) as prof: model(x),然后 prof.key_averages().table() 或 prof.export_chrome_trace("trace.json")。activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA]、record_shapes=True(记 tensor shape)、profile_memory=True(显存)、with_stack=True(调用栈)。schedule 可做「预热 + 只录几轮」避免录太多。torch.profiler.tensorboard 把 trace 写到 logdir,用 tensorboard --logdir ... 打开,在 PyTorch Profiler 的 trace 视图里看 CPU/GPU 时间线和 gap。profile_memory=True 看分配/释放时间线,找峰值和泄漏;结合 memory_summary() 看谁在占。nvprof python train.py,会录 GPU kernel、显存、API 调用;输出可转成 timeline。新驱动上推荐用 Nsight Systems / Nsight Compute。经验:先 torch.profiler 看「哪一段、哪个 op 慢」和「CPU/GPU 谁在等」;再 Nsight Systems 看时间线 gap;最后对关键 kernel 用 Nsight Compute 抠指标。
| 工具 | 层级 | 典型用途 |
|---|---|---|
| torch.profiler | Python/op | 哪个 op 慢、显存、CPU/GPU 占比 |
| Nsight Systems | 进程/线程/kernel | 时间线、gap、谁在等 |
| Nsight Compute | 单 kernel | occupancy、带宽、roofline |
| nvprof | kernel/API | 旧卡粗略 timeline(逐渐被替代) |
| 返回模块 | 返回总览 |