虚拟机端编译及验证
方案一:.prototxt
配置方式 早期 TIDL SDK 中旧式方法
1.增加asr_model.prototxt
文件和将 asr_model.onnx
文件放置到对应位置
# 目录图
edgeai-tidl-tools/
├── models/
│ └── onnx/
│ └── asr_model.onnx
└── examples/
└── models/
└── prototxt/
└── asr_model.prototxt
# asr_model.prototxt
modelType = 1 # ONNX模型
numParamBits = 8 # 8-bit量化
quantizationStyle = 2 # 2 = 训练后量化 (Post-Training Quantization)
inputNetFile = "../../models/onnx/asr_model.onnx" # 你的ONNX模型路径
outputNetFile = "asr_model.bin"
outputParamsFile = "asr_model.params"
inDataNamesList = spec
outDataNamesList = logits
inputDimensions = 1, 1, 161, 200 # 固定输入shape: [NCHW]
numChannels = 1 # C=1
numRows = 161 # H
numCols = 200 # W
preprocType = 0 # 不做图像预处理
metaDataFile = meta_data.bin # 可留空,或者你生成一个量化校准文件(用于量化校准)
2.进入 TIDL 主目录执行:
cd edgeai-tidl-tools
./tools/tidl_model_import.out ./examples/models/prototxt/asr_model.prototxt
注意:执行后可能会遇到 modelType 参数重复和device_config.cfg 找不到 的问题,默认寻找路径是…/…/test/testvecs/config/import/,实际存在路径为./device_config.cfg,更改路径或复制到默认路径
方案二:YAML 模板导入流程 官方 edgeai-tidl-tools
的标准方法,新版本 SDK 更鼓励使用 YAML + run_import_on_pc.py
1.找到已有示例模板 run_import_on_pc.py
cd ~/edgeai-tidl-tools/examples/osrt_python
2.准备model_list.yaml
文件
在 examples/osrt_python/model_list/
文件夹下,每一个 YAML 对应一个模型的导入配置。
🔧复制一个现有的配置(例如 mobilenet_v2.yaml
):
cp model_list/mobilenet_v2.yaml model_list/asr_model.yaml
并修改如下关键字段:
model_path: ../../models/onnx/asr_model.onnx
input_data_path: ../../test_data/input/your_input_file # 可以随便写一个虚拟路径
preprocess:
mean: [0.0]
scale: [1.0]
channel_order: "NCHW"
data_layout: "NCHW"
# 根据你模型输入调整
session:
model_name: "asr_model"
model_type: "onnx"
runtime_options:
tidl:
artifacts_folder: "./output/asr_model"
platform: "am67"
version: "9.1"
tensor_bits: 8
3.运行导入命令
在 examples/osrt_python
下运行:
python3 run_import_on_pc.py --model_list model_list/asr_model.yaml
注意:可能克隆的edgeai-tidl-tools仓库并没有run_import_on_pc.py
、model_list/
文件夹等,需要获取完整版本的,可以在主目录下运行以下命令(重新克隆):
git clone https://github.com/TexasInstruments/edgeai-tidl-tools.git
cd edgeai-tidl-tools
git checkout main # 如果提示 tag,可以切到 v9.x 的 tag
确保 examples/osrt_python/
目录中含有:
run_import_on_pc.py
model_list/
session/
方案三:使用 TVM + Python 编译路径 对 ONNX 支持更友好,尤其适合语音这种序列模型
1.准备 ONNX 模型和校准样本(log-mel 特征)
a.安装TVM 依赖环境
cd ~/edgeai-tidl-tools
git clone --recursive https://github.com/apache/tvm.git
# 拉取子模块
git submodule sync
git submodule update --init --recursive --force
# 安装 LLVM
sudo apt install llvm-11 llvm-11-dev clang-11
export LLVM_CONFIG=/usr/bin/llvm-config-11
cd tvm
mkdir build
cp cmake/config.cmake build
# 然后编辑 build/config.cmake:
nano build/config.cmake
修改以下行(取消注释):
set(USE_LLVM ON)
set(USE_RELAY ON)
b.编译 TVM
cd build
cmake ..
make -j$(nproc)
c.设置Python环境变量
export TVM_HOME=$PWD/..
export PYTHONPATH=$TVM_HOME/python:$PYTHONPATH
d.测试安装是否成功
python3 -c "import tvm; print(tvm.__version__)"
2.编写一个 TVM Python 脚本,调用 tvm.contrib.tidl.compile.compile_model(...)
# run_import_asr_tvm.py (放在 examples/osrt_python 目录下)
import os
import numpy as np
import onnx
import tvm
from tvm import relay
from tvm.contrib.tidl.compile import compile_tidl_model
# 路径配置
model_path = "asr_model.onnx"
artifacts_folder = "./artifacts_asr"
os.makedirs(artifacts_folder, exist_ok=True)
# 模拟一条校准数据 [1, 161, time],你也可以用真实样本
input_data = np.random.rand(1, 161, 100).astype(np.float32)
input_name = "spec"
# 加载 ONNX
onnx_model = onnx.load(model_path)
mod, params = relay.frontend.from_onnx(onnx_model, shape={input_name: input_data.shape})
# TVM -> TIDL 编译
tidl_mod, status = compile_tidl_model(
mod=mod,
params=params,
artifacts_folder=artifacts_folder,
platform="am67",
tensor_bits=8,
input_data=[input_data],
tidl_tools_path=os.environ["TIDL_TOOLS_PATH"],
# 根据情况调整:
enable_tidl_offload=True,
enable_c7x_codegen=True,
)
print("[✓] 编译完成,输出位于:", artifacts_folder)
python3 examples/osrt_python/run_import_asr_tvm.py
3.配置参数,如 platform="AM62A"
、enable_tidl_offload=True
、enable_c7x_codegen=True
、tensor_bits=8
等
4.脚本会生成 model-artifacts
,包括 .bin + io + lib
等
5.拷贝部署至板子推理
完整的tvm+python流程如上所示,但再调用tvm的时候会显示内部有空指针崩溃错误,且无法调用relay模块,后来发现使用的不是使用 TI repo 自带的 TVM
正确的克隆命令应该为:
git clone --recursive https://github.com/TexasInstruments/tvm.git
目前还没试正确的tvm方法,因为搞得很晕,所以还是想验证环境配置有没有问题,所以去试着跑了图像识别的例程,步骤也顺便分享一下:
一、自训练模型
-
预训练模型及对应配置文件获取,链接
-
模型训练
过程详见
edgeai-yolov5
,得到best.pt
-
格式转化
使用
export.py
得到.onnx格式
二、虚拟机端编译及验证
- 在
test_data
文件夹中添加用于推理的输入图像 - 创建
models
文件夹,存放自训练得到的.onnx及对应的配置文件.prototxt - 替换
examples/osrt_python
中的common_utils.py
和model_configs.py
,在examples/osrt_python/ort
中新增onnx_test.py
,主要差异在于:
a) 修改模型对应的类:原文件中是模型对应的coco
数据集中80个类,修改为自训练模型中的
CLASSES = ("empty", "z", "f","other")
这里是因为训练的时候我用的是模板正反面的图片训练的,“z” "f"就代表的是正、反。
b) 修改相关文件路径:artifacts_folder
、output_images_folder
和tidl_tools_path
等
c) 增加目标框边标注相关信息:draw.text((int(xmin), int(ymin))
, CLASSES[int(outputs[0][i][5])]
, (255, 0, 0) , ImageFont.load_default())
增加yolov5对应的配置,指定使用该模型models = ['yolov5s6_640_best']
models_configs = {
'yolov5s6_640_best' : {
'model_path' : os.path.join(models_base_path, 'best.onnx'),
'mean': [0, 0, 0],
'scale' : [0.003921568627,0.003921568627,0.003921568627],
'num_images' : numImages,
'num_classes': 4,
'model_type': 'od',
'od_type' : 'YoloV5',
'framework' : '',
'meta_layers_names_list' : os.path.join(models_base_path, 'best.prototxt'),
'session_name' : 'onnxrt' ,
'meta_arch_type' : 6
},
}
d) 运行python3 onnx_test.py -c
编译模型,在model-artifacts
下生成编译后的模型文档
运行python3 onnx_test.py
完成虚拟机端模拟推理,在output_images
生成推理结果
三、edgeai-tidl-tools板端部署—python
- 复制tidl_python文件夹到/opt目录,各文件介绍如下:
- model-artifacts:在虚拟机上编译后得到的模型文档,推理所必
- models:原始的模型文件,包括.onnx及对应的配置文件.prototxt
- output_images:模型推理结果
- test_data:用于推理的输入图像 common_utils.py:test.py中会用到的一些工具函数
- test.py:推理脚本
- 参考edgeai-tidl-tools中
examples/osrt_python
进行修改,主要差异如下:
- 在虚拟机端修改的基础上,将model_configs.py合并到test.py中
- 在原来的基础上精简无用的分支
- 运行
python3 test.py
即可完成推理过程
结果验证此例程可行,代表配置环境没问题,但要部署语音识别,还需增加一些处理函数,并没有相应参照文件。