显存共享#
核心问题
多实例场景下,在同一个NPU设备中,多个模型使用了相同的权重(如下图所示),可使用显存共享降低消耗。

理论支撑
利用相同的NPU物理地址和偏移构建不同Tensor,可同时访问同一片内存。
设计思路
使用进程间共享的内存管理器管理内存,不同进程使用内存管理器分配的内存进行共享。
实现流程

进程0统计所需的内存大小offset,通过进程间共享的NPU Allocator申请内存。
NPU Allocator将申请的物理内存地址data_ptr返回给进程0。
进程0将实际物理内存地址data_ptr通过进程间通信传给进程1。
进程0触发内存拷贝,将CPU的内存拷贝到实际NPU物理地址上。
进程0和进程1通过物理内存地址data_ptr和offset构建Tensor。
接口说明#
from mindiesd.share_memory import init_share_memory, share_memory
使用示例#
主实例(加载权重并共享):
from mindiesd.share_memory import init_share_memory, share_memory
init_share_memory(instance_world_size=2, instance_id=0)
model = ModelClass().to("npu")
model = share_memory(model, device="npu:0")
从实例(接收共享内存):
from mindiesd.share_memory import init_share_memory, share_memory
init_share_memory(instance_world_size=2, instance_id=1)
model = ModelClass() # 不加载权重
model = share_memory(model, device="npu:0") # 通过共享句柄构建 Tensor
主实例将权重所在 NPU 物理地址通过 ZMQ 广播给从实例,从实例通过同一物理地址构建 Tensor,实现多进程共享同一片显存。