大型分布式数据的零拷贝内存共享:V6d

Vineyard (v6d) 版本 0.13.2 发布

Vineyard (v6d) 是一个零拷贝和内存数据管理器,最近发布了版本 0.13.2,带来了对 Python/C++ 开发和 Kubernetes 部署的改进功能。该项目由阿里巴巴工程团队主导开发,并作为 CNCF 沙箱项目维护。Vineyard 提供分布式操作符,可用于在集群节点内或跨节点共享不可变数据,特别适用于大规模数据集的深度网络训练(如大语言模型和图模型)。

零拷贝与内存数据分发的核心问题

零拷贝和内存数据分发是许多实时应用程序的核心问题。从图像处理管道到深度学习模型(如大语言模型和图挖掘算法),许多数据处理应用程序需要从多个独立进程摄取大量数据。在机器学习工程中,随着深度网络规模不断扩大,模型参数的分布需要访问共享状态和数据,这一瓶颈问题变得更加明显。作为早期项目,Vineyard 旨在为这些用例提供高级 API。

Vineyard 的架构与组件

实时应用程序的架构通常利用内存键值存储/缓存(如 etcd、Memcached、Redis)来存储和交换频繁访问的数据。根据服务类型,工程团队必须考虑这些工具的相关权衡。Vineyard 由两个主要组件组成:

  1. 基于 Apache Arrow Plasma 的共享内存数据管理器(用于节点内数据管理),支持零拷贝数据传输。
  2. 基于 etcd 的元数据服务器(用于节点间数据管理),处理全局数据属性的分布。

Vineyard 在 Python 社区中的定位

Vineyard 可以被视为将 Python 的原生多进程共享内存扩展到多台机器,用于不可变数据块。它提供了两种 Python 客户端接口:IPCClientRPCClient,分别用于操作本地和远程对象。这两种客户端 API 允许基于对象 ID 的统一数据插入和检索模式。然而,Vineyard 不会自动在集群节点间移动数据,除非明确指示,以避免高网络成本。

示例:使用 Vineyard 进行数据共享

以下是一个在本地机器上运行 Vineyard 的简单示例:

  1. 创建本地 Vineyard 实例

    python -m vineyard --socket /tmp/vineyard.sock --size 16733650944
  2. 使用 Python 原生 API 共享数据

    import numpy as np
    from multiprocessing import shared_memory
    
    shape_, dtype_ = (3, 10000, 10000), np.uint8
    array_to_share = np.random.randint(0, high=255, size=shape_, dtype=dtype_)
    
    # 创建共享内存
    shm = shared_memory.SharedMemory(create=True, size=array_to_share.nbytes)
    array_shm = np.ndarray(shape_, dtype=array_to_share.dtype, buffer=shm.buf)
    array_shm[:] = array_to_share[:]  # 需要复制数据
    
    # 在另一个进程中检索数据
    existing_shm = shared_memory.SharedMemory(name=shm.name)
    array_retrieved = np.ndarray(shape=shape_, dtype=dtype_, buffer=existing_shm.buf)
  3. 使用 Vineyard 进行相同操作

    import vineyard
    
    client = vineyard.connect('/tmp/vineyard.sock')
    array_id = client.put(array_to_share)
    
    # 在另一个进程中检索数据
    array_retrieved = client.get(array_id)

Vineyard 的扩展功能

Vineyard 支持零拷贝操作,兼容 NumPy、PyTorch、TensorFlow 和 MxNet 张量,并支持 Pandas/Arrow 数据帧。更多关于库集成的信息可以在官方文档中找到。此外,Vineyard 还提供了一个分布式学习的示例教程。

多节点部署

Vineyard 允许通过 Python API 和 Helm 图表在 Kubernetes 集群上部署 Vineyard 操作符。官方文档提供了更详细的 Vineyard 架构概述。

阅读 23
0 条评论