【TDA4板端部署】基于 Pytorch 训练并部署 ONNX 模型在 TDA4

1 将torch模型转onnx模型

Ti转换工具只支持以下格式:
Caffe - 0.17 (caffe-jacinto in gitHub)
Tensorflow - 1.12
ONNX - 1.3.0 (opset 9 and 11)
TFLite - Tensorflow 2.0-Alpha

基于 Tensorflow、Pytorch、Caffe 等训练框架,训练模型:选择一个训练框架,然后定义模型,最后使用训练的数据集训练出满足需求的模型。

2 onnx模型转bin模型

训练好的模型,需要使用 TIDLImporter 工具导入成可在 TIDL 上运行的模型。导入的主要目的是对输入的模型进行量化、优化并保存为TIDL 能够识别的网络模型和网络参数文件。
TIDL Importer 工具处理流程如下:
在这里插入图片描述

2.1 写配置文件

模型的导入需要模型导入配置文件,tidl_import_mobilenetv2.txt ,需要将其放在
${TIDL_INSTALL_PATH}/ti_dl/test/testvecs/config/import/public/onnx/路径下。导入的配置文件里面指定了模型配置参数,如果对参数有不清楚的地方参考链接 TIDL-RT Import Configuration Parameters:

具体包括:
Configuration Parameters for Input Pre-Processing
Configuration Parameters for path of different modules
Configuration Parameters related to TIDL-RT inference for quantization
Configuration Parameters for Graph Compiler
Configuration Parameters for format conversion

以ONNX Squeeze Net为例

modelType          = 2
inputNetFile      = "../../test/testvecs/models/public/onnx/squeezenet1.1.onnx"
outputNetFile      = "../../test/testvecs/config/tidl_models/onnx/tidl_net_squeezenet1.1.bin"
outputParamsFile   = "../../test/testvecs/config/tidl_models/onnx/tidl_io_squeezenet1.1_"
inDataNorm  = 1
inMean = 123.675 116.28 103.53
inScale = 0.017125 0.017507 0.017429
resizeWidth = 256
resizeHeight = 256
inWidth  = 224
inHeight = 224 
inNumChannels = 3
inData = ../../test/testvecs/config/imageNet_sample_val.txt
postProcType = 1

以tfLite为例

modelType          = 3
numParamBits      = 15
quantizationStyle  = 2
inputNetFile      = ../../test/testvecs/models/public/tflite/mobilenet_v1_1.0_224.tflite
outputNetFile      = "../../test/testvecs/config/tidl_models/tflite/tidl_net_tflite_mobilenet_v1_1.0_224.bin"
outputParamsFile   = "../../test/testvecs/config/tidl_models/tflite/tidl_io_tflite_mobilenet_v1_1.0_224_"
inDataNorm  = 1
inMean = 128 128 128
inScale =  0.0078125 0.0078125 0.0078125
resizeWidth = 256
resizeHeight = 256
inWidth  = 224
inHeight = 224 
inNumChannels = 3
inData = ../../test/testvecs/config/imageNet_sample_val_bg.txt
postProcType = 1

2.2 执行模型转换命令

在 Ubuntu 命令行执行下面命令导入模型:

user@ubuntu-pc$ 
cd /home/fredy/startJacinto/sdks/ti-processor-sdk-rtos-j721e-evm-08_
01_00_11/tidl_j7_08_01_00_05/ti_dl/utils/tidlModelImport

./out/tidl_model_import.out /home/fredy/startJacinto/sdks/ti-processor-sdk-rtos-j721
e-evm-08_01_00_11/ tidl_j7_08_01_00_05/ti_dl/test/testvecs/config/import/public/onnx/tidl_import_mobilenetv2.txt(配置文件) 

Ubuntu 命令行执行上述命令输出的 log中,结尾输出 ALL MODEL CHECK PASSED 说明模型导入成功。

2.3 查看模型转换结果

模型导入使用 tidl_model_import.out 工具,该工具导入输入的模型(ONNX 模型),输出能够为 TIDL所使用的网络模型和参数文件(TIDL Network FileTIDL IO Info File),输入输出文件如下:

  • TF Model (Proto) File : …/…/test/testvecs/models/public/onnx/mobilenetv2/
    mobilenetv2.onnx
  • TIDL Network File : …/…/test/testvecs/config/tidl_models/onnx/tidl_ne
    t_mobilenetv2.bin
  • TIDL IO Info File : …/…/test/testvecs/config/tidl_models/onnx/tidl_io
    _mobilenetv2

3 模型 PC 推理

这一小节,将使用上一章节生成的模型文件(TIDL Network File 和 TIDL Network File )验证模型的正确性。
TIDL Network File : …/…/test/testvecs/config/tidl_models/onnx/tidl_net_mobilenetv2.bin
TIDL IO Info File : …/…/test/testvecs/config/tidl_models/onnx/tidl_io_mobilenetv2

3.1 PC上验证并部署

