Hello,
1. Problem
I'm using snpe-onnx-to-dlc from snpe-1.61.0.3358 to convert my onnx model to dlc using some UDOs.
I find out that if I specify the data-type for of input tensors for each core for my UDOs, the data type verification is not correct.
This is the Traceback that I receive
Traceback (most recent call last):File "/workspace/qualcomm-base/snpe-1.61.0.3358/lib/python/qti/aisw/converters/onnx/onnx_to_ir.py", line 223, in convertself.graph)File "/workspace/qualcomm-base/snpe-1.61.0.3358/lib/python/qti/aisw/converters/common/converter_ir/translation.py", line 51, in apply_method_to_opreturn translation.apply_method(method_name, *args, **kwargs)File "/workspace/qualcomm-base/snpe-1.61.0.3358/lib/python/qti/aisw/converters/common/converter_ir/translation.py", line 17, in apply_methodreturn self.indexed_methods[method_name](*args, **kwargs)File "/workspace/qualcomm-base/snpe-1.61.0.3358/lib/python/qti/aisw/converters/common/converter_ir/translation.py", line 120, in add_opop = self.extract_parameters(src_op, graph)File "/workspace/qualcomm-base/snpe-1.61.0.3358/lib/python/qti/aisw/converters/onnx/custom_op_translations.py", line 44, in extract_parametersparam.data_type = get_internal_dtype(param.data, param)File "/workspace/qualcomm-base/snpe-1.61.0.3358/lib/python/qti/aisw/converters/backend/custom_ops/helpers/udo_module_helpers.py", line 185, in get_internal_dtype.format(src_type, op_attr.name, op_attr.allowed_data_types))TypeError: The provided datatype: uint16 is not a valid datatype defined for: 672. Expected one of ['SNPE_UDO_CORETYPE_CPU', 'SNPE_UDO_CORETYPE_DSP']
2. Finding the cause
Below is parameters of the operation and the UDO in my UDO configuration.
Parameters: (i can get these values by printing variable param in method extract_parameters in snpe-1.61.0.3358/lib/python/qti/aisw/converters/onnx/custom_op_translations.py
{'name': '672', 'allowed_data_types': ['SNPE_UDO_CORETYPE_CPU', 'SNPE_UDO_CORETYPE_DSP'], 'shape': '', 'default_value': None, 'layout': 'SNPE_UDO_LAYOUT_LAST', 'dimensions': [], 'repeated': False, 'static': True, 'rank': 1, 'data_type': 'SNPE_UDO_DATATYPE_UINT_16', 'data': None, 'param_type': 'SNPE_UDO_PARAMTYPE_TENSOR', 'per_core_data_types': None}
UDO:
"type": "expand","inputs":[{"name":"Input","per_core_data_types":{"CPU":"FLOAT_32", "DSP":"UINT_8"},"static": false, "tensor_layout": "NCHW"},{"name":"shape","per_core_data_types":{"CPU":"UINT_16", "DSP":"UINT_8"},"static": true}],"outputs":[{"name":"Output","per_core_data_types":{"CPU":"FLOAT_32", "DSP":"UINT_8"}}],"core_types": ["CPU", "DSP"]
If we look at the parameters at allowed_data_types': ['SNPE_UDO_CORETYPE_CPU', 'SNPE_UDO_CORETYPE_DSP'], the value of allowed_data_types does not seem correct.
I traced back to the staticmethod create_per_core_tensor_infos in snpe-1.61.0.3358/lib/python/qti/aisw/converters/backend/custom_ops/core.py I found that the way snpe gets the allowed dtype of tensor is not correct:
- At line 77 of that file, the value of per_core_dict is {'SNPE_UDO_CORETYPE_CPU': 'SNPE_UDO_DATATYPE_FLOAT_32', 'SNPE_UDO_CORETYPE_DSP': 'SNPE_UDO_DATATYPE_UINT_8'}. And just after that, snpe gets tensor_info.allowed_data_types by getting it keys instead of its values. That's why we get ['SNPE_UDO_CORETYPE_CPU', 'SNPE_UDO_CORETYPE_DSP'] as the dtype. That causes the whole problem of dtype verification after.
3. Fix Suggestion
Change line 77 of snpe-1.61.0.3358/lib/python/qti/aisw/converters/backend/custom_ops/core.py from:
tensor_info.allowed_data_types = list(per_core_dict.keys())
to
tensor_info.allowed_data_types = [per_core_dict[k] for k in per_core_dict]