[QNN:Feature] Add intermediate tensor dumps for QNN backend debug#4663
[QNN:Feature] Add intermediate tensor dumps for QNN backend debug#4663huangzhengxiang wants to merge 4 commits into
Conversation
|
感谢这个特性——中间张量 dump 对精度调试确实很有用。合并前有几个潜在问题,按严重程度大致排列如下: 1.(较严重)无条件 alloc 所有 native 张量会命中不支持的数据类型
当某个中间张量是这些类型时(量化图里很常见,例如 int16 激活、compare 算子产生的 BOOL_8 掩码):
建议对 2.(中等)在线与离线两条路径 dump 的张量集合不一致
同一模型两种模式产出的文件集合不同,会给逐层比对工具带来困扰,建议统一。 3.(轻微)MNN2QNNModel 的 flag 解析过于脆弱
4.(轻微)debug 张量可能跨 onResize 累积
其它小问题
确认没问题、无需改动的点:无条件的 |
|
@Qxinyu 感谢 review,问题已按建议修复并完成设备验证:
MNN2QNNModel ... output --dump_intermediate_outputs 2 1x8 2x8可成功生成两个 shape context。
其它:
验证结果:
相关文档也已更新:QNN README 说明完整 output-set dump 语义和 flag 任意位置使用方式。 |
补充:在 8Gen5(v81) 真机实测发现一个 dump 专属的回归(QNN error 7004)用当前分支(含 hardening commit)交叉编译 对照实验:关闭 dump 时没有 7004,确认是 dump 路径引入的。由于 根因:hardening commit 把 修复:把两处 --- a/source/backend/qnn/backend/QNNBackend.cpp
+++ b/source/backend/qnn/backend/QNNBackend.cpp
@@ onAcquire
Qnn_Tensor_t * qnnTensor = qnnTensorWrapper->getNativeTensor();
+ // QNN rejects APP_READ/APP_WRITE tensors that already carry a client buffer at graph-tensor
+ // creation (error 7004). Create the graph tensor first (buffer still null), then attach the
+ // host dump buffer via registerDebugTensor.
+ CALL_QNN(mRuntime->mQnnInterface.tensorCreateGraphTensor(mQnnGraphHandle, qnnTensor));
if (isDebugTensor && !registerDebugTensor(qnnTensorWrapper, tensorDimType)) {
- qnnTensor->v1.type = QNN_TENSOR_TYPE_NATIVE;
isDebugTensor = false;
}
- CALL_QNN(mRuntime->mQnnInterface.tensorCreateGraphTensor(mQnnGraphHandle, qnnTensor));
mQNNTensorWrappers.push_back(qnnTensorWrapper);
mTensorMap.insert({TensorUtils::getDescribe(tensor), mTensorCounter});--- a/source/backend/qnn/execution/QNNCommonExecution.cpp
+++ b/source/backend/qnn/execution/QNNCommonExecution.cpp
@@ createStageTensor
std::shared_ptr<QNNTensorWrapper> tensorWrapper =
QNNTensorWrapper::create(tensorName, tensorType, dataType, dimensions, quantize);
- if (dumpTensor && !mBackend->registerDebugTensor(tensorWrapper)) {
- tensorWrapper->getNativeTensor()->v1.type = QNN_TENSOR_TYPE_NATIVE;
- dumpTensor = false;
- }
+ // Create the graph tensor first (client buffer must be null at creation, QNN error 7004),
+ // then attach the host dump buffer.
mBackend->addTensor(tensorWrapper->getNativeTensor());
+ if (dumpTensor) {
+ mBackend->registerDebugTensor(tensorWrapper);
+ }
mTempTensorWrappers.push_back(tensorWrapper);
return tensorWrapper;验证(同一设备、同一模型、同一命令,仅替换
|
Description
Add intermediate tensor dumps for QNN backend debug
Module
QNN
Type
Checklist
[Module:Type] Descriptionformat