模型性能评估

本章节中,我们将为您介绍如何对模型进行性能评估,包括在开发机端预估模型BPU部分的性能,以及使用我们提供的板端无需代码开发的可执行工具快速评测模型的性能。

开发机端,我们支持您通过两条链路进行模型性能评估:

  1. 使用地平线提供的 hb_compile 工具对模型性能进行评估。

  2. 调用性能分析API接口,对模型性能进行评估。

performance_evaluation

开发板端,我们支持您通过我们提供的可执行工具hrt_model_exec对模型性能进行快速的板端实测。

模型中是否有CPU算子

在进行模型性能评估前,我们建议您先判断模型中是否含有CPU算子,CPU算子会打断模型,引入额外量化反量化和ddr开销,因此建议如模型中有CPU算子, 我们优先推荐您参考 性能调优-处理CPU算子 章节的介绍,先对CPU算子进行移除,再进行模型的性能评估。判断模型中是否有CPU算子的方法包括以下几种:

  1. 简单判断模型中是否存在CPU算子。
  • 推荐您直接使用 hb_analyzer工具 查看是否包含CPU算子,具体使用方式及报告解读请跳转并参考相应章节。

  • 您也可以参考如下代码示例来检测您提供的xxx.bcxxx.hbm模型中是否含有CPU算子(一般我们认为xxx.bc中带有hbtl.call前缀的算子为CPU算子):

import sys
import os
from hbdk4.compiler import Hbm
from hbdk4.compiler.hbm import DeviceCategory

def check_cpu_ops_count(model_path):
    try:
        ext = os.path.splitext(model_path)[1].lower()

        if ext == ".bc": 
            hbtl_op_dict = {}
            from hbdk4.compiler import load
            model = load(model_path)
            
            for op in model[0].operations:
                op_type = str(op.type)
                op_name = getattr(op, 'name', 'unknown')
                if "hbtl.call" in op_type:
                    op_key = f"{op_type}: {op_name}"
                    hbtl_op_dict[op_key] = hbtl_op_dict.get(op_key, 0) + 1
            
            print("\033[91mhbtl(CPU) ops statistics:\033[0m")
            if hbtl_op_dict:
                for op_key, count in hbtl_op_dict.items():
                    print(f"{op_key}:  {count} ") 
            else:
                print("No hbtl(CPU) ops found")
        
        elif ext == ".hbm":
            hbm = Hbm(model_path)
            cpu_node_names = []
            for graph in hbm.graphs:
                for node in graph.nodes:
                    if node.device == DeviceCategory.Cpu:
                        cpu_node_names.append(node.name) 
            
            if cpu_node_names:
                for name in cpu_node_names:
                    print(f"\033[91mWarning: Please notice the cpu ops:  {name}\033[0m")
            else:
                print("No CPU ops found in HBM model")
        
        else:
            raise ValueError(f"Unsupported model format: {ext}, only .bc or .hbm are allowed")
            
    except Exception as e:
        error_msg = str(e)
        if "MLIR20" in error_msg:
            print(f"Error: Model loading failed (HBDK version mismatch or invalid bc file): {error_msg}")
        else:
            print(f"Error: {e}")
        sys.exit(1)

if __name__ == "__main__":
    # Replace with the path to your model file (.bc or .hbm)
    model_path = "model_path"
    check_cpu_ops_count(model_path)
  1. 使用hb_analyzer工具对模型进行可视化。如您想要查看具体的算子类型和更多信息,需要对模型进行可视化,参考命令为:
hb_analyzer visualize -m model.hbm
  1. 在板端使用hrt_model_exec工具查看模型中的CPU算子耗时情况。如您想要查看具体CPU算子的耗时情况,可以使用我们提供的hrt_model_exec工具进行查看,参考命令为:
hrt_model_exec perf --model_file=modelzoo/model.hbm --profile_path="."

在生成的profiler.log或者profiler.csv中,找到model_latency参数中对应的CPU算子,即可查看对应的耗时信息。

