内存布局
了解 NCHW 与 NHWC 数据格式及其对性能的影响。
概述
内存布局决定了多维张量数据在内存中的组织方式。Tiny-DL-Inference 原生使用 NCHW,但可以转换为 NHWC 以实现互操作性。
NCHW(原生布局)
NCHW 代表 批次-通道-高度-宽度。
优势
- WebGPU 计算着色器优化:内存访问模式更高效
- 与 cuDNN 对齐:与 NVIDIA GPU 库保持一致
- 更好的缓存局部性:通道优先的访问模式
示例
typescript
// 形状为 [1, 3, 28, 28] 的图像
// 内存布局:R1R2...G1G2...B1B2...
const tensor = new Tensor(context, [1, 3, 28, 28]);1
2
3
2
3
NHWC(替代布局)
NHWC 代表 批次-高度-宽度-通道。
何时使用
- 与期望 NHWC 的外部模型集成
- 与 TensorFlow Lite 模型互操作
- 特定硬件优化
转换
typescript
const nhwcTensor = nchwTensor.convertLayout('NHWC');1
性能对比
| 操作 | NCHW | NHWC |
|---|---|---|
| Conv2d | ✅ 原生支持 | ⚠️ 需要转换 |
| MaxPool | ✅ 原生支持 | ⚠️ 需要转换 |
| ReLU | ✅ 布局无关 | ✅ 布局无关 |
| Dense | ✅ 布局无关 | ✅ 布局无关 |
最佳实践
- 默认使用 NCHW:除非有特定需求
- 最小化转换:仅在必要时转换布局
- 尽早转换:在管道入口处转换,而非反复转换
- 记录布局:在代码中清晰标明张量布局