跳转至

内存空间优化

本文引用的文件 - xla/service/memory_space_assignment/algorithm.cc - xla/service/memory_space_assignment/memory_space_assignment.cc - xla/backends/gpu/runtime/collective_memory.cc - xla/mlir_hlo/deallocation/transforms/buffer_deallocation.cc - xla/hlo/transforms/memory_space_propagation.cc - xla/service/memory_space_assignment/cost_analysis.h - xla/service/memory_space_assignment/options.h - xla/service/memory_space_assignment/allocation.h - xla/service/memory_space_assignment/utils.h - xla/service/memory_space_assignment/buffer_interval_comparator.h - xla/service/memory_space_assignment/memory_bound_loop_optimizer.h - xla/service/memory_space_assignment/repacking.h - xla/service/memory_space_assignment/tuning_utils.h - xla/service/memory_space_assignment/slice.h - xla/service/memory_space_assignment/allocation_value.h - xla/service/heap_simulator/heap_simulator.h - xla/service/heap_simulator/allocation_block.h - xla/service/buffer_value.h - xla/service/hlo_buffer.h - xla/service/hlo_value.h - xla/hlo/analysis/hlo_alias_analysis.h - xla/hlo/analysis/alias_info.h - xla/hlo/ir/hlo_instruction.h - xla/hlo/ir/hlo_opcode.h - xla/hlo/ir/hlo_schedule.h - xla/hlo/utils/hlo_live_range.h - xla/service/gpu/buffer_allocations.h - xla/stream_executor/gpu/multicast_memory.h - xla/core/collectives/symmetric_memory.h - xla/backends/gpu/collectives/gpu_communicator.h - xla/backends/gpu/runtime/collective_cliques.h - xla/backends/gpu/runtime/collective_params.h - xla/backends/gpu/runtime/collective_memory_requests.h - xla/backends/gpu/collectives/gpu_clique_key.h - xla/backends/gpu/runtimes/…/all_to_all_thunk.cc - xla/backends/gpu/runtimes/…/buffers_checksum_thunk_test.cc - xla/backends/gpu/runtimes/…/buffers_float_check_thunk_test.cc - xla/backends/gpu/runtimes/…/collective_kernel_thunk_test.cc - xla/backends/gpu/host_offloading/gpu_host_offloading_allocator.cc - xla/backends/gpu/collectives/gpu_collectives_test.cc - xla/backends/autotuner/file_based_autotuner_cache.cc - xla/backends/profiler/gpu/cupti_collector.cc - xla/backends/profiler/gpu/rocm_collector.cc - xla/hlo/transforms/simplifiers/hlo_rematerialization.cc - xla/service/gpu/autotuning/autotune_cache_key.cc - xla/service/gpu/gpu_compiler.cc - xla/service/cpu/dot_op_emitter.cc - xla/service/gpu/alias_info_test.cc - xla/service/gpu/gpu_memory_space_assignment.cc - xla/service/memory_space_assignment/algorithm.cc - xla/service/memory_space_assignment/memory_space_assignment.cc - xla/backends/gpu/runtime/collective_memory.cc - xla/mlir_hlo/deallocation/transforms/buffer_deallocation.cc

目录

  1. 引言
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

引言

本文件围绕XLA在GPU与CPU后端上的内存空间分配优化进行系统化梳理,重点覆盖以下方面: - 内存空间分配算法:基于生命周期与别名分析的堆模拟器、最佳适配与空间布局策略、跨程序预取与异步复制资源管理。 - 缓冲区绑定策略:全局内存、共享内存、寄存器等不同内存域的分配原则与绑定规则;跨设备/进程的对称/多播/对等内存映射。 - 内存层次结构优化:通过内存空间传播、重计算(重利用)与打包(repacking)降低带宽压力与碎片化。 - 访问模式与数据局部性:指令成本分析、内存带宽限制识别、循环内存瓶颈优化。 - 工具与检测:内存使用分析、内存泄漏检测与定位方法。

项目结构

XLA的内存空间优化涉及多个层次: - 高层调度与内存空间分配:服务层的内存空间分配算法与调度集成。 - 中间表示与别名/生命周期分析:HLO与MLIR层的别名信息、缓冲区值与缓冲区图。 - 运行时与后端:GPU运行时的集合通信内存(对称/多播/对等)、主机内存池与传输管理。 - 自动调优与性能分析:设备带宽、成本分析与缓存键生成。

