还不会对MIGraphX性能分析与调试?试试这篇让你快速入门

简介: MIGraphX性能分析与调试

计算图

计算图是深度学习中表示网络模型计算逻辑和状态的关键工具。它由张量(Tensor)和算子(Operator)构成,通过节点表示算子,有向线段表示张量状态,揭示计算之间的依赖关系。例如,MIGraphX框架中的模型计算图可表示为:

input -> convolution->silce->contiguous->flatten

在MIGraphX中,可以通过以下代码查看计算图的文本形式:

migraphx::program net;
std::cout<<net<<std::endl;

MIGraphX中的计算图类型

MIGraphX支持打印两种类型的计算图:未编译和编译后的计算图。
未编译的计算图示例

module: "main"
[...]
main:@2 = convolution[...](input, main:@0) -> float_type, {...}
[...]

第一行moudle:"main"表示计算图,下面每一行表示该主计算图中的一条指令,例如main:@2 = convolution[...],其中:

  • main:@2:指令ID,main表示主计算图,@2表示指令序号。
  • convolution:算子名称。
  • [...]:算子属性。
  • (input, main:@0):指令输入参数。
  • float_type, {...}:输出shape和类型。

特殊指令以@开头,如@literal表示常量,@param表示模型输入,@return表示模型结束指令。

编译后的计算图示例

module: "main"
main:@0 = check_context::migraphx::version_1::gpu::context -> float_type, {}, {}
[...]

编译后的计算图包括内存分配(hip::hip_allocate_memory,提前统一分配,后面直接使用)、当设置offload_copy=true,能看到数据拷贝到GPU(hip::copy_to_gpu,)指令、常量拷贝GPU(hip::hip_copy_literal)、数据拷贝主机端(hip::copy_from_gpu)、hip::sync_stream用于流同步。

性能分析工具migraphx-driver

migraphx提供了性能分析工具migraphx-driver,可在安装目录下的bin文件找到。使用方法如下:

/opt/dtk/bin/migraphx-driver perf [--enable-offload-copy] [-h] [--batch] [--input-dim] [-n] [--fp16] [--gpu/--cpu] --onnx

参数说明:

  • --enable-offload-copy:启用offload_copy模式,必填
  • -h:显示帮助文档
  • --batch:可选,设置batchsize,但如果程序中的使用的onnx模型没有batchsize参数,就要设置一下,不如就会报错了。
  • --input-dim:自定义模型输入shape。使用方法:--input-dim @input 64 3 224 224,@input表示onnx的输入节点名,后面的64 3 224 224表示输入shape,格式为NCHW
  • -n:迭代次数,默认100次,工具以此计算平均耗时
  • --fp16:使用FP16模式,默认使用FP32
  • --gpu/--cpu:默认gpu
  • --onnx:指定onnx模型文件路径

性能分析

运行分析工具之后,输出的结果中首先是模型的编译的计算图,然后在计算图后面会显示计算图中每一条指令执行的时间:

Allocating params ...
Running performance report ...
main:@0 = check_context::migraphx::version_1::gpu::context -> float_type,{},{}:0.00269076ms,0.00632856%
main:@1 = hip::hip_allocate_memory[shape=float_type,{38535168},{1},id=main:scratch]->float_type,{38535168},{1}:0.00169618ms, 0.00395935%
...

会列出模型中每个算子的执行时间及其在总时间中的占比。

最后会输出总体性能指标:

性能分析的最后部分会总结模型的整体性能指标,如总耗时、每秒处理的数据量(Rate)、额外开销(Overhead)等。例如:

