还不会对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

在这里插入图片描述

  • 85
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 86
    评论
要在PyTorch中使用ONNX Runtime运行ONNX模型,需要安装ONNX Runtime包。 安装ONNX Runtime: ``` pip install onnxruntime ``` 在Python中加载ONNX模型: ```python import onnxruntime as ort # Load model model_path = 'model.onnx' ort_session = ort.InferenceSession(model_path) # Input shape input_shape = ort_session.get_inputs()[0].shape # Input name input_name = ort_session.get_inputs()[0].name # Output name output_name = ort_session.get_outputs()[0].name # Input data import numpy as np input_data = np.ones(input_shape, dtype=np.float32) # Run inference output_data = ort_session.run([output_name], {input_name: input_data})[0] ``` 首先,我们导入onnxruntime包并加载ONNX模型。我们使用ort.InferenceSession()方法创建一个话对象。然后使用ort_session.get_inputs()和ort_session.get_outputs()方法来获取输入和输出的元数据信息,这将帮助我们准备输入和输出数据。 在本例中,我们首先检索输入的形状,然后检索输入和输出的名称。接下来,我们为输入数据创建具有正确形状的numpy数组,并将其传递给run()方法以获取任意数量的输出。 最后,我们得到输出数据和格式化输出,以便在屏幕上获取矩阵的值。 ONNX Runtime提供了多种推理选项以优化性能和内存使用。可以使用以下代码设置性能和优化选项: ```python # Options ort_session.set_providers(['CPUExecutionProvider']) ort_session.set_providers(['CUDAExecutionProvider']) ort_session.set_providers(['TensorrtExecutionProvider']) ort_session.set_providers(['MIGraphXExecutionProvider']) ort_session.set_providers([ort.SessionOptions.ExecutionProvider_CPU]) ort_session.set_providers([ort.SessionOptions.ExecutionProvider_CUDA]) ort_session.set_providers([ort.SessionOptions.ExecutionProvider_Tensorrt]) ort_session.set_providers([ort.SessionOptions.ExecutionProvider_MIGraphX]) ort_session.set_optimization_level(0) ort_session.set_optimization_level(1) ort_session.set_optimization_level(2) ``` 这里我们可以设置CPU,CUDA,Tensorrt和MIGraphX的执行提供程序。此外,还可以设置优化级别以控制推理选项的优化程度。 在实际应用中,通常需要对使用ONNX Runtime对模型执行推理进行更多配置,以便在具体数据和平台上获得最佳性能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 86
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

染念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值