Profile 简介

1️⃣ 什么是 Profile(性能分析)

Profile 是指对程序运行时性能的测量和分析,主要目标是找出程序的瓶颈,例如:

  • 哪些函数执行最慢
  • 哪些操作占用最多显存或 CPU 时间
  • GPU kernel 执行情况

简单来说,就是“测量程序做了多少工作,用了多少时间和资源”。


2️⃣ 为什么要做 Profile

  1. 发现瓶颈

    • 比如在深度学习训练中,卷积层比其他层慢,或者数据加载成为限制因素。
  2. 优化性能

    • 根据 profile 结果调整算法、数据结构、内存布局、并行策略等。
  3. 资源利用率分析

    • CPU/GPU 利用率、内存占用情况。

3️⃣ Profile 的分类

① CPU Profiling

  • 测量 CPU 函数执行时间

  • 常用工具:

    • Python: cProfile, line_profiler
    • C/C++: gprof, perf

② GPU Profiling

  • 测量 GPU kernel 执行时间、显存占用

  • 常用工具:

    • CUDA: nvprof, nsight compute, nvvp
    • PyTorch: torch.profiler, torch.cuda.Event

③ 高级深度学习 Profiling

  • 深度学习框架自带 profiler,可以记录每个 layer/operation 时间、内存和 FLOPs

  • 例如:

    • PyTorch: torch.profiler
    • TensorFlow: tf.profiler

4️⃣ Profile 的关键指标

指标 说明
执行时间 CPU/GPU 函数或 kernel 花费时间
调用次数 函数被调用的次数
内存占用 RAM 或 GPU 显存使用情况
吞吐量 每秒处理的数据量(samples/sec)
FLOPs 每秒浮点运算次数,衡量算力消耗

5️⃣ 在深度学习中的典型应用

  1. 训练优化

    • 找出训练过程中最慢的 layer
    • 优化数据加载或混合精度训练
  2. GPU kernel 调优

    • Triton / CUDA kernel 的执行时间
    • 使用事件或 profiler 观察 warp/线程利用率
  3. 模型部署分析

    • 推理延迟分析
    • CPU/GPU 并行优化

实践

PyTorch / OpenTriton / CUDA 中做 Profile(性能分析) 的样例代码,涵盖 CPU/GPU 时间、CUDA kernel 以及 PyTorch 内置 profiler。这里用 PyTorch 的 torch.profiler 举例,它适合深度学习模型的 profiling。


1️⃣ PyTorch Profiler 基本示例

import torch
import torch.nn as nn
import torch.optim as optim
import torch.profiler

# 模型
class SimpleModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(1024, 512)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(512, 256)

    def forward(self, x):
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        return x

# 输入数据
x = torch.randn(64, 1024, device='cuda')
model = SimpleModel().cuda()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# PyTorch Profiler
with torch.profiler.profile(
    schedule=torch.profiler.schedule(wait=1, warmup=1, active=3, repeat=1),
    on_trace_ready=torch.profiler.tensorboard_trace_handler('./log'),
    record_shapes=True,
    with_stack=True,
    profile_memory=True,
    with_flops=True
) as prof:
    for step in range(5):
        optimizer.zero_grad()
        y = model(x)
        y.sum().backward()
        optimizer.step()
        prof.step()  # Profiler 轮次推进

print("Profile 完成, TensorBoard 查看 ./log")

说明

  • tensorboard_trace_handler('./log') 会生成 TensorBoard 可视化日志。
  • schedule 可以控制等待、预热和采样阶段。
  • record_shapes=True 可以记录输入 tensor 形状。
  • with_stack=True 可以查看调用堆栈。
  • profile_memory=True 可以分析显存使用情况。

运行后:

tensorboard --logdir=./log

可以看到 GPU kernel 时间分布、CPU 调用情况、内存使用等


2️⃣ 分析 导出的json文件

https://ui.perfetto.dev/#!/viewer?local_cache_key=0-json

在这里插入图片描述
json 文件
https://download.csdn.net/download/liuyunshengsir/92836530

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