Summary:
gpu::convolution: 22.6576ms / 49 = 0.4624ms,53.2898%
...
Batch size: 32
Rate: 975.796/sec
Total time: 32.7937ms
Total instructions time: 37.1238ms
Overhead time: 0.189906ms, -4.33002ms
Overhead: 1%, -13%
  • Summary后面表示:所有相同算子的耗时/模型中的调用次数=平均耗时,占比
  • Total time:n次平均后的模型总耗时。
  • Rate:每秒处理的数据量,Rate=1000.0/total time*batchsize
  • Total instructions time:所有算子耗时总和。(包含同步时间)
  • Overhead time:额外开销,正常开销是算子执行的耗时,但实际上还有遍历计算图的耗时,这里数值的意义是第一个表示实际测试出来的额外开销,第二个表示total time-total instruction time的差值。
  • overhead:表示额外的开销占据total time的比例。

通常使用total time或者rate来表示模型的实际推理性能

通过这些数据,用户可以精确地了解模型中哪些算子是性能瓶颈,从而对模型进行优化。

调试MIGraphX

输出每个节点结果

要查看每个指令的输出,设置环境变量:export MIGRAPHX_TRACE_EVAL=2

运行程序之后可以得到类似下面格式的输出:

Run instruction: main:@151 = gpu::add(main:@147,main:@150,main:@149) ->
float_type, {8, 6, 4, 96}, {2304, 384, 96, 1}
Time: 0.008117ms, 0.160552ms
Output has normal
Output: 0.932655, 0.78008, 0.455646, 0.490867, 0.500787, ..., -1.57317, -1.5806,
-1.59469, -1.48618, -1.80712

第一行Run instruction:后面表示指令,最后一行Output:后面的数值就是该指令的输出结果,为了方便查看,只显示结果中的最前面5个数值和最后面5个数值

查看MIGraphX版本

不同版本间可能存在差异,通过以下命令查看版本:/opt/dtk/bin/migraphx-driver --version

在这里插入图片描述

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
3月前
|
开发者 算法 虚拟化
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
83 0
|
6月前
|
缓存 Linux iOS开发
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
590 1
|
6月前
|
搜索推荐 测试技术 开发工具
NumPy 秘籍中文第二版:七、性能分析和调试
NumPy 秘籍中文第二版:七、性能分析和调试
78 0
|
Linux 调度
Linux系统调试篇——Perf性能分析指南
Linux系统调试篇——Perf性能分析指南
|
6月前
|
Web App开发 JavaScript 前端开发
JavaScript中的性能优化:代码优化技巧与性能分析工具
【4月更文挑战第22天】本文探讨JavaScript性能优化,包括代码优化技巧和性能分析工具。建议避免全局查找、减少DOM操作、使用事件委托、优化循环和异步编程以提升代码效率。推荐使用Chrome DevTools、Lighthouse和jsPerf等工具进行性能检测和优化。持续学习和实践是提升JavaScript应用性能的关键。
|
16天前
|
缓存 监控 Linux
Linux性能分析利器:全面掌握perf工具
【10月更文挑战第18天】 在Linux系统中,性能分析是确保软件运行效率的关键步骤。`perf`工具,作为Linux内核自带的性能分析工具,为开发者提供了强大的性能监控和分析能力。本文将全面介绍`perf`工具的使用,帮助你成为性能优化的高手。
57 1
|
16天前
|
缓存 监控 Linux
掌握Linux性能分析:深入探索perf工具
【10月更文挑战第26天】
22 1
|
1月前
|
Web App开发 监控 JavaScript
一些常用的 Vue 性能分析工具
【10月更文挑战第2天】
75 1
|
2月前
|
SQL 缓存 关系型数据库
MySQL高级篇——性能分析工具
MySQL的慢查询日志,用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long-query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为 10,意思是运行10秒以上(不含10秒)的语句,认为是超出了我们的最大忍耐时间值。它的主要作用是,帮助我们发现那些执行时间特别长的 SOL 查询,并且有针对性地进行优化,从而提高系统的整体效率。当我们的数据库服务器发生阻塞、运行变慢的时候,检查一下慢查询日志,找到那些慢查询,对解决问题很有帮助。
MySQL高级篇——性能分析工具