7,900
社区成员
发帖
与我相关
我的任务
分享在 QNN C++ 应用中,如何为输入张量设置静态形状和动态形状,动态形状又会带来哪些性能代价?
QNN 中静态形状在模型编译阶段就确定输入尺寸,运行时直接复用已编译好的上下文二进制;动态形状则需要在运行时根据实际输入重新构造或部分重建计算图。设置静态形状时,在模型编译阶段通过 --input_dims 指定固定尺寸:
qnn-onnx-converter --input_dims input:1,3,640,640 ...
设置动态形状时,使用 --input_dims_range 给出尺寸范围,并确保模型编译时开启动态形状支持:
qnn-onnx-converter --input_dims_range input:1,3,[1:4],[1:4] ...
动态形状的代价主要包括:运行时图重构开销、内存分配与释放频率增加、部分 HTP 优化失效、小 batch 或小尺寸输入时单位算子成本上升。因此在边缘部署中,若业务尺寸稳定,优先使用静态形状;只有输入尺寸必须变化时才启用动态形状。参考文档:高通 QNN 动态形状部署指南。