graph TB
subgraph "服务层"
A["内存空间分配算法<br/>algorithm.cc"]
B["内存空间分配主流程<br/>memory_space_assignment.cc"]
C["成本分析接口<br/>cost_analysis.h"]
D["选项与配置<br/>options.h"]
end
subgraph "中间表示与分析"
E["别名分析<br/>hlo_alias_analysis.h"]
F["别名信息<br/>alias_info.h"]
G["HLO值/缓冲区<br/>hlo_value.h / hlo_buffer.h"]
H["生命周期与调度<br/>hlo_live_range.h / hlo_schedule.h"]
end
subgraph "运行时与后端"
I["集合通信内存<br/>collective_memory.cc"]
J["缓冲区分配抽象<br/>buffer_allocations.h"]
K["多播内存接口<br/>multicast_memory.h"]
L["对称内存接口<br/>symmetric_memory.h"]
end
A --> B
B --> C
B --> D
A --> E
A --> F
A --> G
A --> H
I --> J
I --> K
I --> L

图表来源 - xla/service/memory_space_assignment/algorithm.cc - xla/service/memory_space_assignment/memory_space_assignment.cc - xla/hlo/analysis/hlo_alias_analysis.h - xla/hlo/analysis/alias_info.h - xla/hlo/ir/hlo_value.h - xla/hlo/ir/hlo_buffer.h - xla/hlo/utils/hlo_live_range.h - xla/backends/gpu/runtime/collective_memory.cc - xla/service/gpu/buffer_allocations.h - xla/stream_executor/gpu/multicast_memory.h - xla/core/collectives/symmetric_memory.h

章节来源 - xla/service/memory_space_assignment/algorithm.cc - xla/service/memory_space_assignment/memory_space_assignment.cc - xla/backends/gpu/runtime/collective_memory.cc

核心组件

  • 内存空间分配算法(MSA)
  • 基于堆模拟器的空间布局与碎片化控制,支持按空间优先级与大小排序的最佳适配策略。
  • 支持跨程序预取(cross-program prefetch)与异步复制资源的初始资源估计。
  • 对While/条件等控制流进行特殊处理,避免在替代内存中分配无法驻留的缓冲区。
  • 内存空间分配主流程
  • 将HLO值拆分为AllocationValue,建立使用关系与别名,插入CopyStart/CopyDone以实现异步迁移。
  • 处理从替代内存到默认内存的即时驱逐(eviction),以及替代内存中的单次使用即时预取。
  • GPU集合通信内存
  • 提供对称内存(SymmetricMemory)、多播内存(MulticastMemory)与对等内存(PeerMemory)的统一寻址与映射。
  • 通过本地Rendezvous协调所有参与设备,确保一致顺序与无死锁的内存分配与映射。
  • MLIR缓冲区释放
  • 基于BufferViewFlowAnalysis识别潜在别名,计算安全的dealloc位置,并在必要时引入clone以保证正确性与完整性。

章节来源 - xla/service/memory_space_assignment/algorithm.cc - xla/service/memory_space_assignment/memory_space_assignment.cc - xla/backends/gpu/runtime/collective_memory.cc - xla/mlir_hlo/deallocation/transforms/buffer_deallocation.cc

架构总览

XLA内存空间优化的整体流程如下: - 输入:HLO模块、别名分析、生命周期与调度、设备描述(含带宽信息)。 - 处理:内存空间分配算法根据成本分析与指令时间线估计异步复制资源,决定缓冲区在默认或替代内存中的区间与拷贝点。 - 输出:包含分配区间、拷贝开始/结束、别名与共置信息的最终分配序列;同时在GPU后端生成集合通信内存映射。

sequenceDiagram
participant HLO as "HLO模块"
participant Alias as "别名分析"
participant Live as "生命周期/调度"
participant MSA as "内存空间分配算法"
participant Cost as "成本分析"
participant GPU as "GPU集合通信内存"
HLO->>Alias : 构建别名信息
HLO->>Live : 计算指令时间线与活区间
HLO->>Cost : 指令耗时/带宽调整因子
Alias-->>MSA : 别名/共置信息
Live-->>MSA : 调度与时间戳
Cost-->>MSA : 初始资源估计
MSA-->>GPU : 请求对称/多播/对等内存映射
GPU-->>MSA : 返回映射地址与偏移
MSA-->>HLO : 生成分配序列与拷贝点

图表来源 - xla/service/memory_space_assignment/algorithm.cc - xla/backends/gpu/runtime/collective_memory.cc

章节来源 - xla/service/memory_space_assignment/algorithm.cc - xla/backends/gpu/runtime/collective_memory.cc

详细组件分析

