如何将自定义模型编译成Hailo NPU的.hef模型?
摘要:目录Python 环境配置转换量化编译参考 在上一篇博客中,探讨了如何使用 Python 和 hailo_model_zoo 中预编译的模型来实现目标检测。本篇博客将深入介绍如何将用户自定义训练的模型转换并优化为能够在 Hailo NPU
目录Python 环境配置转换量化编译参考
在上一篇博客中,探讨了如何使用 Python 和 hailo_model_zoo 中预编译的模型来实现目标检测。本篇博客将深入介绍如何将用户自定义训练的模型转换并优化为能够在 Hailo NPU 上高效运行的 .hef 模型。
Python 环境配置
为了将自定义模型编译为 .hef 模型,需要安装 Hailo Dataflow Compiler(DFC) 工具。登录 Hailo 的网站 https://hailo.ai/developer-zone/software-downloads,找到对应 Python 版本的 .whl 文件,并按照下面的步骤创建虚拟环境并安装必要的软件包:
conda create -n hailo-model python=3.10 # 创建虚拟环境
conda activate hailo-model # 激活虚拟环境
sudo apt install libgraphviz-dev
pip install hailo_dataflow_compiler-3.29.0-py3-none-linux_x86_64.whl # 安装 Hailo Dataflow Compiler Python 包
将自定义模型转换为 .hef 模型需要三步:
将 Tensorflow 或 ONNX 模型转换成 Hailo Archive 模型(.har)。
将 .har 模型进行量化。
编译为 Hailo Executable File 模型(.hef)。
转换
Tensorflow 与 ONNX 模型都可以进行转换,这里以 yolov8n 的 ONNX 模型为例,首先引入软件包并定义相关变量。
from hailo_sdk_client import ClientRunner
import os
import cv2
import numpy as np
input_size = 640 # 模型输入的尺寸
chosen_hw_arch = "hailo8l" # 要使用的 Hailo 硬件架构,这里是 Hailo-8L
onnx_model_name = "yolov8n" # 模型的名字
onnx_path = "yolov8n.onnx" # 模型的路径
hailo_model_har_path = f"{onnx_model_name}_hailo_model.har" # 转换后模型的保存路径
hailo_quantized_har_path = f"{onnx_model_name}_hailo_quantized_model.har" # 量化后模型的保存路径
hailo_model_hef_path = f"{onnx_model_name}.hef" # 编译后模型的保存路径
接着实例化 ClientRunner 类,并调用 translate_onnx_model() 方法进行转换。
runner = ClientRunner(hw_arch=chosen_hw_arch)
hn, npz = runner.translate_onnx_model(model=onnx_path, net_name=onnx_model_name) # 将 onnx 模型转为 har
runner.save_har(hailo_model_har_path) # 保存转换后的模型
在模型结构较为简单时,通常不会报错。当模型结构较为复杂时,会存在 Hailo NPU 不支持的算子,从而报错导致转换失败。NPU 支持的算子可以查询官网的数据手册,或者查看下文参考中的链接。例如在转换 YOLOv8 模型时会提示以下错误信息:
hailo_sdk_client.model_translator.exceptions.ParsingWithRecommendationException: Parsing failed. The errors found in the graph are:
UnsupportedShuffleLayerError in op /model.22/dfl/Reshape: Failed to determine type of layer to create in node /model.22/dfl/Reshape
Please try to parse the model again, using these end node names: /model.22/Concat_3
出现错误时有两种解决方案。
