调试和优化大型深度学习模型 - 2 使用 PyTorch Profiler 在 GPU 上分析模型的算子,并提取相关性能数据

调试和优化大型深度学习模型 - 2 使用 PyTorch Profiler 在 GPU 上分析模型的算子,并提取相关性能数据

flyfish

ProfilerActivity.CPU 和 ProfilerActivity.CUDA 指定了需要分析 CPU 和 GPU 的活动。

record_shapes=True 允许记录每个操作的输入张量形状,这对调试和优化非常有帮助。

record_function("model_inference") 是一个上下文管理器,用于标记代码块的分析区域。你可以在任何代码块周围使用它来进行更细粒度的性能分析。

prof.key_averages().table(sort_by="cuda_time_total", row_limit=10) 打印出按 GPU 执行时间排序的前 10 个算子的分析数据,包括各个操作的耗时、调用次数等信息。

版本 2.4.0

cpp 复制代码
import torch
import torch.nn as nn
import torch.optim as optim
from torch.profiler import profile, record_function, ProfilerActivity

# 检查是否有可用的 GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 定义一个简单的神经网络
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc1 = nn.Linear(100, 50)
        self.fc2 = nn.Linear(50, 10)
    
    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 实例化模型、损失函数和优化器
model = SimpleModel().to(device)
criterion = nn.MSELoss().to(device)
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 创建输入数据
inputs = torch.randn(10, 100).to(device)
targets = torch.randn(10, 10).to(device)

# 使用 PyTorch Profiler 分析 GPU 上的算子
with profile(activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA], record_shapes=True) as prof:
    with record_function("model_inference"):
        # 前向传播
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        
        # 后向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

# 打印性能分析结果
print(prof.key_averages().table(sort_by="cuda_time_total", row_limit=10))

# 也可以保存成文件以供进一步分析
prof.export_chrome_trace("trace.json")

输出

一个包含 GPU 上各个操作的耗时、调用次数等信息的表格

cpp 复制代码
------------------------------------------------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  
                                                   Name    Self CPU %      Self CPU   CPU total %     CPU total  CPU time avg     Self CUDA   Self CUDA %    CUDA total  CUDA time avg    # of Calls
-------------------------------------------------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------
                                        model_inference        43.86%      53.190ms        82.46%     100.010ms     100.010ms      52.881ms        43.63%      99.954ms      99.954ms             1
                                           aten::linear         0.07%      79.700us        16.40%      19.893ms       9.947ms      44.000us         0.04%      19.780ms       9.890ms             2
                                            aten::addmm        16.15%      19.588ms        16.15%      19.588ms       9.794ms      19.520ms        16.11%      19.520ms       9.760ms             2
                                aten::mse_loss_backward         5.04%       6.107ms        10.17%      12.330ms       6.165ms       6.103ms         5.04%      12.345ms       6.173ms             2
                                             aten::relu         0.05%      66.000us         8.29%      10.055ms      10.055ms      25.000us         0.02%      10.408ms      10.408ms             1
                                        aten::clamp_min         8.24%       9.989ms         8.24%       9.989ms       9.989ms      10.383ms         8.57%      10.383ms      10.383ms             1
    autograd::engine::evaluate_function: AddmmBackward0         0.13%     153.600us         8.48%      10.279ms       5.140ms     160.000us         0.13%      10.285ms       5.143ms             2
                                         aten::mse_loss         4.82%       5.845ms         7.19%       8.717ms       8.717ms       5.836ms         4.82%       8.721ms       8.721ms             1
autograd::engine::evaluate_function: MseLossBackward...         0.05%      59.900us         5.32%       6.450ms       6.450ms      24.000us         0.02%       6.382ms       6.382ms             1
                                       MseLossBackward0         0.03%      40.600us         5.27%       6.390ms       6.390ms       9.000us         0.01%       6.358ms       6.358ms             1
-------------------------------------------------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------  ------------
Self CPU time total: 121.286ms
Self CUDA time total: 121.191ms
相关推荐
GoldenSpider.AI3 小时前
AI对话到视频的零编辑革命:NotebookLM与Lemon Slice的深度整合与未来洞察
人工智能·notebooklm·nanobanana·aivideo·lemon slice
草莓熊Lotso3 小时前
C++ STL set 系列完全指南:从底层原理、核心接口到实战场景
开发语言·c++·人工智能·经验分享·网络协议·算法·dubbo
大千AI助手5 小时前
代价复杂度剪枝(CCP)详解:原理、实现与应用
人工智能·决策树·机器学习·剪枝·大千ai助手·代价复杂度剪枝·ccp
zl_vslam6 小时前
SLAM中的非线性优-3D图优化之李群李代数在Opencv-PNP中的应用(四)
人工智能·opencv·算法·计算机视觉
whaosoft-1436 小时前
51c视觉~3D~合集8
人工智能
澳鹏Appen8 小时前
数据集月度精选 | 高质量具身智能数据集:打开机器人“感知-决策-动作”闭环的钥匙
人工智能·机器人·具身智能
q***710110 小时前
开源模型应用落地-工具使用篇-Spring AI-Function Call(八)
人工智能·spring·开源
极限实验室10 小时前
Coco AI 参选 Gitee 2025 最受欢迎开源软件!您的每一票,都是对中国开源的硬核支持
人工智能·开源
secondyoung10 小时前
Mermaid流程图高效转换为图片方案
c语言·人工智能·windows·vscode·python·docker·流程图
iFlow_AI10 小时前
iFlow CLI Hooks 「从入门到实战」应用指南
开发语言·前端·javascript·人工智能·ai·iflow·iflow cli