nvlink_alloc
NVIDIA Fabric 是基于 NVLink/NVSwitch 硬件互联的跨 GPU 内存共享协议,CU_MEM_HANDLE_TYPE_FABRIC 告诉 CUDA 驱动:这块内存需要能够通过 NVLink fabric 被其他 GPU 直接访问。 从代码上下文来看,Mooncake 的 Transfer Engine 使用 FABRIC 句柄来:
workspace/Mooncake/mooncake-transfer-engine/nvlink-allocator/nvlink_allocator.cpp
- 分配可被远端 GPU 直接访问的内存
- 配合 GPU Direct RDMA 实现零拷贝数据传输
- 让所有设备都有读写权限 cuMemSetAccess
配置内存分配属性
设置 CUmemAllocationProp:分配类型为 pinned(页锁定)内存
位置类型为设备内存
使用 CU_MEM_HANDLE_TYPE_FABRIC 句柄类型(适用于 NVLink)
检查 GPU Direct RDMA 支持
查询设备是否支持 GPU Direct RDMA with CUDA VMM
如果支持,设置相应的标志
计算内存对齐
使用 cuMemGetAllocationGranularity 获取最小分配粒度
对 size 进行对齐:size = (size + granularity - 1) & ~(granularity - 1)
以pytorch插件的方式导出malloc和free接口,供python可以直接使用。 在sglang中:
if self.enable_custom_mem_pool:
# TODO(shangming): abstract custom allocator class for more backends
from mooncake.allocator import NVLinkAllocator
allocator = NVLinkAllocator.get_allocator(self.device)
self.custom_mem_pool = torch.cuda.MemPool(allocator.allocator())