常见问题
Q&A
哪些模型可以一键转换?
一键转换使用平台已配置的模型流程。 先检查模型类型、目标芯片、后端版本和精度选项。 上传 .pt 文件不代表平台支持任意 PyTorch 模型。 自定义模型仍可能需要导出 ONNX、校准数据或专用转换流程。
输入形状包含 ? 或 batchsize 时,如何处理?
这些符号表示动态维度。 当前 QNN context 流程使用转换时确定的输入形状。 按实际部署需求设置每个维度。 例如,批量为 1 时,可以将 [?, 3, 224, 224] 设置为 [1, 3, 224, 224]。 不要将所有未知维度直接设为 1。
需要多种输入尺寸时,分别转换并验证各个尺寸的模型。 运行时选择对应的模型。 模型内部依赖输入数据的动态操作仍可能无法转换。 补齐算子或保存输入输出元数据,不会自动解决动态形状限制。
缺少算子时,能否复用 UDO?
用户自定义算子(User Defined Operator,UDO)可以提供后端缺少的实现。 SNPE UDO 与 QNN Op Package 使用不同接口。 不要将两种包直接互换。
现有 SNPE 转换路径会按内置算子列表选择随工具提供的 UDO 配置。 这不等同于通用的算子资产匹配和兼容性验证。
已有实现只有在算子语义、形状、数据类型、芯片和 SDK 版本匹配时,才能复用。 转换工具和设备运行时都必须能加载所需组件。 当前流程没有统一的算子资产自动匹配与验证入口。 不能仅凭算子同名就自动装载现有库。
遇到缺少算子时,收集以下信息:
- 模型格式、ONNX opset 和出错节点。
- 算子名称、domain、属性、输入输出形状和数据类型。
- 目标芯片、后端版本、精度和转换日志。
- 可用于验证结果的最小模型和输入数据。
提交这些信息后,维护人员可以匹配已有资产,或补充并验证新实现。 不要删除算子来绕过错误,除非已经验证替代流程保持模型语义。
Transformers 模型都无法通过 AIMO 转换吗?
不是。 模型结构、转换流程和目标后端共同决定支持范围。 已有 Whisper 专用流程也使用 Transformer 结构。 这不代表任意 Transformers 模型都可以一键转换。
通用大语言模型还需要分词器、KV 缓存、提示词处理和逐词生成流程。 模型切分、量化策略和设备内存也需要专门适配。 补齐一个算子不能替代这些步骤。
AIMO 负责模型转换和优化。 AidLite 负责加载受支持的转换产物并执行张量推理。 AidGen 提供生成式模型运行接口。 AidVoice 提供语音识别、语音合成和音频处理流程。 这些模块可以协作,不能互相替代。
Q:模型优化中,长时间处于转化中,不知道是卡住还是僵死?
A:在 INT8 量化选项中,不同的量化方法、模型的大小均可能影响转化时长,若选择 ada_aimet、cle_aimet、bc_snpe这三种方法,模型量化优化耗时均较长(可能转化很多天),尤其是选择 ada_aimet、cle_aimet 方法后,需耐心等待,若想快速得到结果,可选择 cle_snpe、enable_htp、enable_hta 等量化方法。
报错日志说明
| 序号 | 说明 | |
|---|---|---|
| 1 | ERROR : [AIMET] Optimization is failed. Please consider disable ada or cle. | 使用AIMET转化的时候不支持该方法(cle_aimet或ada_aimet),建议尝试更换一种方法 |
| 2 | ERROR : ValueError: After pruning disconnected nodes, this model is empty. Encountered Error: After pruning disconnected nodes, this model is empty. | 模型问题,模型为空,没有相关节点,可查看一下模型,检查一下是否上传成功 |
| 3 | ERROR : [DLC-QUAN] [ERROR] Invalid model for HBA quantization algorithm. Ensure there were batchnorms present prior to initial conversion, or reconvert. | 该问题产生原因是HTP量化方法在某些模型的节点中量化时与其他方法不兼容,可以在选择量化方法时,可将HTP与其他方法分开使用,如单独使用HTP,或HTP+CLE,CLE+BC等等 |
| 4 | ERROR : Node XXXX: 'Graph has no buffer XXX, referred to as input for XXX' | 模型节点找不到 |
| 5 | ERROR : Model conversion failed due to non-existent or rigid pid | AIMO服务未启动 |
| 6 | ERROR : ValueError: Unsupported dynamic weights on tensor permute_0_0 | 模型存在动态权重或动态输入,导致转化不支持,需要进行模型截断 |
| 7 | ERROR : Cutoff model is failed, please check nodes name | 输入输出节点或者inputshape等输入错误,可通过查看模型结构,重新填写对应的内容 |
| 8 | Conversion FAILED: ERROR_TF_NODE_NOT_FOUND_IN_GRAPH: Node not found in graph. Node name | 输入输出节点或者inputshape等输入错误,可通过查看模型结构,重新填写对应的内容 |
| 9 | status == QNN_BACKEND_NO_ERROR was not true | 该芯片型号不支持模型中一些算子的转化,建议更换芯片型号或不选择芯片型号,使用通用方案 |
| 10 | AttributeError: 'UDOFactory' object has no attribute 'xxx' | 出现该问题是由于模型中存在转化或优化中不支持的一些算子,可通过查看模型结构,看不支持的算子所在的位置,若该算子出现在模型开始或者结尾部分,可通过截断的方式(即在转化页面通过修改输入节点和输出节点),从而避开不支持的算子进行转化,对截断处未转化的部分,可手动进行相应的转化调整以适应最终的应用。同时可向后台反馈,及时补充相应的算子。 |
| 11 | [ERROR] 909 HTP FP16 not supported for this SoC | 量化算法不支持该类数据的格式,可通过取消CLE量化方法来解决 |
| 12 | 转RKNN模型时,出现报错onnx.onnx_cpp2py_export.checker.ValidationError: Your model ir_version is higher than the checker's** | onnx模型的版本较高,建议转onnx模型时,opset设置为12 |
| 13 | 转换ONNX至DLC过程中,如果模型输出节点填入正确但是出现 failed, please check nodes name:xxx input_name:xxx output_name:xxx | onnx模型的版本较高,建议转onnx模型时,opset设置为12 |
| 14 | 模型优化中,出现错误“SNPE HTP Offline Prepare: Could not assign any layer to the HTP”或“HTP FP16 not supported for this SoC” | 该错误可以通过不勾选CLE或CLE+BC的方法,采用SNPE默认的最基本的量化方法与HTP进行优化处理,即只选择HTP。 |