imx95 中的 Neutron NPU 支持的 tflite 模型文件示例 在 imx95 中找不到 Neutron NPU 支持的 tflite 模型文件样本。你能为它提供仓库链接吗。 谢谢, Pooja Re: Sample tflite model files which are supported by Neutron NPU in imx95 您好, 当你运行 /opt/nxp/EIQ_Toolkit_v1.14.0/Neutron-tuning/Neutron-变流器 时,你是否遇到了找不到 neutron.sh 文件的问题,如果是,你是如何解决这个问题的? Re: Sample tflite model files which are supported by Neutron NPU in imx95 你好@yipingwang 感谢您的确认 Re: Sample tflite model files which are supported by Neutron NPU in imx95 是的,这是目前正确的方法。无需额外的量化或优化步骤。
在未来的版本中,Neutron NPU 将直接支持 ONNX 运行时。因此,在未来的版本中,你可以直接转换量化的 ONNX 模型并在 Neutron NPU 上运行,无需执行 ONNX 到 tflite 的步骤。 Re: Sample tflite model files which are supported by Neutron NPU in imx95 你好@yipingwang 我按照推荐的方法将 TFLite 模型转换为支持 Neutron 的 TFLite 格式。我测试了 PyTorch、ONNX、TensorFlow 1.x 和 TensorFlow 2.x 等各种框架的模型。对于所有这些,我首先将模型转换为 ONNX 格式,然后使用 onnx2tf 生成 INT8 量化的 TFLite 模型。之后,我运行了以下命令: /opt/nxp/EIQ_Toolkit_v1.14.0/中子调谐/中子变流器--输入 resnet50.tflite--use-python-prototype--target imx95--输出 resnet50_flag.tflite 这就是我创建量化 TFLite 模型的过程。我想确认一下:在将TFLite模型传递给中子变流器之前,是否需要额外的量化或优化步骤?根据目前的做法,这是否是确保高效利用 NPU 的最佳方法? 谢谢 Re: Sample tflite model files which are supported by Neutron NPU in imx95 "--use-python-prototype" 默认情况下应排除"后处理" 操作符,因为它不能在 NPU 上运行,但目前没有排除。在未来的版本中,"--use-python-prototype " 方法将与标准方法集成,因此这个问题有望在未来的版本中得到解决。
但"--use-python-prototype" 方法总体上确实能提供更好的性能,所以我认为你观察到的情况是正常的。
中子变流器仍在积极开发中,因此每次版本都会变得更好。 Re: Sample tflite model files which are supported by Neutron NPU in imx95 你好 @yipingwang 对此,我有几个问题: 你能分享一下用于转换的命令吗。我曾尝试使用以下方法将 ssd_mobilenet_v2_coco_quant_postprocess.tflite 从你共享的源仓库转换为支持中子的 tflite。这些是我的观察: 1.尝试使用带有建议的 use-python-prototype 标志的中子变流器从恩智浦源转换模型: /opt/nxp/eIQ_Toolkit_v1.14.0/neutron-tuning/neutron-converter --input ssd_mobilenet_v2_coco_quant_postprocess.tflite --use-python-prototype --target imx95 --output ssd_mv2_flag.tflite 警告:子系统的德尔塔暂时停用。 使用以下选项转换模型: 输入 = ssd_mobilenet_v2_coco_quant_postprocess.tflite 输出 = ssd_mv2_nxo.tflite 目标 = imx95 信息:ShapeInference:默认情况下无法对带有自定义运算符的图形执行形状推理。您可以使用"ignoreCustomOperators" 选项,强制执行形状推断并忽略自定义运算符。 优化时间 = 0 (秒) 提取时间 = 0(秒) 生成时间 = 0 (秒) 2。 然后尝试了 /opt/nxp/EIQ_Toolkit_v1.14.0/中子调谐/中子变流器--input ssd_mobilenet_v2_coco_quant_postprocess.tflite--use-python-prototype--target imx95--输出 ssd_mv2_flag_custom.tflite--exclude-operator-types= " 自定义 " 警告:子系统的增量已停用现在。 使用以下选项转换模型: 输入 = ssd_mobilenet_v2_coco_quant_postprocess.tflite 输出 = ssd_mv2_nxo.tflite 目标 = imx95 信息:ShapeInference:默认情况下无法对带有自定义运算符的图形执行形状推理。您可以使用"ignoreCustomOperators" 选项强制执行形状推断,并忽略自定义运算符。 优化时间 = 0 (秒) 提取时间 = 0(秒) 生成时间 = 0 (秒) 均失败 3. 试过 /opt/nxp/EIQ_Toolkit_v1.14.0/中子调谐/中子变流器--input ssd_mobilenet_v2_coco_quant_postprocess.tflite--输出 ssd_mv2_nxp_customtarget.tflite--target--target imx95--exclude-operator-types= " 自定义 " 警告:子系统的增量暂时停用。 使用以下选项转换模型: 输入 = ssd_mobilenet_v2_coco_quant_postprocess.tflite 输出 = ssd_mv2_nxp_customtarget.tflite 目标 = imx95 信息:ShapeInference:默认情况下无法对带有自定义运算符的图形执行形状推理。您可以使用"ignoreCustomOperators" 选项,强制执行形状推断并忽略自定义运算符。 转换统计: 导入后的运算符数量 = 111 优化后的运算符数量 = 136 转换后的运算符数量 = 103 未转换的运算符数量 = 33 提取后的运算符数 = 34 中子图数量 = 1 未转换的运算符数 = 33 运算符转换率 = 103 / 136 = 0.757353 Operators converted = 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,95,96,97,98,101,104,105,106,107,110,111,112,113,114,115,122,125,128, 优化时间 = 1.69348(秒) 提取时间 = 0.0585611(秒) 生成时间 = 9.13902(秒) 转换成功,这是使用 NPU 运行的日志: PoojaSk_0-1748433238881.png 那么,这种指定排除操作而不使用 python-prototype 的方法是否可以接受呢?但所提供的模型比这个性能更好,因此请分享转换的步骤。 谢谢、 普伽 Re: Sample tflite model files which are supported by Neutron NPU in imx95 你好@yipingwang 对此,我有几个问题: 请分享转换时使用的命令。我曾尝试使用以下方法将 ssd_mobilenet_v2_coco_quant_postprocess.tflite 从你共享的源仓库转换为支持中子的 tflite。这些是我的观察: 1.尝试使用带有建议的 use-python-prototype 标志的中子变流器从恩智浦源转换模型: /opt/nxp/EIQ_Toolkit_v1.14.0/中子调谐/中子变流器--输入 ssd_mobilenet_v2_v2_v2_v2_postprocess.tflite--use-python-prototype--target imx95--输出 ssd_mv2_flag.tflite 警告:子系统的德尔塔暂时停用。 使用以下选项转换模型: Input = ssd_mobilenet_v2_coco_quant_postprocess.tflite 输出 = ssd_mv2_nxo.tflite 目标 = imx95 INFO:形状推理:默认情况下无法对带有自定义运算符的图形执行形状推理。您可以使用"ignoreCustomOperators" 选项,强制进行形状推理并忽略自定义运算符。 优化时间 = 0 (秒) 提取时间 = 0 (秒) 生成时间 = 0 (秒) 2。然后尝试了 /opt/nxp/EIQ_Toolkit_v1.14.0/中子调谐/中子变流器--input ssd_mobilenet_v2_coco_quant_postprocess.tflite--use-python-prototype--target imx95--输出 ssd_mv2_flag_custom.tflite--exclude-operator-types= " 自定义 " 警告:子系统的增量已停用现在。 使用以下选项转换模型: Input = ssd_mobilenet_v2_coco_quant_postprocess.tflite 输出 = ssd_mv2_nxo.tflite 目标 = imx95 INFO:形状推理:默认情况下无法对带有自定义运算符的图形执行形状推理。您可以使用"ignoreCustomOperators" 选项,强制进行形状推理并忽略自定义运算符。 优化时间 = 0 (秒) 提取时间 = 0 (秒) 生成时间 = 0 (秒) 两项均失败 3.试过 /opt/nxp/EIQ_Toolkit_v1.14.0/中子调谐/中子转换器--input ssd_mobilenet_v2_coco_quant_postprocess.tflite--输出 ssd_mv2_nxp_customtarget.tflite--target--target imx95--exclude-operator-types= " 自定义 " 警告:子系统的增量暂时停用。 使用以下选项转换模型: Input = ssd_mobilenet_v2_coco_quant_postprocess.tflite 输出 = ssd_mv2_nxp_customtarget.tflite 目标 = imx95 INFO:形状推理:默认情况下无法对带有自定义运算符的图形执行形状推理。您可以使用"ignoreCustomOperators" 选项,强制进行形状推理并忽略自定义运算符。 转换统计: 导入后的运算符数量 = 111 优化后的运算符数量 = 136 已转换的运算符数量 = 103 未转换的运算符数量 = 33 提取后的运算符数量 = 34 中子图数量 = 1 未转换的运算符数量 = 33 运算符转换率 = 103 / 136 = 0.757353 Operators converted = 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,95,96,97,98,101,104,105,106,107,110,111,112,113,114,115,122,125,128, Time for optimization = 1.69348 (秒) 提取时间 = 0.0585611 (秒) 生成时间 = 9.13902 (秒) 转换成功,这是使用 NPU 运行的日志: PoojaSk_0-1748433238881.png 那么,这种指定排除操作而不使用 python-prototype 的方法是否可以接受呢?但所提供的模型比这个性能更好,因此请分享转换的步骤。 谢谢, Pooja Re: Sample tflite model files which are supported by Neutron NPU in imx95 你好@yipingwang 我有几个相关的问题: 请分享转换时使用的命令。我曾尝试使用以下方法将 ssd_mobilenet_v2_coco_quant_postprocess.tflite 从你共享的源仓库转换为支持中子的 tflite。这些是我的观察: 1.尝试使用带有建议的 use-python-prototype 标志的中子变流器从恩智浦源转换模型: /opt/nxp/EIQ_Toolkit_v1.14.0/中子调谐/中子变流器--输入 ssd_mobilenet_v2_v2_v2_v2_postprocess.tflite--use-python-prototype--target imx95--输出 ssd_mv2_flag.tflite 警告:子系统的德尔塔暂时停用。 使用以下选项转换模型: Input = ssd_mobilenet_v2_coco_quant_postprocess.tflite 输出 = ssd_mv2_nxo.tflite 目标 = imx95 INFO:形状推理:默认情况下无法对带有自定义运算符的图形执行形状推理。您可以使用"ignoreCustomOperators" 选项,强制进行形状推理并忽略自定义运算符。 优化时间 = 0 (秒) 提取时间 = 0 (秒) 生成时间 = 0 (秒) 2。然后尝试了 /opt/nxp/EIQ_Toolkit_v1.14.0/中子调谐/中子变流器--input ssd_mobilenet_v2_coco_quant_postprocess.tflite--use-python-prototype--target imx95--输出 ssd_mv2_flag_custom.tflite--exclude-operator-types= " 自定义 " 警告:子系统的增量已停用现在。 使用以下选项转换模型: Input = ssd_mobilenet_v2_coco_quant_postprocess.tflite 输出 = ssd_mv2_nxo.tflite 目标 = imx95 INFO:形状推理:默认情况下无法对带有自定义运算符的图形执行形状推理。您可以使用"ignoreCustomOperators" 选项,强制进行形状推理并忽略自定义运算符。 优化时间 = 0 (秒) 提取时间 = 0 (秒) 生成时间 = 0 (秒) 两项均失败 3.试过 /opt/nxp/EIQ_Toolkit_v1.14.0/中子调谐/中子转换器--input ssd_mobilenet_v2_coco_quant_postprocess.tflite--输出 ssd_mv2_nxp_customtarget.tflite--target--target imx95--exclude-operator-types= " 自定义 " 警告:子系统的增量暂时停用。 使用以下选项转换模型: Input = ssd_mobilenet_v2_coco_quant_postprocess.tflite 输出 = ssd_mv2_nxp_customtarget.tflite 目标 = imx95 INFO:形状推理:默认情况下无法对带有自定义运算符的图形执行形状推理。您可以使用"ignoreCustomOperators" 选项,强制进行形状推理并忽略自定义运算符。 转换统计: 导入后的运算符数量 = 111 优化后的运算符数量 = 136 已转换的运算符数量 = 103 未转换的运算符数量 = 33 提取后的运算符数量 = 34 中子图数量 = 1 未转换的运算符数量 = 33 运算符转换率 = 103 / 136 = 0.757353 Operators converted = 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,95,96,97,98,101,104,105,106,107,110,111,112,113,114,115,122,125,128, Time for optimization = 1.69348 (秒) 提取时间 = 0.0585611 (秒) 生成时间 = 9.13902 (秒) 转换成功,这是使用 NPU 运行的日志: PoojaSk_0-1748433238881.png 那么,这种指定排除操作而不使用 python-prototype 的方法是否可以接受呢?此外,当只使用 python-protype 而不排除任何操作时,我也遇到了有限的 TCM 问题。因此,我用这个模型做了一些实验,观察到了这些结果: 1。/opt/nxp/EIQ_Toolkit_v1.14.0/中子调谐/中子变流器--input unet_b2_full_integer_quant.tflite--output unet_b2_noflagandcustom.tflite--target imx95--exclude-operator-types= " CUSTOM " >>> 中子加仑数为 0 PoojaSk_1-1748433752257.png 2。如果不指定目标 imx95,就会有更多的中子图 /opt/nxp/EIQ_Toolkit_v1.14.0//中子调谐/中子变流器--input unet_b2_full_integer_quant.tflite-- output unet_b2_noflagandcustom.tflite--exclude-operator-types= " CUSTOM " PoojaSk_2-1748433839511.png 因此,在不使用原型的情况下进行转换,指定不包括自定义操作,就可以克服所面临的 TCM 限制问题,但我想详细了解这种方法,因为您建议使用 python 原型。在文档中也找不到关于每个参数的更多细节,如"target","excluded operations" 。这对模型转换有何影响。 谢谢, Pooja Re: Sample tflite model files which are supported by Neutron NPU in imx95 对模型的大小或类型没有固定的限制。中子变流器具有内部优化算法,并将尽最大努力使模型适合中子。
您提到的 Mobilenet SSD v2 模型内部是否有后处理节点?如果是这样,那么这也是意料之中的,因为目前还不支持后处理节点。我附上了一个 Mobilenet SSD v2 模型,该模型没有后处理,并且已经过转换。你可以试一试。原始模型来自https://github.com/nxp-imx-support/nxp-demo-experience-assets/tree/lf-6.12.3_1.0.0/models Re: Sample tflite model files which are supported by Neutron NPU in imx95 嗨 @yipingwang 那么,由于中子变流器的中药有限,基于模型大小或模型类型(检测、分类、分割等)或批次大小是否存在任何限制。请分享这些详细信息或文件链接。在第 5.8.3.3 节的支持机型列表中还发现了 Mobilenet v2 SSD 等机型UG 中子变流器的用法但在转换该模型的第一批时,我遇到了同样的问题。因此,如果您能提供更多相关细节,将会有所帮助。 PoojaSk_0-1747910093025.png 谢谢, Pooja Re: Sample tflite model files which are supported by Neutron NPU in imx95 是的,在当前版本的neutron变流器中,由于中子中的中药是有限的,因此它对数据大小和层的大小有限制。如果多批次模型无法成功转换,请暂时使用单批次模型。 Re: Sample tflite model files which are supported by Neutron NPU in imx95 你好@yipingwang 谢谢你的解决方案,我可以用这种方法将 unet int8 tflite 转换为中子支持的 tflite。在执行过程中,只有少数操作在 NPU 上运行,其余操作则返回 CPU。我希望这在意料之中。 PoojaSk_0-1747809565209.png 当我尝试转换多批次(即批次=2)时,出现了以下错误,这是内存耗尽造成的: PoojaSk_1-1747810098092.png 那么在转换多批次或更大的模型时是否有任何限制。[使用中子变流器转换了批次 1 & 2 的 int8 tflite。其中第 2 批出现了上述错误] 谢谢, Pooja Re: Sample tflite model files which are supported by Neutron NPU in imx95 你应该使用文件夹 " /opt/nxp/eIQ_Toolkit_v1.14.0/neutron-tuning " 下的neutron-变流器。请查看 eIQ 用户指南(在 /opt/nxp/eIQ_Toolkit_v1.14.0/docs/ 文件夹下)第 5.8.3 章 "Neutron 变流器仅适用于 i.MX95 设备 " 了解更多详情。 Re: Sample tflite model files which are supported by Neutron NPU in imx95 你好@yipingwang 我为 ubuntu 20.04 安装了 eIQ_Toolkit_v1.15.1,并尝试使用该命令转换模型,但没有使用--use-python-prototype 标志。因此,我为 ubuntu 20.04 安装了 eIQ_Toolkit_v1.14.1,它应该有这个标志(根据文档),但却没有。那么,ubuntu 主机中首选的工具包版本是哪个?板闪存为 L6.12.3-1.0.0_ M X95。 PoojaSk_0-1747310703817.png 谢谢, Pooja Re: Sample tflite model files which are supported by Neutron NPU in imx95 关于你回答的前半部分,是的,模型已经在 NPU 上运行,但已经进行了转换。当前的中子驱动程序具有内联转换功能,这意味着如果模型没有转换,它会在运行时首先尝试转换。但这种内联转换功能可能不适用于许多机型,因此将来会取消这一功能。
因此,对于更常用的方法,我们建议先使用eIQ中的中子变流器来转换模型。请暂时不要使用图形用户界面,因为对于 i.MX95,建议暂时使用"--use-python-prototype" 选项转换模型。
neutron-converter --input --target imx95 --use-python-prototype --output
更多细节请查看 eIQ 用户指南第 " 5.8.3 章仅适用于 i.MX95 设备的变流器 "。 Re: Sample tflite model files which are supported by Neutron NPU in imx95 hi@yipingwang 感谢您的回复,我已经试着在 NPU 中直接运行 mobilenet_v1_1.0_224_quant.tflite,没有进行任何进一步的转换,这些是 profiler 日志,我希望这能说明一些操作正在 NPU 上运行,如果有错请指正: PoojaSk_1-1747291675158.png 正如你所建议的那样,我随后使用中子变流器将这个 tflite 转换为支持中子的铁氟石。在变流器 GUI 的设置中,我选择了 Linux 6.6.23_2.0.0。imx95 设备使用 L6.12.3-1.0.0_MX95 闪存。但是使用NPU执行时转换后的模型会出现分段错误,我尝试过的其他模型也出现了同样的问题。那么这是与变流器版本相关的问题还是必须解决的问题。 PoojaSk_2-1747292212358.png 谢谢, Pooja Re: Sample tflite model files which are supported by Neutron NPU in imx95 tflite 模型需要先量化为整数,然后需要通过 eIQ 工具包中的中子变流器进行转换。然后,您可以将其部署在 i.MX95 板上并测试性能,如以下命令所示:
/usr/bin/tensorflow-lite-2.18.0/examples/benchmark_model --graph=/root/xxx_converted.tflite --external_delegate_path=/usr/lib/libneutron_delegate.so
您可以使用 rootfs 中的样本模型进行尝试。它已经量化了,所以你只需要用中子变流器对其进行转换即可。请安装 eIQ Linux 版本,并按照 UG 中的说明进行转换。
-rw-r--r-- 1 root root 4276352 Apr 5 2011 /usr/bin/tensorflow-lite-2.18.0/examples/mobilenet_v1_1.0_224_quant.tflite
View full article