组件A:内存空间分配算法(MSA)

  • 关键职责
  • 建立缓冲区区间(MsaBufferInterval),考虑别名与共置,按空间优先级与大小排序。
  • 创建AllocationValue并关联使用点,处理异步操作开始/结束的连续性约束。
  • 识别用户标注或候选的跨程序预取,按比较器排序后优先分配。
  • 扩展作用域分配(scoped allocation)以合并空闲块,减少碎片。
  • 数据结构与复杂度
  • 堆模拟器Chunk/Interval管理:时间维度上维护占用与空闲区间,支持对齐与扩展。
  • 别名与共置:通过别名分析与数据流分析构建邻接关系,降低冲突。
  • 时间复杂度:主要受缓冲区数量与指令数影响,区间排序与堆模拟器操作为O(N log N)到O(N^2),取决于具体实现细节。
  • 优化策略
  • 空间优先级:已标注在替代内存的区间优先分配。
  • 成本驱动:结合成本分析与异步指令的带宽调整因子,动态调整初始资源。
  • 控制流处理:While/条件等结构内不将可能被驱逐的缓冲区放入替代内存。
classDiagram
class MsaAlgorithm {
+CreateAllocationValues(interval, out)
+FindAliases(values)
+ExtendScopedAlternateMemoryAllocations()
+IsUseAllowedInAlternateMemory(value, use) bool
}
class AllocationValue {
+defining_position()
+uses()
+AddUse(use, time)
+set_requires_contiguous_allocation(flag)
}
class MsaBufferInterval {
+buffer
+size
+start
+end
+colocations
+need_allocation
}
class HeapSimulator {
+Chunk
+Allocate()
+Deallocate()
}
MsaAlgorithm --> AllocationValue : "创建/关联"
MsaAlgorithm --> MsaBufferInterval : "排序/筛选"
MsaAlgorithm --> HeapSimulator : "空间布局"

图表来源 - xla/service/memory_space_assignment/algorithm.cc - xla/service/memory_space_assignment/algorithm.cc - xla/service/memory_space_assignment/algorithm.cc - xla/service/heap_simulator/heap_simulator.h

章节来源 - xla/service/memory_space_assignment/algorithm.cc

组件B:内存空间分配主流程与异步复制

  • 关键职责
  • 将HLO值拆分为AllocationValue,建立使用关系与别名,插入CopyStart/CopyDone以实现异步迁移。
  • 处理从替代内存到默认内存的即时驱逐(eviction),以及替代内存中的单次使用即时预取。
  • 流程要点
  • JIT单次使用预取:将后续多次使用的预取拆分为针对每个首次使用的独立预取,减少冗余。
  • 即时驱逐:对于在默认内存中的驱逐,将其时间窗口压缩至父分配的起始时刻,避免额外驻留。
sequenceDiagram
participant Seq as "分配序列"
participant Pref as "替代内存预取"
participant Evict as "默认内存驱逐"
participant JIT as "JIT单次使用预取"
Seq->>Pref : 多次使用预取
Pref-->>Seq : 插入首个使用点的预取
Seq->>JIT : 为后续使用点创建独立预取
Seq->>Evict : 默认内存驱逐
Evict-->>Seq : 压缩时间窗口至父分配起始

图表来源 - xla/service/memory_space_assignment/memory_space_assignment.cc

章节来源 - xla/service/memory_space_assignment/memory_space_assignment.cc

组件C:GPU集合通信内存(对称/多播/对等)

  • 关键职责
  • 在同一进程中通过Rendezvous协调所有参与设备,按确定顺序分配对称/多播/对等内存,并建立地址映射。
  • 提供按设备/分配索引查找映射地址与偏移的能力,支持范围映射与对等地址查询。
  • 优化与注意事项
  • 合并相邻分配、缓存对称内存以减少重复分配开销(注释中给出优化建议)。
  • 多进程模式下对多播与对等内存的支持有限制,需确保在同一进程内执行。
sequenceDiagram
participant CM as "CollectiveMemory"
participant RZ as "Rendezvous"
participant Comm as "GpuCommunicator"
participant GPU as "GpuExecutor"
CM->>RZ : 发起对称/多播/对等内存请求
RZ->>Comm : 获取通信对象
Comm->>GPU : 分配对称/多播/对等内存
GPU-->>RZ : 返回映射指针/地址
RZ-->>CM : 返回映射结果
CM-->>CM : 查找/偏移计算

图表来源 - xla/backends/gpu/runtime/collective_memory.cc

章节来源 - xla/backends/gpu/runtime/collective_memory.cc

组件D:MLIR缓冲区释放与别名处理

  • 关键职责
  • 基于BufferViewFlowAnalysis识别潜在别名,计算安全的dealloc位置。
  • 在必要时引入clone以消除别名,确保所有缓冲区最终都能被释放。
  • 流程要点
  • 遍历分支与块参数,收集所有潜在别名,找到公共后支配块作为释放点。
  • 支持结构化控制流循环,但显式控制流循环当前不完全支持。
flowchart TD
Start(["开始"]) --> Analyze["识别潜在别名<br/>BufferViewFlowAnalysis"]
Analyze --> FindPD["计算公共后支配块"]
FindPD --> PlaceDealloc["在安全块插入dealloc"]
PlaceDealloc --> CloneNeeded{"是否需要clone?"}
CloneNeeded --> |是| InsertClone["插入clone并更新别名"]
CloneNeeded --> |否| Done(["完成"])
InsertClone --> Done

