Vineyard (v6d) 版本 0.13.2 发布
Vineyard (v6d) 是一个零拷贝和内存数据管理器,最近发布了版本 0.13.2,带来了对 Python/C++ 开发和 Kubernetes 部署的改进功能。该项目由阿里巴巴工程团队主导开发,并作为 CNCF 沙箱项目维护。Vineyard 提供分布式操作符,可用于在集群节点内或跨节点共享不可变数据,特别适用于大规模数据集的深度网络训练(如大语言模型和图模型)。
零拷贝与内存数据分发的核心问题
零拷贝和内存数据分发是许多实时应用程序的核心问题。从图像处理管道到深度学习模型(如大语言模型和图挖掘算法),许多数据处理应用程序需要从多个独立进程摄取大量数据。在机器学习工程中,随着深度网络规模不断扩大,模型参数的分布需要访问共享状态和数据,这一瓶颈问题变得更加明显。作为早期项目,Vineyard 旨在为这些用例提供高级 API。
Vineyard 的架构与组件
实时应用程序的架构通常利用内存键值存储/缓存(如 etcd、Memcached、Redis)来存储和交换频繁访问的数据。根据服务类型,工程团队必须考虑这些工具的相关权衡。Vineyard 由两个主要组件组成:
- 基于 Apache Arrow Plasma 的共享内存数据管理器(用于节点内数据管理),支持零拷贝数据传输。
- 基于 etcd 的元数据服务器(用于节点间数据管理),处理全局数据属性的分布。
Vineyard 在 Python 社区中的定位
Vineyard 可以被视为将 Python 的原生多进程共享内存扩展到多台机器,用于不可变数据块。它提供了两种 Python 客户端接口:IPCClient 和 RPCClient,分别用于操作本地和远程对象。这两种客户端 API 允许基于对象 ID 的统一数据插入和检索模式。然而,Vineyard 不会自动在集群节点间移动数据,除非明确指示,以避免高网络成本。
示例:使用 Vineyard 进行数据共享
以下是一个在本地机器上运行 Vineyard 的简单示例:
创建本地 Vineyard 实例:
python -m vineyard --socket /tmp/vineyard.sock --size 16733650944使用 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)使用 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 架构概述。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。