CANN/hixl FabricMem模式设计
Fabric Mem传输模式需求【免费下载链接】hixlHIXLHuawei Xfer Library是一个灵活、高效的昇腾单边通信库面向集群场景提供简单、可靠、高效的点对点数据传输能力。项目地址: https://gitcode.com/cann/hixl介绍需求的背景随着大语言模型(LLM)推理规模的扩大KV Cache的规模越来越大业界形成了多级缓存的解决方案其中以Mooncake为代表其中的Mooncake store组件可以用来构建一个分布式DRAM缓存池对于npu从HBM传输到DRAM(D2RH)的传输性能提出更高的要求。A3服务器提供了Fabric Memory技术支持超节点内DRAM内存统一编址能够利用HCCS链路进行D2RH/RH2D的传输其实测传输带宽分别达到64GB/s和103GB/s相比之下roce传输带宽仅为20GB/s。其他模式的限制与劣势底层调用HCCL接口的HCCS传输模式不支持D2RH传输。中转模式在A3上的性能受没有PCIE的限制与模型抢占HBM带宽对模型推理影响较大。输入输出使用时的输入介绍配置选项通过OPTION_ENABLE_USE_FABRIC_MEM选项启用Fabric Mem模式值为1表示启用内存描述注册内存使用MemDesc结构体包含内存地址和长度传输操作传输时使用TransferOp枚举(READ/WRITE)描述方向使用TransferOpDesc描述传输地址使用example// 初始化HIXL引擎启用Fabric Mem模式 Hixl engine1; std::mapAscendString, AscendString options1; options1[OPTION_ENABLE_USE_FABRIC_MEM] 1; engine1.Initialize(127.0.0.1, options1); // 注册内存 std::vectoruint8_t buffer(size, 0xAA); hixl::MemDesc mem_desc{}; mem_desc.addr reinterpret_castuintptr_t(buffer.data()); mem_desc.len size; MemHandle handle nullptr; engine1.RegisterMem(mem_desc, MEM_HOST, handle); // 建立连接 engine1.Connect(127.0.0.1:26001); // 执行传输 TransferOpDesc desc{src_addr, dst_addr, size}; engine1.TransferSync(127.0.0.1:26001, WRITE, {desc});使用时传出的输出介绍内存句柄注册内存时返回MemHandle类型用于标识已注册的内存区域传输请求异步传输时返回TransferReq类型用于异步传输的状态查询传输状态查询异步任务状态返回TransferStatus枚举表示异步传输的完成状态处理类图时序图Fabric Mem模式下的数据传输整个特性的处理过程介绍初始化阶段用户通过OPTION_ENABLE_USE_FABRIC_MEM选项启用Fabric Mem模式AdxlInnerEngine解析选项创建FabricMemTransferService实例服务初始化时获取设备ID并设置最大流数量内存注册阶段用户调用RegisterMem注册内存FabricMemTransferService通过aclrtMemRetainAllocationHandle获取物理内存句柄使用aclrtMemExportToShareableHandleV2导出为Fabric可共享句柄将共享句柄信息存储在share_handles_映射中H2H传输模式的特殊性对于HOST内存Fabric Mem传输需要额外的转换处理HOST内存需要先通过aclrtMemRetainAllocationHandle获取物理内存句柄然后使用aclrtMemExportToShareableHandleV2导出为共享句柄然后进行VMM映射将物理内存映射到虚拟地址空间连接建立阶段建立连接时双方交换内存注册信息主要是share_handles_信息对端通过ImportMem导入远程内存的共享句柄使用aclrtMemImportFromShareableHandleV2导入共享句柄映射到虚拟地址空间建立本地虚拟地址到远程虚拟地址的映射关系数据传输阶段先进行用户虚拟地址和映射后的虚拟地址转换从stream pool获取一次任务需要的流资源目前默认一次任务默认4条流后续可配置使用aclrtMemcpyAsync执行设备间的内存拷贝操作同步则阻塞等待异步在一条额外的流上下发EventRecord, 使用aclrtStreamWaitEvent建立拷贝任务流和额外的EventRecord流的关系查询任务状态则以调用aclrtQueryEventStatus查询拷贝任务状态资源清理阶段用户调用DeregisterMem注销内存释放物理内存句柄和共享句柄清理所有资源包括流、异步资源和导入的内存映射端到端使用流程内存申请// 使用aclrtReserveMemAddress预留虚拟地址空间 aclrtReserveMemAddress(va, mem_size, 0, nullptr, 1); // 配置物理内存属性设备内存、大页模式 aclrtPhysicalMemProp prop{}; prop.handleType ACL_MEM_HANDLE_TYPE_NONE; prop.allocationType ACL_MEM_ALLOCATION_TYPE_PINNED; prop.memAttr ACL_HBM_MEM_HUGE; prop.location.type ACL_MEM_LOCATION_TYPE_DEVICE; prop.location.id device_id; // 分配物理内存并映射到虚拟地址空间 aclrtMallocPhysical(pa_handle, mem_size, prop, 0); aclrtMapMem(va, mem_size, 0, pa_handle, 0); // 初始化内存数据从主机拷贝到设备 aclrtMallocHost(host_data, mem_size); memset_s(host_data, mem_size, device_id, mem_size); aclrtMemcpy(va, kMemSize, host_data, mem_size, ACL_MEMCPY_HOST_TO_DEVICE);与传统内存申请不同Fabric Mem需要使用物理内存句柄需要显式映射物理内存到虚拟地址使用大页模式ACL_HBM_MEM_HUGE提升性能引擎初始化和内存注册启用Fabric Mem模式options[OPTION_ENABLE_USE_FABRIC_MEM] 1初始化Hixl注册特殊申请的内存engine.RegisterMem(desc, MEM_DEVICE, handle)连接建立和数据交换调用Connect方法建立连接数据传输和验证执行D2D传输engine.TransferSync(remote_engine, WRITE, {desc})验证传输结果读取远程写入的数据并验证端到端流程的关键特点内存申请需要使用特殊的物理内存API而非传统的aclrtMalloc需要显式管理虚拟地址到物理内存的映射关系传输完成后需要通过验证确保数据正确性关键检查点检查点列表配置冲突检查Fabric Mem模式与Buffer Pool模式不能同时启用在ParseBufferPoolParams中检查内存类型检查在Fabric Mem模式下设备内存注册需要特殊处理传输参数检查验证传输描述中的地址范围是否在已注册的内存范围内流资源管理检查确保流池中的流资源正确分配和释放避免资源泄漏异步请求状态检查异步传输时正确跟踪请求状态确保状态查询的准确性内存映射清理检查连接断开时正确清理导入的内存映射关系并发安全检查多线程环境下对共享数据结构的访问安全对端异常下线对端异常下线时需要清理相关资源避免资源泄漏性能关键点流池管理预创建和管理设备流避免频繁创建销毁的开销多流并发支持一次使用多条流并发处理异步操作支持异步传输允许重叠计算和通信兼容性考虑向后兼容默认不启用Fabric Mem模式保持与传统模式的兼容性【免费下载链接】hixlHIXLHuawei Xfer Library是一个灵活、高效的昇腾单边通信库面向集群场景提供简单、可靠、高效的点对点数据传输能力。项目地址: https://gitcode.com/cann/hixl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考