经过TIDL tidl_model_import.out 工具导入 tensorflow 模型,我们可以快速利用 Ubuntu 的工具PC_dsp_test_dl_algo.out 进行推理验证结果。PC_dsp_test_dl_algo.out 需要配置文件testvecs/config/infer/public/onnx/tidl_infer_mobilenetv2.txt(相关参数的解释,请参考这里

Configuration files used for validation of models are provided in the “ti_dl/test/testvecs/config/infer/” folder for reference

Below is one example configuration file for Inference



inFileFormat    = 2
postProcType = 1
numFrames   = 1
netBinFile      = "../testvecs/config/tidl_models/tidl_net_jacintonet11v2_np2quant.bin"
ioConfigFile    = "../testvecs/config/tidl_models/tidl_io_jacintonet11v2_np2quant_1.txt"
inData  =   "../testvecs/config/classification_list.txt"
outData =   "../testvecs/output/airshow_j11.bin"

On Successful execution the output tensor will be generated in as binary raw file in the path specified by “outData”.

3.2 EVM 上验证并部署

模型在 PC 验证后,最终可以部署在 EVM 上进行性能和结果测试。如果觉得 PC 验证会浪费时间,可以省略 PC 验证的步骤,完成模型的导入后,就可以直接在 EVM 上验证。

经过 TIDL tidl_model_import.out 工具导入的 ONNX 模型,在 EVM 上,使用
TI_DEVICE_a72_test_dl_algo_host_rt.out 工具进行推理测试。该工具不仅可以测试使用模型的正确性,还可以测试真实的帧率。 经 TI_DEVICE_a72_test_dl_algo_host_rt.out 处理后,输出图像存储在/opt/tidl_test/testvecs/output,可将数据导入到 PC 确认其结果。

基于 EVM 进行推理确认其正确性后,模型可以部署到应用。

4 FAQ

4.1 SDK 中 TIDL 支持哪些算子?

TIDL 支持的算子请参考使用版本的 UserGuide,参考链接

4.2 SDK 中 ONNX 支持和验证的模型有哪些?

TIDL 提供了支持的模型库,用户可以参考模型库中的模型快速进行模型进行验证,并参考模型
进行新的模型设计。模型库参考链接

4.3 如果遇到 performance 问题,如何进行调试?

Performance 的问题请参考链接的建议进行调试。

4.4 TIDL Importer 工具导入 ONNX 模型需要注意哪些方面?

ONNX 模型可以直接导入 TIDL,TIDL Importer 工具输入配置文件路径在:TIDL_PATH
/ti_dl/test/testvecs/config/import/public/tensorflow/tidl_import_xxx.txt。对于 import 配置文件注意检查如下内容:

 1. 导入的 modelType:ONNX 模型配置为 2 (.onnx files). 
 2. inputNetfile/outputNetFile: 检查输入/输出模型文件的路径。
 3. inData: 输入数据的配置,通常自己的模型,需要调整输入图片。
 4. inWidth/inHeight/resizeWidth/resezeHeight :配置图片输入的 size 及调整后的 size。
 5. inNumChannels : 输入图片通道数。

4.5 TIDL 如何打印 log 信息?

不论是 Import 模型的时候,还是 inference 的时候,难免会遇到问题,当遇到问题的时候,怎么样才
能输出更多的调试信息呢? TIDL 提供了两个标志变量 writeTraceLevel 和 debugTraceLevel 用来获取更多的信息。
debugTraceLevel 可以打印更多的输出信息,便于追踪 import 和 inference 的过程。默认配置是 0,可支持 1、2 配置。数字越大,表明输出的信息越多。
writeTraceLevel 可以输出每一层的信息到文件,便于模型逐层比较。默认配置是 0,没有输出,可支
持 1、2、3 配置:1- Fixed Point , 2- Padded Fixed Point, 3 - Floating point。

5 参考

  1. https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtosjacinto7/08_01_00_11/exports/docs/tidl_j7_08_01_00_05/ti_dl/docs/user_guide_html/usergroup0.html
  2. https://www.ti.com.cn/cn/lit/an/zhcab78/zhcab78.pdf

相关推荐

  1. 导出zoedepth的onnx模型基于gradio实现在线部署

    2024-07-21 11:00:02       62 阅读
  2. TDC - Crisis/Phobia - 4 types of Crisis

    2024-07-21 11:00:02       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 11:00:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 11:00:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 11:00:02       45 阅读
  4. Python语言-面向对象

    2024-07-21 11:00:02       55 阅读

热门阅读

  1. 关于限定视频码率的问题

    2024-07-21 11:00:02       14 阅读
  2. 如何进行结构化编程:结合代码的实践指南

    2024-07-21 11:00:02       16 阅读
  3. LeetCode 150, 112, 130

    2024-07-21 11:00:02       17 阅读
  4. 《李彦宏在世界人工智能大会发言的深度洞察》

    2024-07-21 11:00:02       11 阅读
  5. 录入学生信息

    2024-07-21 11:00:02       17 阅读
  6. 分布式ID是什么?有哪些解决方案?

    2024-07-21 11:00:02       16 阅读
  7. 【c++】c++新概念“列表”

    2024-07-21 11:00:02       13 阅读