在检查完模型中是否存在CPU算子之后,可以继续进行后续的模型性能评估,下方为您提供开发机端仿真性能评估以及板端实测模型性能数据两种途径的详细介绍。

开发机端仿真性能评估

使用hb_compile工具

可以使用我们提供的hb_compile 工具对模型进行模型量化编译,在模型转换完成后,会在yaml文件配置的 working_dir 路径下生成预估的模型BPU部分的性能评估文件:model.html(可读性更好)和model.json。 工具使用包括两种模式,快速性能评测模式(开启fast-perf)和传统模型转换编译模式(不开启fast-perf), 详细的工具使用方法及相关的具体配置、参数请参考 hb_compile工具-模型量化编译 章节, 下方为您使用此工具进行性能评测时的可参考的使用方法:

  1. 快速性能评测模式(推荐)

Onnx模型:

hb_compile --fast-perf --model ${onnx_model} \
           --march ${march} \ 
           --input-shape ${input_node_name} ${input_shape} 

Caffe模型:

hb_compile --fast-perf --model ${caffe_model} \
           --proto ${caffe_proto} \
           --march ${march} \ 
           --input-shape ${input_node_name} ${input_shape} 
注意

请注意,如果您开启了快速性能评测模式(fast-perf模式):

  • 由于该模式下,工具会使用内置的高性能配置,请勿对 --config 参数进行配置。

  • 在使用hb_compile做模型量化编译时, --input-shape 参数配置仅在快速性能评测模式(即开启fast-perf)时生效。

  1. 传统模型转换编译模式
hb_compile --config ${config_file}  

调用性能分析API接口

我们也支持您通过调用性能分析API接口进行模型性能分析(API接口说明可参考HBDK Tool API Reference),参考命令如下:

from hbdk4.compiler import hbm_perf
hbm_perf("model.hbm")

成功执行后,会在终端内打印模型FPS等基本信息,同时,在当前调用API接口的目录下,会生成该模型的静态性能评估文件:

|-- model.html        # 静态性能评估文件(可读性更好)
|-- model.json        # 静态性能评估文件

您可选择 model.htmlmodel.json 对BPU部分的静态性能数据进行查看。

如您需要指定静态性能评估文件的路径,可以参考如下命令:

from hbdk4.compiler import hbm_perf
hbm_perf("model.hbm", output_dir="target_dir")

如果您在调用hbm_perf时,对开发板参数 remote_ip 进行了配置,会远程连接开发板进行性能评估,同样会在当前调用API接口的目录下,生成该模型的性能评估文件。

使用hb_compile工具或者调用性能分析API接口生成的性能评估文件的指标解读可以参考 仿真性能评估指标解读 章节。

板端实测模型性能数据

当模型的静态性能符合预期后,可以进一步上板实测模型的动态性能,我们提供了hrt_model_exec工具供您进行hbm模型性能数据上板实测, 工具使用详细说明可参考 hrt_model_exec工具-模型性能分析 章节,板端实测模型性能最简参考命令如下:

hrt_model_exec perf --model_file=modelzoo/model.hbm

命令执行后,会输出如下信息:

Running condition:
  Thread number is: 1
  Frame count   is: 200
  Program run time: 192.083 ms
Perf result:
  Frame totally latency is: 188.877 ms
  Average    latency    is: 0.944 ms
  Frame      rate       is: 1042.291 FPS
  • Running condition为性能评估的配置项:

    • Thread number:程序运行线程数(并行度)。

    • Frame count:模型运行帧数。

    • Program run time:性能评估程序运行所花费的时间。

  • Perf result为性能评估结果:

    • Frame totally latency:模型运行所花费的总时间。

    • Average latency:模型平均一帧运行所花费的时间。

    • Frame rate:模型帧率信息。

如您发现模型的性能评估结果不能符合您的预期,可以参考 性能调优指导 章节进行性能调优。