工具/软件:
由于历史原因、TI 中的模型导入有两组工具。 这两套已在很长一段时间内并行开发。 以下说明了这两种工具的相似性和差异。
相似性:
Edgeai-tidl-tools 会调用 python API 来运行 import、这与 RTOS 工具相同。 RTOS 工具和 edgeai 工具都调用模型解析(将 onnx 模型解析为 tidlrt 格式)、模型优化器、校准、存储器规划器。 尽管它们调用这些函数块的方式不同、但最后调用的 API 是相同的。 一般来说、这两种工具是相同的。
差异:
参数:
edgeai-tidl-tools 通过提供默认值来隐藏大量参数、使其易于使用。 这些参数可以在 edgeai-tidl-tools 的文档中找到。 RTOS 工具参数说明可在较旧版本的 SDK(如 8.0)中找到。 虽然一些参数的名称不同、但主要的有效参数映射到源代码中名为 gparams 的结构中。
以下是 edgeai 工具和 RTOS 工具方面的 gparams 转储:
edgeai:
randParams: 0 modelType: 6 quantizationStyle: 2 calibrationOption: 0 activationRangeMethod: 0 weightRangeMethod: 1 percentileActRangeShrink: 0.010000 percentileWtRangeShrink: 0.010000 biasCalibrationFactor: 0.050000 biasCalibrationIterations: -1 quantRoundAdd: 50 numParamBits: 16 numFeatureBits: 16 inFileFormat: 1 numFrames: -1 numFramesBiasCalibration: -1 postProcType: 0 postProcDataId: 0 foldMaxPoolInConv2D: 0 foldDepthToSpaceInConv2D: 0 foldPreBnConv2D: 1 foldBnInConv2D: 1 foldEltWiseInConv2D: 0 metaArchType: -1 debugTraceLevel: 0 writeTraceLevel: 0 compileConstraintsFlag: 1601 executeNetworkCompiler: 1 msmcSizeKB: -1 deviceName: 1 numCores: 1 quantRangeUpdateFactor: -1.000000 quantRangeExpansionFactor: 1.000000 addDataConvertToNet: 3 isQuantParamsToBeExported: 0
RTOS:
randParams: 0 modelType: 6 quantizationStyle: 2 calibrationOption: 0 activationRangeMethod: 0 weightRangeMethod: 1 percentileActRangeShrink: 0.010000 percentileWtRangeShrink: 0.010000 biasCalibrationFactor: 0.050000 biasCalibrationIterations: 1 quantRoundAdd: 50 numParamBits: 16 numFeatureBits: 16 inFileFormat: 1 numFrames: 1 numFramesBiasCalibration: -1 postProcType: 0 postProcDataId: 0 foldMaxPoolInConv2D: 0 foldDepthToSpaceInConv2D: 0 foldPreBnConv2D: 1 foldBnInConv2D: 1 foldEltWiseInConv2D: 0 metaArchType: -1 debugTraceLevel: 0 writeTraceLevel: 0 compileConstraintsFlag: 1601 executeNetworkCompiler: 1 msmcSizeKB: -1 deviceName: 1 numCores: 1 quantRangeUpdateFactor: -1.000000 quantRangeExpansionFactor: 1.000000 addDataConvertToNet: 0 isQuantParamsToBeExported: 0
主要差异如下:
biasCalibrationItetatation: 1.
numFrames:–1
numFramesBiasCalibration:–1
addDataConvertToNet:3.
“biasCalibrationItetatation",“,"numFrames"、"numFrames"和“和"numFramesBiasCalibration"“"numFramesBiasCalibration"由“由 RTOS“ RTOS 工具中的导入配置纹理文件直接定义。 而 edgeai 工具中的这三个是稍后通过映射 python 脚本中定义的配置来定义的。 “addDataConvertToNet"在“在 edgeai tidl 工具中默认设置为 3、但需要在 RTOS 工具和相关的所需输入/输出格式中手动配置。
输入/输出格式:
在 edgeai 工具中、输入/输出格式将保持与 onnx 模型相同。 因此、无论输入/输出格式是原始 ONNX 模型、tidlrt 中的格式都将保持不变。 但是、在 RTOS 工具中、您可以定义所需的输入/输出格式、以便更轻松地与上游输入图像和下游后处理连接。 输入/输出始终定义为浮点、输入映像始终是 uint8、因此您可以在 RTOS 配置文件中将输入格式连同比例缩放和平均值一起设置为 uint8、从而使 TIDL 在推理处理中自动转换数据。
要使转换后的 TIDLRT 二进制文件接受 edgeai-tidl-tools 中的 uint8、您可以使用内部的脚本在提供的缩放和均值的原始 ONNX 模型中将输入更改为 int8。 因此、ONNX 模型将发生更改、您可以在 ONNXRT 和 TIDL 中使用 rgb888 作为输入。
尽管默认情况下使用 RTOS 工具和 edgeai 工具时输入/输出格式是不同的、但您可以使用脚本和配置文件、使它们生成要在 TIDL 中使用的相同 TIDLRT 二进制文件。
示例:
以下示例展示了如何使用 edgeai-tidl-tools 和 RTOS 工具来生成几乎相同的工件。
ONNX 模型:
e2e.ti.com/.../2553.SimpleBev_5F00_OD.onnx
RTOS 工具的导入配置:
modelType = 2 numParamBits = 8 numFeatureBits = 8 inputNetFile = "SimpleBev_OD.onnx" outputNetFile = "output/tidl_net.bin" outputParamsFile = "output/tidl_io_" inDataNorm = 0 0 inDataFormat = 1 foldPreBnConv2D = 1 foldBnInConv2D = 1 inWidth = 24 2 inHeight = 18 32768 inNumChannels = 64 1 numBatches = 1 1 numFrames = 1 1 inData = "inputs.bin" inFileFormat = 1 inDataNamesList = "/bev_encoder/Reshape_15_output_0, /bev_encoder/Unsqueeze_5_output_0" outDataNamesList = "/bev_encoder/con_layer.0/con_layer.0.0/layer/layer.0/Conv_output_0" outputFeature16bitNamesList = "/bev_encoder/con_layer.0/con_layer.0.0/layer/layer.0/Conv_output_0" params16bitNamesList = "/bev_encoder/con_layer.0/con_layer.0.0/layer/layer.0/Conv_output_0" perfSimConfig = /home/ht/edgeai/edgeai-tidl-tools/tools/AM69A/tidl_tools/device_config.cfg perfSimTool = /home/ht/edgeai/edgeai-tidl-tools/tools/AM69A/tidl_tools/ti_cnnperfsim.out tidlStatsTool = "/home/ht/edgeai/edgeai-tidl-tools/tools/AM69A/tidl_tools/PC_dsp_test_dl_algo.out" graphVizTool = "/home/ht/edgeai/edgeai-tidl-tools/tools/AM69A/tidl_tools/tidl_graphVisualiser.out" addDataConvertToNet = 3 outElementType = 6 inElementType = 6 6 debugTraceLevel = 1 writeTraceLevel = 0 writeOutput = 0 postProcType = 0 c7xFirmwareVersion = 11_00_08_00 compileConstraintsFlag = 83886080 quantizationStyle = 2 calibrationOption = 0 activationRangeMethod = 0 weightRangeMethod = 1 biasCalibrationIterations = -1
edgeai 工具的导入配置:
"gridsample16bit": create_model_config(
task_type="classification",
source=dict(
model_url="dummy",
infer_shape=True,
),
preprocess=dict(
resize=256,
crop=224,
data_layout="NCHW",
resize_with_pad=False,
reverse_channels=False,
),
session=dict(
session_name="onnxrt",
model_path=os.path.join(models_base_path, "SimpleBev_OD.onnx"),
input_mean=[123.675, 116.28, 103.53],
input_scale=[0.017125, 0.017507, 0.017429],
input_optimization=True,
),
postprocess=dict(),
extra_info=dict(num_images=3, num_classes=3),
),
使用 RTOS 工具生成的工件
e2e.ti.com/.../7343.artifacts.tar.gz
使用 edgeai 工具生成的工件:
e2e.ti.com/.../artifacts_5F00_edgeai.tar.gz
您可以检查 xxx_net.bin.svg 文件和 bufinfolog_0.txt 以查看差异。
“xxx_net.bin.svg"描述“描述了模型的结构如何与使用的图层以及它们的连接方式。
“ bufinfolog_0.txt “描述了如何规划内存以及如何为每一层规划工作加载、例如如何将内存从上行卷积层传输到下行数据垂直层。
无论如何、您可以使用这些不同的工具实现几乎相同的结果。 您可以根据自己的需求选择您喜欢的任何一个。 此常见问题解答是对这些工具的一般比较、这两种工具之间仍然存在细微差异、将在进一步的指南中介绍。
此致、
Adam