十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

深度解析GE内存管理机制:零拷贝技术与block_mem分配策略

深度解析GE内存管理机制:零拷贝技术与block_mem分配策略 深度解析GE内存管理机制零拷贝技术与block_mem分配策略【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/geGEGraph Engine作为面向昇腾的图编译器和执行器通过先进的内存管理机制显著提升模型执行效率。本文将深入剖析GE的两大核心内存优化技术——零拷贝技术与block_mem分配策略带您了解如何通过这些技术减少内存占用并加速模型推理。内存管理GE性能优化的核心在AI推理场景中内存操作往往是性能瓶颈之一。GE通过静态内存复用和动态内存管理相结合的方式实现了高效的内存利用。静态内存复用主要通过block_mem分配策略实现而动态内存管理则涉及零拷贝技术等高级特性。GE的内存管理模块位于compiler/graph/build/memory/和runtime/v2/kernel/memory/目录涵盖了从编译期规划到运行时执行的完整流程。零拷贝技术消除冗余数据传输零拷贝技术是GE内存优化的重要手段其核心目标是消除不必要的中间数据拷贝让用户直接在模型可见的内存区域读写数据。GE的零拷贝覆盖输入和输出两个方向分别称为输入零拷贝Input Zero Copy和输出零拷贝Output Zero Copy。零拷贝的架构实现GE的零拷贝特性横跨用户接口层、编译器层和运行时层三个层面用户接口层提供aclmdlLoadFromMemWithMem、aclOpExecutor等接口通过ge.exec.reuseZeroCopyMemory等选项控制零拷贝行为。编译器层通过SetInputOutputOffsetPass记录内存偏移GraphMemAssigner独立分配零拷贝内存块并在MemoryBlock中标记is_zero_copy_属性。运行时层V1 runtime通过ZeroCopyOffset管理偏移映射V2 runtime则通过ModelOutTensorZeroCopyPass实现图变换直接在用户缓冲区上计算。零拷贝的关键技术点内存块标记与独立分配在编译期零拷贝内存块被标记为is_zero_copy_确保不与其他内存块合并独立分配偏移。相关代码位于compiler/graph/build/memory/block_mem_assigner.h和graph_mem_assigner.cc。地址映射与刷新运行时通过ZeroCopyOffset维护虚拟地址到物理地址的映射当用户传入新地址时只需刷新任务参数中的地址引用无需重新分配内存。具体实现见runtime/v1/graph/load/model_manager/zero_copy_offset.h。严格的对齐策略零拷贝内存使用32字节对齐而其他内存使用512字节对齐以平衡性能和兼容性。这一策略定义在graph_mem_assigner.h中。block_mem分配策略高效内存复用block_mem分配策略是GE静态内存复用的核心通过精细的内存块管理和复用规则最大化内存利用率。GE的内存分配器分为V1和V2两个版本分别位于runtime/v1/graph/manager/active_memory_allocator.h和runtime/v2/kernel/memory/allocator/。内存块管理与复用规则GE定义了多种内存块类型和复用规则确保内存使用效率连续内存通过ContinuousMemMng支持连续输入节点的内存合并不同batch的连续内存可以合并复用。atomic集中清零需要atomic清零的内存块不能被其他节点复用避免数据干扰。不可变地址输出constant/const/variable等算子的输出地址在编译期固定可复用但地址不可变。零拷贝内存可跨节点复用但不能合并因为多个用户输入地址可能不连续。这些规则在block_mem_assigner.h中通过相应的标记如continuous_block_、atomic_addr_clean_id_、is_zero_copy_实现。动态内存分配与线程安全GE的动态内存分配器在多线程环境下保证安全ScalableAllocatorV2层的无锁设计通过单线程调用约束保证安全位于runtime/v2/kernel/memory/allocator/scalable_allocator.h。ActiveMemoryAllocatorV1层使用std::recursive_mutex保护共享资源支持多线程并发定义在runtime/v1/graph/manager/active_memory_allocator.h。实际应用场景与最佳实践单算子执行场景在单算子执行时ACL框架强制启用零拷贝通过LoweringOption的always_zero_copy和always_external_allocator选项实现。相关代码位于api/acl/acl_op_executor/single_op/op_executor.cppgert::LoweringOption oOption; oOption.always_zero_copy true; oOption.always_external_allocator true; auto streamExecutor gert::LoadStreamExecutorFromModelData(modelData, oOption, ret).release();模型推理场景在模型推理时用户可通过aclmdlConfigHandle设置ge.exec.reuseZeroCopyMemory选项控制是否复用零拷贝内存。V1 runtime通过input_data_info_和output_data_info_管理输入输出内存映射V2 runtime则通过图变换Pass直接操作用户缓冲区。多batch场景处理动态多batch场景下GE通过DynamicBatchMemAssigner实现不同batch间的内存复用但需注意最大拆分大小限制kMaxSplitSizeForDynamicBatch 400MB。相关实现位于dynamic_batch_mem_assigner.h。总结与展望GE的内存管理机制通过零拷贝技术和block_mem分配策略有效减少了内存占用和数据传输开销显著提升了模型执行效率。零拷贝技术消除了冗余的数据拷贝而block_mem分配策略则通过精细的内存块管理实现了高效复用。这些技术不仅适用于昇腾平台也为其他AI框架的内存优化提供了宝贵的参考。随着AI模型的不断发展对内存管理的要求将越来越高。GE团队将继续优化内存分配算法探索更高效的内存复用策略为用户提供更快、更省内存的模型执行体验。如果您想深入了解GE的内存管理实现可以参考docs/architecture/constraints/memory-constraints.md和docs/architecture/features/zero_copy.md等官方文档。通过本文的介绍相信您对GE的内存管理机制有了更深入的理解。在实际应用中合理配置零拷贝选项和内存分配策略将帮助您充分发挥GE的性能优势加速AI模型的推理过程。【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表