rknn 模型部分算子fallback到cpu运行
·
RKNN模型在RK3576上CPU算子运行的原因
特别是Reshape操作,如果涉及到非连续内存则只能在cpu运行!
在深度学习中,张量的数据通常存储在连续的内存块中,但其逻辑形状可能与物理内存布局不一致。
当张量不是连续的时,大多数深度学习框架(包括RKNN)在执行reshape前会先将其转换为连续形式,这就需要内存重排操作。
在RKNN环境中的具体表现
在RKNN模型转换和推理过程中:
- 连续内存的reshape:通常可以作为元数据操作(仅修改shape信息),在NPU上高效完成
- 非连续内存的reshape:需要实际的数据搬运和重排,在CPU上执行,因为NPU通常只支持简单的张量形状变换操作
这就是为什么在您的截图中看到reshape算子在CPU上有显著耗时的原因 -
它很可能是在transpose或其他破坏连续性的操作之后执行的,导致了实际的内存重排需求。
从截图中的算子耗时统计表可以看到,确实存在部分算子在CPU上运行(CPUTime > 0),而GPU/NPU时间为0,例如:
- ArgMax: CPUTime = 47056 μs(占总时间37.19%)
- Reshape: CPUTime = 13285 μs(10.50%)
- Cast: CPUTime = 6702 μs(5.30%)
这实际上是RKNN推理框架的正常行为,主要原因如下:
### 核心原因:并非所有算子都支持NPU加速
RKNN模型在部署前会经过算子融合与硬件适配优化,但:
1. NPU硬件仅支持有限的算子集(如Conv、ReLU、Pool、Concat等主流CV算子)
2. 某些算子因结构特殊、数据依赖复杂或未被NPU支持,会被"fallback"到CPU执行
#### 具体分析高耗时CPU算子:
- ArgMax: 最典型的例子。RK3576的NPU不原生支持ArgMax(尤其当axis非最后一维时),必须由CPU实现,因此成为性能瓶颈(37.19%)
- Reshape: 多数Reshape是元数据操作,但若涉及非连续内存重排,则会触发CPU执行
- Cast: 类型转换若发生在NPU不支持的精度路径上,需CPU做格式转换
- OutputOperator: 必然在CPU执行,因为它负责将最终结果从NPU内存拷贝到系统内存
### 为什么RK3576上仍有CPU参与?
1. NPU架构限制: RK3576的NPU主要针对卷积类密集计算优化,对控制流、索引操作、动态shape支持较弱
2. 模型结构问题: 若模型包含ArgMax(如语义分割的类别预测),就必然触发CPU fallback
3. RKNN编译策略: RKNN Toolkit会自动拆分图,将可加速的子图交给NPU,不可加速的保留在CPU图中
4. 量化/精度影响: 若某些算子输入格式NPU无法处理,则必须由CPU执行
### 优化建议
1. 替换ArgMax: 在模型设计阶段避免使用ArgMax,或将ArgMax移到后处理阶段
2. 合并reshape/cast: 减少模型中的多余操作节点
3. 使用RKNN优化选项: 转换模型时启用更高级别的优化
4. 升级SDK版本: 新版RKNN Toolkit可能对某些算子有更好的优化
### 总结
RKNN模型在RK3576上部分算子在CPU运行是正常现象,根本原因是这些算子(尤其是ArgMax)未被NPU硬件支持,被迫fallback到CPU执行。这不是错误,而
是硬件能力边界的体现。优化重点应放在模型结构调整以避免不支持的算子。
更多推荐


所有评论(0)