图表来源 - xla/mlir_hlo/deallocation/transforms/buffer_deallocation.cc

章节来源 - xla/mlir_hlo/deallocation/transforms/buffer_deallocation.cc

组件E:内存空间传播与绑定

  • 关键职责
  • 将HLO指令的内存空间布局传播到其操作数,结合别名分析与形状信息,形成一致的内存域绑定。
  • 支持用户标注与启发式策略,结合成本分析与排序规则进行优化。
  • 与MSA的关系
  • 内存空间传播为MSA提供初始布局建议与排序依据,MSA在此基础上进一步细化分配与拷贝点。

章节来源 - xla/hlo/transforms/memory_space_propagation.cc

依赖关系分析

  • 组件耦合
  • MSA依赖别名分析、生命周期与调度、成本分析与设备描述(带宽)。
  • GPU集合通信内存依赖缓冲区分配抽象、通信器与GPU执行器。
  • MLIR缓冲区释放依赖BufferViewFlowAnalysis与Liveness分析。
  • 外部依赖
  • 设备带宽、成本分析函数、异步指令带宽调整因子等外部输入影响分配决策。
  • 循环与控制流
  • While/条件等结构对替代内存分配有约束,避免在循环体内分配无法驻留的缓冲区。
graph LR
Alias["别名分析"] --> MSA["MSA算法"]
Live["生命周期/调度"] --> MSA
Cost["成本分析/带宽"] --> MSA
MSA --> Alloc["分配序列"]
Alloc --> GPU["GPU集合通信内存"]
GPU --> Map["地址映射/偏移"]
MLIRBD["MLIR缓冲区释放"] --> Alloc

图表来源 - xla/service/memory_space_assignment/algorithm.cc - xla/backends/gpu/runtime/collective_memory.cc - xla/mlir_hlo/deallocation/transforms/buffer_deallocation.cc

章节来源 - xla/service/memory_space_assignment/algorithm.cc - xla/backends/gpu/runtime/collective_memory.cc - xla/mlir_hlo/deallocation/transforms/buffer_deallocation.cc

性能考量

  • 带宽与成本
  • 设备带宽与指令成本分析用于估计初始资源与异步复制的重叠影响,避免过度并发导致带宽争用。
  • 循环内存瓶颈优化(MemoryBoundLoopOptimizer)可识别并优化内存带宽受限的循环。
  • 数据局部性与访问模式
  • 通过内存空间传播与重计算(重利用)减少全局内存访问次数,提升数据局部性。
  • 对于GEMV等低数据复用场景,应关注内存带宽瓶颈并采用合适的分块/布局策略。
  • 碎片化与对齐
  • 堆模拟器与对齐函数确保分配按边界对齐,扩展作用域分配以合并空闲块,降低碎片化。

章节来源 - xla/service/memory_space_assignment/memory_bound_loop_optimizer.h - xla/service/memory_space_assignment/algorithm.cc - xla/service/memory_space_assignment/algorithm.cc - xla/service/cpu/dot_op_emitter.cc

故障排查指南

  • 内存泄漏检测
  • MLIR缓冲区释放Pass会在必要时引入clone以避免内存泄漏,若发现异常,检查是否存在未处理的别名或控制流循环。
  • 在分布式测试中存在已知的非优雅退出导致的内存泄漏提示,需确保正常关闭与资源回收。
  • 集合通信内存问题
  • 多进程模式下多播与对等内存不受支持,需确保在同一进程内执行。
  • 若出现地址映射失败,检查缓冲区分配索引与偏移计算逻辑。
  • 性能分析
  • 使用设备侧Profiler(如CUPTI/ROCm)采集内存带宽指标,结合成本分析与缓存键生成,定位瓶颈。

章节来源 - xla/mlir_hlo/deallocation/transforms/buffer_deallocation.cc - xla/backends/gpu/runtime/collective_memory.cc - xla/backends/gpu/runtime/collective_memory.cc - xla/backends/profiler/gpu/cupti_collector.cc - xla/backends/profiler/gpu/rocm_collector.cc

结论

XLA的内存空间优化通过“内存空间分配算法+集合通信内存+MLIR缓冲区释放”的协同,实现了在多内存域(默认/替代)与多设备/进程环境下的高效分配与访问。关键优化点包括: - 基于成本分析与异步复制资源估计的分配策略; - 跨程序预取与即时驱逐/预取的精细化控制; - 集合通信内存的统一映射与偏移计算; - 别名与生命周期分析保障释放正确性与完整性。

建议在实际部署中结合设备带宽、指令成本与访问模式进行调优,并使用提供的分析与检测工具持续监控内存使用与带宽利用率。

附录