
GE 内存约束文档【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge静态内存复用代码位置compiler/graph/build/memory/约束1图编译模块内存复用处理阶段禁止改图精确边界禁止改图的范围BlockMemAssigner::AssignMemoryWithReuse实现及其触发的所有函数多线程入口HybridMemAssigner::Assign启动多线程并发调用AssignMemoryWithReuse明确禁止的对ComputeGraph上的Node增加、修改、删除属性安全的操作读取属性/OpDesc是安全的系统在遍历时大量读取OpDesc来判断内存分配策略约束2动态多batch场景影响分析代码实体DynamicBatchMemAssignerdynamic_batch_mem_assigner.h含义系统通过batch_label_由用户或GE上层框架设置标识不同batch支持不同batch间的内存复用策略与静态内存复用的矛盾点连续输入的内存在不同batch中会被合并成一个大块进行对齐batch内外没有复用batch间有对齐策略导致内存使用效率可能降低最大拆分大小限制kMaxSplitSizeForDynamicBatch 400MBdynamic_batch_mem_assigner.h约束3静态图内存新增特性需要考虑的场景场景代码标记/依据对复用的影响连续内存continuous_block_block_mem_assigner.hContinuousMemMngcontinuous_mem.cc支持连续输入节点的内存合并不同batch的连续内存可以合并复用atomic集中清零atomic_addr_clean_id_block_mem_assigner.h需要atomic清零的内存块不能被其他节点复用如果节点没有相关属性则跳过清零零拷贝is_zero_copy_block_mem_assigner.hIsNodeAndPeerNodeTaskSupportZeroCopyblock_mem_assigner.cc零拷贝块可跨节点复用IsRealSizeReuseBlock零拷贝内存不能合并多个用户输入地址可能不连续不可变地址输出is_fixed_addr_prior_block_mem_assigner.hconstant/const/variable/fileconstant/constplaceholder类型的算子output地址在编译期固定固定地址优先的内存块可被复用但地址不可变不支持地址刷新的算子HCOM/rtsStreamSwitchByIndex等这些算子的输入输出地址必须稳定不能使用零拷贝P2P内存类型RT_MEMORY_P2P_DDRblock_mem_assigner.ccP2P内存不能与其他内存类型合并清零graph_mem_assigner.cc约束4HCOM算子的特殊性连续的含义逻辑连续而非物理连续。多个HCOM算子的输出在逻辑上形成连续内存区域通过ContinuousMemMng管理器处理分配和复用。 —continuous_mem.ccfeatureBaseRefreshable配置获取方式ge::GetContext().GetOption(ge::OPTION_FEATURE_BASE_REFRESHABLE, refreshable)—block_mem_assigner.cc成员变量is_feature_map_refreshable_block_mem_assigner.h默认值false配置值为1时设为true作用控制特征图是否可刷新影响IsNoNeedAssignMemory的判断约束5其他约束PreAssign/SetOpMemOffset非线程安全只能由单线程调用其他并发操作需要注意。 —block_mem_assigner.h对齐策略差异零拷贝内存使用32字节对齐其他使用512字节对齐。 —graph_mem_assigner.h子图NETOUTPUT特殊处理子图中的NETOUTPUT节点不能进行零拷贝。 —block_mem_assigner.cc多batch形状数据节点约束多batch形状数据节点不支持零拷贝。 —block_mem_assigner.cc悬挂内存块管理悬挂的内存块suspended block会在下一个节点分配时被释放生命周期通过life_time_begin_和life_time_end_管理一旦设置不能修改。 —block_mem_assigner.h复用策略可配置支持通过use_range_、ascending_sort_、reuse_first_release_、memory_priority_mode_等参数动态配置。 —block_mem_assigner.h动态内存复用代码位置v2层runtime/v2/kernel/memory/allocator/ScalableAllocator、MemoryPoolv1层runtime/v1/graph/manager/active_memory_allocator.hActiveMemoryAllocator、ExpandableActiveMemoryAllocator、PhysicalMemoryAllocator桥接层runtime/v2/kernel/memory/device/device_allocator.hDeviceAllocator约束1ScalableAllocator不支持多线程并发代码位置runtime/v2/kernel/memory/allocator/scalable_allocator.h无锁设计依据类内部无std::mutex或std::recursive_mutex仅有static std::atomic_size_t global_allocator_id_用于生成唯一IDscalable_allocator.h安全性保证方式由aclmdlExecute的调用约束保证单线程调用详见docs/graph_engine_api/aclmdlExecute.md底层allocator通过recursive_mutex保证线程安全底层有锁保护v1层的PhysicalMemoryAllocator使用std::recursive_mutexactive_memory_allocator.hExpandableActiveMemoryAllocatorImp同样使用std::recursive_mutexactive_memory_allocator.h约束2ActiveMemoryAllocator/ExpandableActiveMemoryAllocator/PhysicalMemoryAllocator支持多线程线程安全机制使用std::recursive_mutex保护共享资源新增代码要求必须在访问共享资源时加锁保护遵循现有的锁使用模式内存管理代码位置runtime/v2/kernel/memory/不含allocator子目录约束1device id正确性代码位置memory_kernel.cc使用aclrtGetDevice获取device_id要求调用rts接口时device id必须显式传入正确值避免使用缺省参数默认为0需要验证多device场景用例约束2内存释放时序顺序先流同步 → 再释放内存 → 最后销毁device代码关联caching_mem_allocator.ccAllocateWithTryRecycle方法确保同步后再释放约束3虚拟内存兼容性设计rtReserveMemAddress用途虚拟地址预留用于动态shape预分配地址空间实际调用位置runtime/v1/graph/manager/active_memory_allocator.ccfallback路径当rtReserveMemAddress失败时标记不支持虚拟地址预留回退到物理地址分配模式。 —runtime/v1/graph/manager/active_memory_allocator.ccMaybe not support rtReserveMemAddress.要求要确保业务流程正常无ERROR日志约束4caching_mem_allocator进程退出时序代码位置caching_mem_allocator.h—static std::vectorCachingMemAllocator * all_caching_mem_allocators_机制全局变量保存所有allocator实例指针GE finalize时主动调用所有allocator的finalize方法原因allocator析构时如果还有内存未释放会调用rts接口释放但此时rts so可能已卸载导致core dumpfinalize入口rts_caching_mem_allocator.cc遍历all_caching_mem_allocators_逐一finalize约束5单例内存池在模型卸载或者session析构时也要析构举例SessionMemAllocatorExpandableActiveMemoryAllocator是单例内部存储基于session id的对象。当用户创建新的session或者调用aclmdl开头的接口进行离线推理时会产生新的session id也就会产生新的对象因此需要在下面两个地方调用SessionMemAllocatorExpandableActiveMemoryAllocator::Instance().RemoveAllocator释放对象内存否则用户在创建多个session或者多次执行调用aclmdl开头的接口进行离线推理的场景下无用的对象会多占用host内存或者device内存资源造成“内存泄漏”现象。GeExecutor::UnloadModelaclmdl离线推理场景卸载模型InnerSession::Finalize InnerSession析构CachingMemAllocator完整关系图┌──────────────────────────────────────────────────────────────┐ │ CachingMemAllocator │ │ runtime/v2/kernel/memory/caching_mem_allocator.h │ │ - all_caching_mem_allocators_ (全局allocator注册表) │ │ - rts_mem_allocator_ (RtsFirstLevelPool) │ │ - memory_pool_ → ScalableAllocator │ │ - mutex_ (static, 保护allocator创建/销毁) │ ├──────────────────────────────────────────────────────────────┤ │ │ │ ┌── RtsCachingMemAllocator │ │ │ runtime/v2/kernel/memory/rts_caching_mem_allocator.h │ │ │ - device_id_to_allocators_ (device → allocator映射) │ │ │ - 负责finalize流程遍历all_caching_mem_allocators_ │ │ │ │ │ └── ScalableAllocator (通过memory_pool_指针) │ │ runtime/v2/kernel/memory/allocator/scalable_allocator │ │ - 无锁设计单线程调用 │ │ - 通过 DeviceAllocator 桥接到 v1 allocator │ │ │ │ └── DeviceAllocator │ │ runtime/v2/kernel/memory/device/device_allocator │ │ - active_memory_allocator_ (Expandable...Imp, v1) │ │ │ │ └── PhysicalMemoryAllocator (v1) │ │ runtime/v1/graph/manager/active_mem...h │ │ - recursive_mutex 保护 │ │ - 最终调用 rtMalloc / rtFree │ └──────────────────────────────────────────────────────────────┘编译期内存排布冲突代码位置compiler/graph/optimize/mem_layout_conflict_optimize/维测日志约束发现冲突[MemConflict][Conflict] type: [%s, %s], anchor: [%s, %s], will insert %s %s插入Identity[MemConflict][INSERT][NODE]日志使用[MemConflict]关键字如果每张图只会打印一次使用LOGI跨模块约束汇总以下约束跨越多个模块修改时需同步考虑地址刷新能力模块一 模块二mem_layout_conflict_optimize中的冲突检测判定不支持地址刷新的算子列表必须与静态内存复用中的处理逻辑保持一致。v1/v2 allocator边界模块三 模块四v2的ScalableAllocator通过DeviceAllocator桥接到v1的PhysicalMemoryAllocator。修改任何一层的接口都需要考虑对另一层的影响。caching_mem_allocator生命周期模块三 模块四CachingMemAllocator的finalize流程依赖all_caching_mem_allocators_全局注册表新增allocator类型必须正确注册到此表中。【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考