profiler进阶

一、定义

  1. gpu summary 分析
  2. trace 跟踪视图 分析
  3. 每个算子用时分析
  4. gpu 内核利用率分析
  5. 内存分析
  6. 内存快照,进行分析

二、实现

https://cloud.tencent.com/developer/article/1878875
https://tensorflow.google.cn/guide/gpu_performance_analysis?hl=zh_cn

  1. gpu summary 分析
    在这里插入图片描述
    1. GPU 利用率:越高越好,但是不准。当 GPU 引擎执行一个工作负载时会出现一个步骤间隔时间 (step interval time)。利用率百分比越高越好。仅通过 GPU 利用率来判断性能瓶颈,结果并不准确。你无法借此得知到底有多少流处理器 (Streaming Multiprocessor) 在运行。
    2. 预估流处理器效率 (Est. SM Efficiency) 是一个更细化的指标,它表示在跟踪全过程中,正在使用的 SM 的百分比,代表 SM 上至少有一个活动 wrap 的 time 百分比,以及那些空闲 warp。Est. SM Efficiency 也有局限性。如每个区块只有一个线程的内核,无法完全利用所有 SM。只依据 SM Efficiency 无法得知每个 SM 的利用率,只能知道每个 SM 正在进行的操作,这包括等待内存加载结果时的停顿。
    3. 预估实现的占用率(Est. Achieved Occupancy)比 Est. SM Efficiency 和 GPU 利用率更准确。从经验角度出发,通过将这个指标提高到 15% 或以上,可以获得良好的吞吐量收益。
    4. Est. Achieve Occupancy 的值越大越好。
    5. step Time Breakdown 横坐标是模型迭代的轮次,纵坐标是执行的时间。对应的时间与execution Summary 中的值对应。如图cpu执行473538us,其他执行45158us。
      分析: gpu 实现利用率为61.68%,仍可提高。 cpu 执行时间较长。
  2. trace 跟踪视图 分析
    1. 跟踪视图显示的是一个时间线,表示模型中算子的持续时间,以及是哪个系统执行的操作。这个视图可以帮助你识别高消耗和长执行,是不是由于输入或模型训练引起的。目前,该跟踪视图可显示一个时间线内的 GPU 利用率和 Est. SM Efficiency。
import torch
torch.manual_seed(10)
with torch.profiler.profile(
        on_trace_ready=torch.profiler.tensorboard_trace_handler('./log/example'),
        record_shapes=True,profile_memory=True,with_stack=True) as prof:
    with torch.profiler.record_function("make_data"):
        x = torch.randn((1, 3, 4))
    with torch.profiler.record_function("pow"):
        y = torch.pow(x, 2)

在这里插入图片描述
2. Stream: 在CUDA编程模型中,stream是一个执行队列,用于安排GPU上任务的执行顺序。在PyTorch中,不同的操作可能会在不同的stream上执行,以利用GPU的并行计算能力。Profiler中的stream信息通常用于标识不同操作在GPU上的执行顺序和并行情况。
3. Utilization指的是GPU资源的利用率,Utilization通常用于评估GPU在执行特定操作时的忙碌程度。高利用率意味着GPU正在被有效利用,而低利用率则可能表示存在性能瓶颈或资源闲置。Profiler的trace结果中,Utilization可能会以图形化或数值化的形式展示,帮助您快速识别GPU的利用率趋势和潜在的性能问题。
4. 在PyTorch Profiler的trace分析中,Est. SM Efficiency的值越高,表示SM的利用效率越高,GPU的性能也越好。相反,低效率可能意味着存在指令级并行不足、内存带宽限制或其他性能瓶颈。

