趋近智
通过算子合并和简化重构算子序列,优化张量数据在内存中的物理布局是一种重要的图级别优化技术。张量维度在线性内存中的排序方式直接影响数据局部性、缓存利用率、向量化效率,并最终影响计算核心在特定硬件上的性能表现。内存感知布局转换分析计算图和目标硬件,以选择合适的数据布局,仅在必要且有利时才插入显式转置操作。
计算机视觉中常用的4D张量,包括批次 (N)、通道 (C)、高度 (H) 和宽度 (W)。这些张量主要有两种内存布局:
tensor[n][c][h][w]元素的内存地址可计算为 offset = n*C*H*W + c*H*W + h*W + w。这种布局在PyTorch等框架中常见,并常被cuDNN等GPU库在特定操作中偏爱。tensor[n][c][h][w]的内存地址计算为 offset = n*H*W*C + h*W*C + w*C + c。这种布局是TensorFlow中的默认设置,对于CPU执行和某些硬件加速器可能有利。NCHW和NHWC之间(或更高维度的其他可能布局)的选择并非随意。它对性能有深远影响:
[h][w][c=0]、[h][w][c=1]、... [h][w][c=C-1]是连续的。NCHW提供更好的通道局部性。机器学习编译器将布局转换实现为图遍历。该过程通常包含:
NCHW_to_NHWC 或 NHWC_to_NCHW)。目标是尽量减少转置操作的数量,因为它们会带来计算开销和内存流量。成本模型用于权衡在首选布局下执行算子的收益与所需转置操作的成本。思考一个简单的序列:Conv1 -> ReLU -> Conv2。
编译器可能这样分析:
Conv1 偏好NCHW输入和输出。ReLU 可以在NCHW数据上高效运行,并传播该布局。Conv2 偏好NCHW输入。在这种情况下,如果图的输入已经是NCHW(或者可以在开始时以较低成本进行转置),编译器很可能会在此序列中全程保持NCHW布局,避免任何内部转置。
示例:保持 NCHW 布局的图转换。
现在,假设 Conv2(可能由于其特定维度或不同的内核实现)在该硬件上使用NHWC输入时性能更优。
编译器的成本模型会评估:
Conv1(NCHW) -> ReLU(NCHW) -> 转置(NCHW->NHWC) -> Conv2(NHWC) 的成本。转置(输入->NHWC) -> Conv1(NHWC) -> ReLU(NHWC) -> Conv2(NHWC) 的成本(假设 Conv1 可以在NHWC中运行,但可能较慢)。如果 Conv2 在NHWC中的性能收益超过了转置成本,编译器就会插入转置操作。
示例:插入转置操作以优化 Conv2 执行的图转换。
选择最合适的布局很复杂:
内存感知布局转换是一种强大的图优化技术。通过根据硬件特性和算子序列智能选择数据布局,编译器可以大幅提高缓存性能、内存带宽利用率和整体执行速度,经常与算子合并配合,以最大限度地减少开销并提高核函数效率。MLIR 等框架提供基础设施(例如,方言属性、接口)来表示布局信息并系统地实现这些转换。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造