Nvidia GPU & 算能Sophon TPU 算子耗时分析
1、Nvidia GPU
该分析方法适合onnx模型或trt模型,NV的工具栏较为易用,可使用 trtexec 命令直接输出算子耗时。注意,有些易于优化计算的算子(例如 Conv+Relu 、Conv+BN+Relu),会作为一个算子集计算,此时无法直接读取到每个独立算子的耗时。
首先需要安装Nvidia TensorRT库、CUDA ToolKit(没这俩咋玩呀),然后使用trtexec命令行工具进行推理。
示例命令:
1 | trtexec --onnx=pfe+backbone_v12.onnx --loadInputs=input.1 --fp16 --exportProfile=bmap_dbg.json --verbose |
其中,--onnx
参数指定onnx文件路径,--loadInputs
参数指定输入层name,--fp16
选项指定启用FP16推理。后面的两个参数为用于分析推理过程,--exportProfile
参数用于将每个算子层的耗时及占比信息存入.json文件, --verbose
参数用于输出详细日志目录。
以下是全部参数详细说明,版本不符可以使用--help
参数,大致内容相似:
单击展开
1.1 Model Option 模型选项
–uff : UFF模型文件名
–onnx : ONNX模型文件名
–model : Caffe模型文件名,模式时无模型,使用随机权重
–deploy : Caffe prototxt 文件名
–output : 输出名称(可多次指定);UFF和Caffe至少需要一个输出
–uffInput : 输入blob名称及其维度(X、Y、Z=C、H、W),可以多次指定;UFF型号至少需要一个
–uffNHWC : 设置输入是否在NHWC布局中而不是NCHW中(在–uffInput中使用X、Y、Z=H、W、C顺序)
1.2 Build Options 构建选项
–maxBatch : 设置最大批处理大小并构建隐式批处理引擎(默认值=1)
–explicitBatch :构建引擎时使用显式批量大小(默认 = 隐式)
–minShapes=spec : 使用提供的最小 shape 的配置文件构建动态 shape
–optShapes=spec : 使用提供的 opt shape 的配置文件构建动态 shape
–maxShapes=spec : 使用提供的最大 shape 的配置文件构建动态 shape
–minShapesCalib=spec : 使用提供的最小 shape 的配置文件校准动态 shape
–optShapesCalib=spec : 使用提供的 opt shape 的配置文件校准动态 shape
–maxShapesCalib=spec :使用提供的最大 shape 的配置文件校准动态 shape
注意:必须提供所有三个 min、opt 和 max shape 。但是,如果只提供了 opt shape ,那么它将被扩展,以便将最小 shape 和最大 shape 设置为与 opt shape 相同的值。此外,使用 动态 shape 意味着显式批处理。 输入名称可以用转义单引号括起来(例如:‘Input:0’)。示例输入 shape 规范:input0:1x3x256x256,input1:1x3x128x128 每个输入 shape 都作为键值对提供,其中 key 是输入名称 值是用于该输入的维度(包括批次维度)。 每个键值对都使用冒号 (😃 分隔键和值。 可以通过逗号分隔的键值对提供多个输入 shape 。
–inputIOFormats=spec : 每个输入张量的类型和格式(默认所有输入为fp32:chw)
注意:如果指定此选项,请按照与网络输入ID相同的顺序为所有输入设置逗号分隔的类型和格式(即使只有一个输入需要指定IO格式)或设置一次类型和格式以进行广播。
–outputIOFormats=spec : 每个输出张量的类型和格式(默认所有输入为fp32:chw)
注意:如果指定此选项,请按照与网络输出ID相同的顺序为所有输出设置逗号分隔的类型和格式(即使只有一个输出需要指定IO格式)或设置一次类型和格式以进行广播。
–workspace=N : 以M为单位设置工作区大小(默认值 = 16)
–noBuilderCache : 在构建器中禁用时序缓存(默认是启用时序缓存)
–nvtxMode=mode : 指定 NVTX 注释详细程度。 mode ::= default|verbose|none
–minTiming=M : 设置内核选择中使用的最小迭代次数(默认值 = 1)
–avgTiming=M : 为内核选择设置每次迭代的平均次数(默认值 = 8)
–noTF32 : 禁用 tf32 精度(默认是启用 tf32,除了 fp32)
–refit : 将引擎标记为可改装。这将允许检查引擎内的可改装层和重量。
–fp16 : 除 fp32 外,启用 fp16 精度(默认 = 禁用)
–int8 : 除 fp32 外,启用 int8 精度(默认 = 禁用)
–best : 启用所有精度以达到最佳性能(默认 = 禁用)
–calib= : 读取INT8校准缓存文件
–safe : 仅测试安全受限流中可用的功能
–saveEngine= : 保存序列化模型的文件名
–loadEngine= : 加载序列化模型的文件名
–tacticSources=tactics : 通过从默认策略源(默认 = 所有可用策略)中添加 (+) 或删除 (-) 策略来指定要使用的策略。
1.3 Inference Options 推理选项
–batch=N : 为隐式批处理引擎设置批处理大小(默认值 = 1)
–shapes=spec : 为动态 shape 推理输入设置输入 shape 。
注意:使用动态 shape 意味着显式批处理。 输入名称可以用转义的单引号括起来(例如:‘Input:0’)。 示例输入 shape 规范:input0:1x3x256x256, input1:1x3x128x128 每个输入 shape 都作为键值对提供,其中键是输入名称,值是用于该输入的维度(包括批次维度)。 每个键值对都使用冒号 (😃 分隔键和值。 可以通过逗号分隔的键值对提供多个输入 shape 。
–loadInputs=spec :从文件加载输入值(默认 = 生成随机输入)。 输入名称可以用单引号括起来(例如:‘Input:0’)
–iterations=N : 至少运行 N 次推理迭代(默认值 = 10)
–warmUp=N : 在测量性能之前运行 N 毫秒以预热(默认值 = 200)
–duration=N : 运行至少 N 秒挂钟时间的性能测量(默认值 = 3)
–sleepTime=N : 延迟推理以启动和计算之间的 N 毫秒间隔开始(默认 = 0)
–streams=N : 实例化 N 个引擎以同时使用(默认值 = 1)
–exposeDMA : 串行化进出设备的 DMA 传输。 (默认 = 禁用)
–noDataTransfers : 在推理过程中,请勿将数据传入和传出设备。 (默认 = 禁用)
–useSpinWait : 主动同步 GPU 事件。 此选项可能会减少同步时间,但会增加 CPU 使用率和功率(默认 = 禁用)
–threads : 启用多线程以驱动具有独立线程的引擎(默认 = 禁用)
–useCudaGraph : 使用 cuda 图捕获引擎执行,然后启动推理(默认 = 禁用)
–separateProfileRun : 不要在基准测试中附加分析器; 如果启用分析,将执行第二次分析运行(默认 = 禁用)
–buildOnly : 跳过推理性能测量(默认 = 禁用)
1.4 Build and Inference Batch Options 构建和推理批处理选项
使用隐式批处理时,引擎的最大批处理大小(如果未指定)设置为推理批处理大小; 使用显式批处理时,如果仅指定 shape 用于推理,它们也将在构建配置文件中用作 min/opt/max; 如果只为构建指定了 shape ,则 opt shape 也将用于推理; 如果两者都被指定,它们必须是兼容的; 如果启用了显式批处理但都未指定,则模型必须为所有输入提供完整的静态维度,包括批处理大小
1.5 Reporting Options 报告选项
–verbose : 使用详细日志记录(默认值 = false)
–avgRuns=N : 报告 N 次连续迭代的平均性能测量值(默认值 = 10)
–percentile=P : 报告 P 百分比的性能 P=(0~100),0 代表最大性能,100 代表最小性能;(默认 = 99%))
–dumpRefit : 从可改装引擎打印可改装层和重量
–dumpOutput : 打印最后一次推理迭代的输出张量(默认 = 禁用)
–dumpProfile : 每层打印配置文件信息(默认 = 禁用)
–exportTimes= : 将计时结果写入 json 文件(默认 = 禁用)
–exportOutput= : 将输出张量写入 json 文件(默认 = 禁用)
–exportProfile= : 将每层的配置文件信息写入 json 文件(默认 = 禁用)
1.6 System Options 系统选项
–device=N :选择 cuda 设备 N(默认 = 0)
–useDLACore=N : 为支持 DLA 的层选择 DLA 核心 N(默认 = 无)
–allowGPUFallback : 启用 DLA 后,允许 GPU 回退不受支持的层(默认 = 禁用)
–plugins : 要加载的插件库 (.so)(可以多次指定)
1.7 Help 帮助
–help, -h : 打印以上帮助信息
执行完成后,会在当前目录生成一个json文件,内容包含:算子层名称、共计执行时间(运行时间与重复运行次数相关,非单次执行时间)、平均单次执行时间、占用率。
输出示例:
1 | [ |
上面仅是简单分析算子簇耗时,其实NV还提供了很多分析工具,例如NVIDIA Nsight™ Systems,它可以通过多种方式配置,以仅报告程序执行的一部分的时序信息,或者也可以将传统的 CPU 采样配置文件信息与 GPU 信息一起报告。
2、Sophon TPU
算能TPU提供了TPU Profile工具,帮助完成算子分析。TPU内部主要由MCU、GDMA、TIU三个engine来完成工作。
MCU在BM1684X上是一个单核的A53处理器,通过firmware固件程序完成向GDMA、TIU两个engine下发命令、驱动通信、简单计算等具体功能,实现了算子的具体逻辑。
GDMA和TIU是实际的执行引擎,GDMA用于Global mem与Local mem之间传输数据,实现了1D、矩阵、4D等数据搬运功能;TIU对local mem中的数据执行密集计算命令,包括卷积、矩阵乘法、算术等原子操作。
2.1、分析流程
简述分析流程,若程序在X86架构服务器完成编译,在边缘计算盒推理,分析主要分为六步。若编译推理在同域内进行,可省去数据拷贝流程,分为四步。
[服务器] 程序生成mlir -> [服务器] mlir转bmodel -> [服务器] bmodel拷贝至SE7->[SE7] 运行生成data文件->[SE7] 结果拷回服务器 -> [服务器] data转换为HTML profile可视化
[服务器] 程序生成mlir
首先进入docker环境,source运行环境
```
1
source /workspace/tpu-mlir_v1.3.140-g3180ff37-20231116/envsetup.sh
生成mlir文件,需要更改onnx模型对应shape及输出节点名
- ```
1
model_transform.py --model_name pp_bmap --model_def ./pfe+backbone_v12.onnx --input_shapes [[1,40,512,512]] --keep_aspect_ratio --output_names '273','320','367','414','461','508','542' --mlir bmap_dbg_1.mlir
[服务器] mlir转bmodel
在上一步基础上,运行model_deploy
注意,默认情况下,会将算子融合成算子簇来计算,优化推理效率。如果需要对单独算子进行评估,命令需要加
--disable_layer_group
参数来禁用算子融合操作。```
1
model_deploy.py --mlir bmap_dbg_1.mlir --quantize F16 --chip bm1684x --test_input ../concat_in_f32.npz --test_reference ../concat_top_outputs.npz --debug --compare_all --model bmap_dbg_2_F16F32.bmodel --quantize_table qtable_con --disable_layer_group
将生成的bmodel拷贝至SE7等边缘计算设备 (可选)
[SE7] 运行生成data文件
```
1
2# 通过环境变量(BMRUNTIME_ENABLE_PROFILE)使能profile, 生成二进制数据
BMRUNTIME_ENABLE_PROFILE=1 bmrt_test --bmodel bmap_dbg_2_F16F32.bmodel使能profile运行会生成一个
bmprofile_data-1
的文件夹,内部包含运行数据将该文件夹拷贝至服务器(可选)
[服务器] data转换为HTML profile可视化
```
1
tpu_profile.py --arch BM1684X bmprofile_data-1 out_dir
运行会生成
out_dir
文件夹,内部包含json数据和html文件,浏览器打开即可查看数据。tips:docker与主机拷贝命令
```
1
sudo docker cp se7:/workspace/concat/layer/bmprofile_out_1 /home/username/
退出docker:ctrl+D
生成时序图数据后,可按需查看并分析。详细说明请见tpu-mlir官方说明 :
TPU Profile工具使用及分析 | TPUMLIR 开源工具链项目 | 通用 AI 编译器工具链项目,高效将模型编译生成 TPU 执行代码
Nvidia GPU & 算能Sophon TPU 算子耗时分析