This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
问:
"我发现 TI 的 Model Zoo 拥有神经网络、这些神经网络已使用 C7x AI 加速器在 AM6xA 处理器[AM62A、AM67A、AM68A、AM68PA、AM69A 或 TDA4x SoC]上经过验证并具有基准测试。"
"我需要使用我收集的数据集为自己的应用训练这些模型。 该怎么做?"
答:
以上是开发者想要将 TI 的预优化网络用于其定制应用时遇到的相当常见的问题。 建议使用其中一些模型、因为它们已针对运行时延迟和精度进行了分析和优化。 TI 提供的模型已就通用数据集(例如 COCO 或 Imagenet1k)进行了预训练、但可能需要重新培训才能应用于自定义用例。
对于某些网络、我们对原始网络架构进行了修改、对 AM6xA 和 TDA4x SoC 上使用的硬件加速器 C7xMMA 更加友好。 这些修改通常是为了提高我们的定点加速器的精度或运行时效率。 例如、将 SiLU 激活函数替换为 Relu 在定点上要快得多。 我们通过在基准或模型 zoo 存储库中的模型名称中包含"lite"或"TI lite"来表示这些修改后的架构。
在最近的操作员支持下、某些原始模型可能会按原样得到支持、而以前并不支持这些原始模型。 请参阅我们的受支持运算符/层列表(以及任何相关限制)以了解最新信息、并请注意、该文档是关于我们 SDK 的版本指定。
在后续回复中、我将对 Model Zoo 中与再培训和重复使用相关的模型进行描述和分类。
注释的链接和存储库:
请注意、为了您的利益、我在文本中嵌入了大量链接。 这些链接中的大多数链接都可以访问 edgeai-tensorlab 或 edgeai-tidl-tools 存储库。
TL;DR (过长、未读取):TI 有一组 AI 模型已在我们的 SOC 上进行验证和基准测试。 这些器件可以重新训练、但并非所有架构都有 TI 提供的完整示例和编程工具供您自己进行再培训。 在本常见问题解答中、我将介绍负责设计此流程的可用资源和必要知识。 一些架构经过修改并标记为"TI Lite"、以表示架构与原始版本不同。 其他引脚由 TI 按原样制定。 TI-Lite 模型需要一些 TI 硬执行以便在训练过程中类似地进行的优化;未修改的架构对训练的 TI 支持有限(但 使用 TIDL 工具编译时支持 e2e)
TI 支持一组有关自定义数据集的转让学习和再培训模型。 这些检查点通常从使用大型开源数据集从头开始进行训练的经过预先训练的模型检查点开始。 这些架构有 TI 的支持代码和示例来处理训练和模型编译。
此处使用的基线工具是edgeai-modelmaker (edgeai-tensorlab 的一部分)、可以按原样以编程方式使用或通过模型编写器(Edge AI Studio 的一部分)中的图形界面使用。 这使用 Pytorch 作为训练框架、并将模型导出为 ONNX 格式。 训练完成后、将针对目标 SoC 编译模型。 编译在edgeai-benchmark 中预先形成。
这些工具支持的架构集可能会发生变化、通常使用一组可扩展架构来提供多种折衷速度和精度的选项。 例如、YOLOX 架构具有多个可供选择的型号(毫微型、小型、小型等)。 支持的一组模型反映了 TI 深度学习解决方案的常见请求、先进技术以及速度与精度曲线。
对于培训、实际的框架和培训代码来自 edgeai-tensorlab 存储库中的另一个子目录、例如基于 YOLOX 的键点检测架构将使用 edgeai-yolox。 modelmaker 使用多个训练工具。 Modelmaker 为每个培训工具提供一致的界面。
开发人员可以更改与培训相关的各种参数、例如 epoch 数量、学习速度、体重减轻等 在模型编写器中、有这些框和描述符。 Edgeai-modelmaker 通过应用于训练和编译的 YAML 配置文件显示此类参数–此文件是与 modelmaker 的主要接口。 在编译期间、YAML 配置中的任何设置都将用于覆盖 edgeai-benchmark/configs 中的默认设置集。
例如、edgeai-modelmaker/config_classification.yaml 将默认为 mobilenet_v2_lite 以用于训练和编译。
对于已被 TI 修改为"lite"或"TI lite"的模型、执行了对网络架构的一些更改以优化速度和精度。 在本例中、我们获取了模型的上游版本、调整了加速器的架构、然后将其重新上传到我们的 Model Zoo 中。
我们对这些模型类型再培训的支持有限、开发人员应利用开源代码和支持工具来针对其用例训练这些经过修改的架构。 以上信息介绍了重现这些 TI Lite 模型的一般流程和资源。
开发人员可通过2种方法来重现此类 TI-Lite 模型:
你也可以跳过预先训练的重量,从零开始,但这将是更具挑战性的训练。 从头开始进行训练需要更大的数据集和许多 epoch。
对于大多数 TI-lite 模型、我们提供了 Pytorch PTH 文件格式的可训练权重、以及导出的 ONNX 文件。 对于 tensorflow 模型、不支持重新训练这些架构、因此必须坚持使用此架构的开发人员将需要分析上游版本和 TI 版本、描绘差异并相应地修改 Tensorflow 中。
在 modelzoo 中、模型按任务类型、数据集和训练工具进行分组。 如果培训工具包括"edgeai"、则该模型可能是在 edgeai-tensorlab 中进行训练(工具名称可能缩写、例如 tv=torchvision)。 顶层目录结构包含流行的上游训练工具(如毫米波检测、毫米波和 yolox)叉、它们也依赖于 edgeai-torchvision。
modelzoo 的这些 edgeai-子目录中的模型通常包含:
请注意、其中一些文件具有。 链路扩展。 这些文件为单行文本、且带有指向主文件的链接。 这减小了 git 存储库的尺寸。 大多数链接还将包括 SDK 版本、表明此模型已在该版本中进行测试和验证。
为了重新训练模型、您需要构建模型架构的代码和包含起始权重的 PTH 文件。
模型完成训练后、必须将其导出为 ONNX 格式。 如果模型是使用检测头进行物体或关键点检测、还需要根据TIDL 元架构导出描述该头的 PROTOTXT 文件。
还建议寻求训练期间执行的任何预处理信息–在推理之前、应在输入上进行类似的预处理。 除非有意对其进行更改、否则它可能与 modelzoo 使用的相同(请参阅模型的配置。 YAML)
本常见问题解答中介绍的 modelzoo 中的最后一类模型是完全源自 TI 外部的开源模型。
对于这些型号、我们的技术支持非常有限、因为它与培训有关。 我们已从外部源下载模型、例如 Pytorch 的模型集线器、onnx 的模型集线器、tensorflow 的模型园艺、齿槽面等、使用 TIDL 工具编译了模型、并对我们的加速器的性能进行了基准测试。
对于这些模型、我们支持使用 TIDL 工具进行编译。 为此、modelzoo 包括导出的模型文件和一个描述预处理和编译参数的 YAML 配置文件。 有关使用 TIDL 进行独立编译/导入的信息、请参阅 edgeai-tidl-tools。
C7x 是利用矩阵乘法硬件和 DSP 的定点加速器。 某些层和配置在此架构上效率更高、并且大多数模型受益于此类架构的一些优化。
首先、所有层都应采用支持的配置、如我们的支持运算符文档 https://github.com/TexasInstruments/edgeai-tidl-tools/blob/master/docs/supported_ops_rts_versions.md 中所述
TI 有一些用于自动优化的工具、这些工具作为 tensorlab edgeai-modeloptimization 部分的一部分进行托管。 大多数优化要么将不受支持的层配置替换为受支持的层配置、要么将受支持的操作替换为效率更高的操作。 这些优化也可以根据需要应用的时间进行分类–训练之前或之后。 对模型架构本身的任何更改都被称为"模型外科手术"。
任何将影响从某个层发出的数值的模型更改都应在训练完成之前执行。 训练前的优化将包括、例如:
或者、当变化实际上并未影响值本身时、训练后优化是合适的、例如:
作为 tensorlab 的一部分、torchmodelopt 是一个 python 库、用于在使用手电筒进行训练时应用模型优化。 该工具套件包括用于量化感知训练、稀疏度/修剪和模型手术的工具。
请参阅 torchmodelopt 页面上的自述文件和文档、了解使用指南。 一种常见的方法是通常训练模型、应用优化、然后继续以较低的学习率和次数(50-100)进行训练。 应用优化后继续训练非常重要。
训练后优化工具是edgeai-tidl-tools 的一部分、主要面向 ONNX 模型、因为这些模型最容易解析和修改。
tidl-onnx-model-optimizer 用于在上应用优化。 ONNX 模型、并且有一组不断增加的规则可应用于模型。 请参阅自述文件了解使用说明、此工具开放供您参考。
大多数模型需要对输入数据进行预处理、因此值通常位于间隔[0、1]或[-1、1]上。 该模型然后接受单精度浮点数作为网络的输入。 但是、在 CPU 内核上运行该预处理并将所有输入数据以每个值4字节的形式传输到加速器会导致公共 SoC 资源(CPU、DDR、缓存)浪费。
在加速器之外尽可能少地对输入进行预处理会更加高效。 这名义上意味着将模型更改为接受8位 RGB 或 YUV 编码、并使用>= 256bit-SIMD DSP 在加速器本身上运行这些元件操作。
YUV 编码非常有用、因为许多摄像头和 ISP (包括 AM6xA 和 TDA4x SoC 中视觉预处理加速器(VPAC)内的 VISS)都倾向于使用基于 YUV 的编码。 将其包含在模型中、则无需再进行额外的图像格式转换。
在 edgeai-tidl-tools/scripts 中、有 ONNX 和 TFLITE 特定的工具来实现此功能、因此在 Conv 层之前像这样添加层(显示了 YOLOX-nano 的 ONNX 模型):