分析: 该图可以查看算子运行时常,如果中间有间隔,则可进行优化,或者加载时间、执行时间过长,则可优化。

  1. 每个算子用时分析
    在这里插入图片描述
    1. host self time是指某个操作或函数在CPU/GPU上执行所花费的时间,仅计算该操作或函数本身执行的时间,不包括其子操作或函数调用所花费的时间。这是衡量一个操作或函数本身效率的重要指标
    2. host total time则是指从该操作开始执行到其所有子操作完成所花费的总时间。这个指标包括了操作本身执行的时间以及它所调用的所有子操作或函数执行的时间。因此,host total time通常会比host self time更长,因为它反映了操作对整个程序性能的综合影响。
    3. host self time关注于操作本身的执行效率,而host total time则关注于操作及其子操作对整个执行流程的影响。
    4. 两者都是衡量CPU上操作性能的重要指标,通过比较两者的大小,可以初步判断一个操作是否存在大量的子操作调用,进而分析是否存在性能优化的空间。
    5. 用例:如果发现某个操作的host total time很长,但host self time相对较短,那么可能意味着该操作调用了大量的子操作,需要进一步优化这些子操作的执行效率。
    分析: attention v1 的host total time 与host self time 用时一致,则该算子并无子算子的时间消耗。

  2. gpu 内核利用率分析

在这里插入图片描述
1. Tensor Core Utilization: Tensor Core利用率。与传统的CUDA Cores相比,Tensor Cores能够以更高的吞吐量和更低的延迟执行这些操作。
2. 性能评估:Tensor Cores Utilization是衡量GPU在执行深度学习任务时性能的一个重要指标。高利用率意味着GPU上的Tensor Cores得到了充分的利用,从而能够提供更高的计算性能和吞吐量。
3. 优化指导:通过分析Tensor Cores Utilization,开发者可以识别出模型中的性能瓶颈,并据此制定优化策略。例如,如果利用率较低,可能是因为模型中的某些操作没有充分利用Tensor Cores,或者GPU的并行性没有得到充分发挥。

如何提高Tensor Cores Utilization

  1. 优化模型结构:通过调整模型的层数、宽度、连接方式等,可以减少不必要的计算量,提高Tensor Cores的利用率。

  2. 混合精度训练:使用半精度(FP16)或更低精度的数据类型进行训练,可以减少内存占用,提高Tensor Cores的吞吐量。

  3. 并行化:利用GPU的并行计算能力,通过数据并行、模型并行等方式,将计算任务分配给多个Tensor Cores同时执行,从而提高整体性能。

  4. 代码优化:优化CUDA kernel的实现,减少不必要的内存访问和同步操作,提高Tensor Cores的执行效率。
    分析: attention v1 并未使用tensor score。

  5. 内存分析
    在这里插入图片描述
    Allocated: 已分配内存
    Reserved: 预留内存
    operator 内显示每个算子的大小,占用内存时间、释放时间、持续时间。
    缓存机制是PyTorch管理显存的一个重要手段。在某些情况下,即使某个变量已经被释放,其占用的内存也可能仍然被PyTorch缓存起来以供后续使用。这可能会导致已分配内存和预留内存之间的差异。

分析方法
在PyTorch Profiler中,进行memory分析通常需要启用profile_memory=True选项。这会使Profiler在记录操作时间的同时,也记录内存使用情况。分析完成后,可以通过TensorBoard等可视化工具查看内存分析报告。
以下是一些常见的分析方法:

  1. 查看内存分配和释放历史:通过内存分析报告,可以观察到模型在执行过程中内存的分配和释放情况。这有助于识别内存泄漏等问题。
  2. 分析内存使用峰值:关注内存使用峰值可以帮助确定模型对内存资源的需求上限。如果内存使用峰值过高,可能需要考虑优化模型结构或增加内存资源。
  3. 比较不同操作的内存占用:通过比较不同操作的内存占用情况,可以识别出哪些操作是内存消耗的主要来源。这有助于开发者针对性地进行优化。

优化建议
基于memory分析的结果,可以提出以下优化建议:
4. 减少不必要的内存分配:通过优化模型结构和算法实现,减少不必要的内存分配。例如,可以使用原地操作(in-place operations)来减少临时变量的生成。
5. 及时释放不再需要的内存:在模型执行过程中,及时释放不再需要的内存可以避免内存泄漏。这可以通过调用适当的PyTorch函数来实现。
6. 优化数据加载和处理:优化数据加载和处理流程可以减少内存占用。例如,可以使用多线程或异步IO来加速数据加载过程,并使用更高效的数据处理算法来减少内存消耗。
7. 增加内存资源:如果模型对内存资源的需求过高,且无法通过优化模型结构和算法实现来降低内存占用,那么可能需要考虑增加内存资源来满足需求。

6 内存快照进行分析在这里插入图片描述
检测内存泄漏,进一步见内存快照篇

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值