使用前必读
什么是零拷贝
单算子模式下算子的输入输出buffer是动态变化的,为了避免每次通信都进行两端进程的内存注册,HCCL在通信域内部构造了一个buffer进行中转完成集合通信,因此会引入额外的内存拷贝开销。
为了降低上述内存拷贝开销,使得HCCL可以直接对业务传入的内存进行操作,避免使用中转HCCL buffer,HCCL提供了本节所述接口,从而实现零拷贝。
通用约束
零拷贝功能当前存在如下使用限制与约束:
- 仅支持
Atlas A3 训练系列产品/Atlas A3 推理系列产品 。 - 相关接口仅支持Ascend Extension for PyTorch插件后端代码调用,其他场景暂不支持。
- 仅支持通信算法的编排展开位置在AI CPU的场景。
- 仅支持通信域范围是单Server,且通信算子未开启重执行的场景。
- 仅支持集合通信算子AllGather、ReduceScatter、Broadcast、AllReduce,其中ReduceScatter、AllReduce算子使能零拷贝功能后会修改用户的输入内存。
- 算子的输入、输出内存必须是激活内存,且输入数据大于等于32MB。
- 开启零拷贝功能时,建议开发者使用较大的通信域(即覆盖最大卡数的通信域)进行虚拟地址设置与激活,此通信域中所有进程调用集合通信算子时都可实现零拷贝(未设置、激活虚拟地址的通信域无法实现零拷贝)。
使用流程
零拷贝功能的实现流程示例如下所示:
- 调用AscendCL提供的aclrtReserveMemAddress接口预留虚拟内存。
- 调用HcclCommSetMemoryRange接口通知HCCL通信域预留的虚拟内存地址。
- 调用AscendCL提供的aclrtMallocPhysical接口申请Device物理内存。
- 调用AscendCL提供的aclrtMapMem接口将申请的物理内存映射到预留的虚拟内存。
- 调用HcclCommActivateCommMemory接口激活预留的虚拟内存。
- 执行集合通信任务,需要注意通信域中每个进程传入的输入、输出内存需要为已激活内存,这样才能正确使能零拷贝功能。
- 调用HcclCommDeactivateCommMemory接口去激活预留的虚拟内存。
- 调用AscendCL提供的aclrtUnmapMem接口取消物理内存与预留虚拟内存的映射。
- 调用AscendCL提供的aclrtFreePhysical接口释放Device物理内存。
- 调用HcclCommUnsetMemoryRange接口通知HCCL通信域取消使用预留的虚拟内存。
- 调用AscendCL提供的aclrtReleaseMemAddress接口释放虚拟内存。
父主题: 零拷贝功能