Skip to main content

openYuanrong datasystem is a distributed heterogeneous cache system that supports pooled caching across HBM, DDR, and SSD, along with asynchronous, high-efficiency data transmission for NPUs.

Project description

openYuanrong 是一个 Serverless 分布式计算引擎,致力于以一套统一 Serverless 架构支持 AI、大数据、微服务等各类分布式应用。它提供多语言函数编程接口,以单机编程体验简化分布式应用开发;提供分布式动态调度和数据共享等能力,实现分布式应用的高性能运行和集群的高效资源利用。

简介

openYuanrong 由多语言函数运行时、函数系统和数据系统组成,支持按需灵活单独或组合使用。

  • 多语言函数运行时:提供函数分布式编程,支持 Python、Java、C++ 语言,实现类单机编程高性能分布式运行。
  • 函数系统:提供大规模分布式动态调度,支持函数实例极速弹性扩缩和跨节点迁移,实现集群资源高效利用。
  • 数据系统:提供异构分布式多级缓存,支持 Object、Stream 语义,实现函数实例间高性能数据共享及传递。

函数是 openYuanrong 的核心概念抽象,它对传统 Serverless 函数概念进行了通用化扩展,起到了类似单机 OS 中进程的作用,可以表达任意分布式应用的运行实例,同时天然支持相互调用。

openYuanrong 分为三个代码仓库:

数据系统(openYuanrong datasystem) 是 openYuanrong 的核心概念抽象,它是一个分布式缓存系统,利用计算集群的 HBM/DRAM/SSD 资源构建近计算多级缓存,提升模型训练及推理、大数据、微服务等场景数据访问性能。

openYuanrong datasystem 的主要特性包括:

  • 高性能分布式多级缓存:基于 DRAM/SSD 构建分布式多级缓存,应用实例通过共享内存免拷贝读写 DRAM 数据,并提供高性能 H2D(host to device)/D2H(device to host) 接口,实现 HBM 与 DRAM 之间快速 swap。
  • NPU 间高效数据传输:将 NPU 的 HBM 抽象为异构对象,自动协调 NPU 间 HCCL 收发顺序,实现简单易用的卡间数据异步并发传输。并支持P2P传输负载均衡策略,充分利用卡间链路带宽。
  • 灵活的生命周期管理:支持设置 TTL、LRU 缓存淘汰以及 delete 接口等多种生命周期管理策略,数据生命周期既可由数据系统管理,也可交由上层应用管理,提供更高的灵活性。
  • 热点数据多副本:数据跨节点读取时自动在本地保存副本,支撑热点数据高效访问。本地副本使用 LRU 策略自动淘汰。
  • 多种数据可靠性策略:支持 write_through、write_back 及 none 多种持久化策略,满足不同场景的数据可靠性需求。
  • 数据一致性:支持 Causal 及 PRAM 两种数据一致性模型,用户可按需选择,实现性能和数据一致性的平衡。
  • 数据发布订阅:支持数据订阅发布,解耦数据的生产者(发布者)和消费者(订阅者),实现数据的异步传输与共享。
  • 高可靠高可用:支持分布式元数据管理,实现系统水平线性扩展。支持元数据可靠性,支持动态资源伸缩自动迁移数据,实现系统高可用。

openYuanrong datasystem 适用场景

  • LLM 长序列推理 KVCache:基于异构对象提供分布式多级缓存 (HBM/DRAM/SSD) 和高吞吐 D2D/H2D/D2H 访问能力,构建分布式 KVCache,实现 Prefill 阶段的 KVCache 缓存以及 Prefill/Decode 实例间 KVCache 快速传递,提升推理吞吐。
  • 模型推理实例 M->N 快速弹性:利用异构对象的卡间直通及 P2P 数据分发能力实现模型参数快速复制。
  • 强化学习模型参数重排:利用异构对象的卡间直通传输能力,快速将模型参数从训练侧同步到推理侧。
  • 训练场景 CheckPoint 快速保存及加载:基于 KV 接口快速写 Checkpoint,并支持将数据持久化到二级缓存保证数据可靠性。Checkpoint恢复时各节点将 Checkpoint 分片快速加载到异构对象中,利用异构对象的卡间直通传输及 P2P 数据分发能力,快速将 Checkpoint 传递到各节点 HBM。
  • 微服务状态数据快速读写:基于 KV 接口实现内存级读写微服务状态数据,并支持将数据持久化到二级缓存保证数据可靠性。

openYuanrong datasystem 架构

openYuanrong datasystem 由三个部分组成:

  • 多语言SDK:提供 Python/C++ 语言接口,封装 heterogeneous object 、KV 以及 object 接口,支撑业务实现数据快速读写。提供两种类型接口:

    • heterogeneous object:基于 NPU 卡的 HBM 内存抽象异构对象接口,实现昇腾 NPU 卡间数据高速直通传输。同时提供 H2D/D2H 高速迁移接口,实现数据快速在 DRAM/HBM 之间传输。
    • KV:基于共享内存实现免拷贝的 KV 接口,实现高性能数据缓存,支持通过对接外部组件提供数据可靠性语义。
    • object:基于共享内存实现近计算的本地对象缓存,实现函数间高效数据流转,支撑Distributed Futures编程模型。
  • worker:openYuanrong datasystem 的核心组件,用于分配管理 DRAM/SSD 资源以及元数据,提供分布式多级缓存能力。

  • 集群管理:依赖 ETCD,实现节点发现/健康检测,支持故障恢复及在线扩缩容。

openYuanrong datasystem 的部署视图如上图所示:

  • 需部署 ETCD 用于集群管理。
  • 每个节点需部署 worker 进程并注册到 ETCD。
  • SDK 集成到用户进程中并与同节点的 worker 通信。

各组件间的数据传输协议如下:

  • SDK 与 worker 之间通过共享内存读写数据。
  • worker 和 worker 之间通过 TCP/RDMA 传输数据(当前版本仅支持 TCP,RDMA/UB 即将支持)。
  • 异构对象 HBM 之间通过 HCCS/RoCE 卡间直通传输数据。

入门

安装 openYuanrong datasystem

pip 方式安装

openYuanrong datasystem 已发布至 PyPI,您可以通过 pip 直接安装。

前置要求

通过pip安装 openYuanrong datasystem 之前,请确保满足以下要求:

  • Python 版本:Python 3.9、3.10 或 3.11
  • 操作系统:Linux(推荐 glibc 2.34+)
  • 架构:x86-64

您可以通过以下命令检查:

# python版本
python --version
# 操作系统
uname -s
# 架构
uname -m
# glibc版本
ldd --version

安装完整发行版(包含 Python SDK、C++ SDK 以及命令行工具):

pip install openyuanrong-datasystem

验证安装

安装完成后,您可以通过以下命令验证安装是否成功:

python -c "import yr.datasystem; print('openYuanrong datasystem installed successfully')"

dscli --version

源码编译方式安装

使用源码编译方式安装 openYuanrong datasystem 可以参考文档:源码编译安装 openYuanrong datasystem

部署 openYuanrong datasystem

进程部署

  • 准备ETCD

    openYuanrong datasystem 的集群管理依赖 ETCD,请先在后台启动单节点 ETCD(示例端口 2379):

    etcd --listen-client-urls http://0.0.0.0:2379 \
         --advertise-client-urls http://localhost:2379 &
    
  • 一键部署

    安装 openYuanrong datasystem 完整发行版后,即可通过随包自带的 dscli 命令行工具一键完成集群部署。在当前启动一个监听端口号为 31501 的服务端进程:

    dscli start -w --worker_address "127.0.0.1:31501" --etcd_address "127.0.0.1:2379"
    
  • 一键卸载

    dscli stop --worker_address "127.0.0.1:31501"
    

更多进程部署参数与部署方式请参考文档:openYuanrong datasystem 进程部署

Kubernetes 部署

openYuanrong datasystem 还提供了基于 Kubernetes 容器化部署方式,部署前请确保部署环境集群已就绪 Kubernetes、Helm 及可访问的 ETCD 集群。

  • 获取 openYuanrong datasystem helm chart 包

    安装 openYuanrong datasystem 完整发行版后,即可通过随包自带的 dscli 命令行工具在当前路径下快速获取 helm chart 包:

    dscli generate_helm_chart -o ./
    
  • 编辑集群部署配置

    openYuanrong datasystem 通过 ./datasystem/values.yaml 文件进行集群相关配置,其中必配项如下:

    global:
      # 其他配置项...
    
      # 镜像仓地址
      imageRegistry: ""
      # 镜像名字和镜像tag
      images:
        datasystem: "openyuanrong-datasystem:0.5.0"
      
      etcd:
        # ETCD集群地址
        etcdAddress: "127.0.0.1:2379"
    
  • 集群部署

    Helm 会提交 DaemonSet,按节点依次拉起 openYuanrong datasystem 实例:

    helm install openyuanrong_datasystem ./datasystem
    
  • 集群卸载

    helm uninstall openyuanrong_datasystem
    

更多 openYuanrong datasystem Kubernetes 高级参数配置请参考文档:openYuanrong datasystem Kubernetes 部署

代码样例

  • heterogeneous object

    通过异构对象接口,将任意二进制数据以键值对形式写入 HBM:

    import acl
    import os
    from yr.datasystem import Blob, DsClient, DeviceBlobList
    
    # hetero_dev_mset and hetero_dev_mget must be executed in different processes
    # because they need to be bound to different NPUs.
    def hetero_dev_mset():
        client = DsClient("127.0.0.1", 31501)
        client.init()
    
        acl.init()
        device_idx = 1
        acl.rt.set_device(device_idx)
    
        key_list = [ 'key1', 'key2', 'key3' ]
        data_size = 1024 * 1024
        test_value = "value"
    
        in_data_blob_list = []
        for _ in key_list:
            tmp_batch_list = []
            for _ in range(4):
                dev_ptr, _ = acl.rt.malloc(data_size, 0)
                acl.rt.memcpy(dev_ptr, data_size, acl.util.bytes_to_ptr(test_value.encode()), data_size, 1)
                blob = Blob(dev_ptr, data_size)
                tmp_batch_list.append(blob)
            blob_list = DeviceBlobList(device_idx, tmp_batch_list)
            in_data_blob_list.append(blob_list)
        client.hetero().dev_mset(key_list, in_data_blob_list)
    
    def hetero_dev_mget():
        client = DsClient("127.0.0.1", 31501)
        client.init()
    
        acl.init()
        device_idx = 2
        acl.rt.set_device(device_idx)
    
        key_list = [ 'key1', 'key2', 'key3' ]
        data_size = 1024 * 1024
        out_data_blob_list = []
        for _ in key_list:
            tmp_batch_list = []
            for _ in range(4):
                dev_ptr, _ = acl.rt.malloc(data_size, 0)
                blob = Blob(dev_ptr, data_size)
                tmp_batch_list.append(blob)
            blob_list = DeviceBlobList(device_idx, tmp_batch_list)
            out_data_blob_list.append(blob_list)
        client.hetero().dev_mget(key_list, out_data_blob_list, 60000)
        client.hetero().dev_delete(key_list)
    
    pid = os.fork()
    if pid == 0:
        hetero_dev_mset()
        os._exit(0)
    else:
        hetero_dev_mget()
        os.wait()
    
  • KV

    通过 KV 接口,将任意二进制数据以键值对形式写入 DDR:

    from yr.datasystem.ds_client import DsClient
    
    client = DsClient("127.0.0.1", 31501)
    client.init()
    
    key = "key"
    expected_val = b"value"
    client.kv().set(key, expected_val)
    
    val = client.kv().get([key])
    assert val[0] == expected_val
    
    client.kv().delete([key])
    
  • object

    通过 object 接口,实现基于引用计数的缓存数据管理:

    from yr.datasystem.ds_client import DsClient
    
    client = DsClient("127.0.0.1", 31501)
    client.init()
    
    # Increase the key's global reference
    key = "key"
    client.object().g_increase_ref([key])
    
    # Create shared memory buffer for key.
    value = bytes("val", encoding="utf8")
    size = len(value)
    buf = client.object().create(key, size)
    
    # Copy data to shared memory buffer.
    buf.memory_copy(value)
    
    # Publish the key.
    buf.publish()
    
    # Get the key.
    buffer_list = client.get([key], True)
    
    # Decrease the key's global reference, the lifecycle of this key will end afterwards.
    client.g_decrease_ref([key])
    

文档

有关 openYuanrong datasystem 安装指南、教程和 API 的更多详细信息,请参阅 用户文档

有关 openYuanrong 更多详细信息请参阅 openYuanrong 文档,了解如何使用 openYuanrong 开发分布式应用。

贡献

我们欢迎您对 openYuanrong 做各种形式的贡献,请参阅我们的贡献者指南

许可证

Apache License 2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

openyuanrong_datasystem-0.8.0-cp311-cp311-manylinux_2_34_x86_64.whl (31.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

openyuanrong_datasystem-0.8.0-cp311-cp311-manylinux_2_34_aarch64.whl (30.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ARM64

openyuanrong_datasystem-0.8.0-cp310-cp310-manylinux_2_34_x86_64.whl (31.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

openyuanrong_datasystem-0.8.0-cp310-cp310-manylinux_2_34_aarch64.whl (30.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ARM64

openyuanrong_datasystem-0.8.0-cp39-cp39-manylinux_2_34_x86_64.whl (31.0 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

openyuanrong_datasystem-0.8.0-cp39-cp39-manylinux_2_34_aarch64.whl (30.5 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ ARM64

File details

Details for the file openyuanrong_datasystem-0.8.0-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for openyuanrong_datasystem-0.8.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 6a107e4131656c789b4c13f243f8df048e670b2fe2f6a7686a98258420102a7c
MD5 f571010c10cb77febfb6f3d347982180
BLAKE2b-256 ed2df84b5dfc4796b005ce24048a917cbbe3dc9b4f6f9c48b2d6702dd35d6feb

See more details on using hashes here.

File details

Details for the file openyuanrong_datasystem-0.8.0-cp311-cp311-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for openyuanrong_datasystem-0.8.0-cp311-cp311-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 6c28ac0e501da0334c16a04f6a36800f5c26798765e87cca19443bc6b388b1fd
MD5 a38959015c4ca3851daec87b6a459487
BLAKE2b-256 a96d5888af2cc46e6b340849319b9f9819ab59de74136d61fa12755cc8e324ef

See more details on using hashes here.

File details

Details for the file openyuanrong_datasystem-0.8.0-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for openyuanrong_datasystem-0.8.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 8f33f2212efe69806c164c4b27313be5e5446edb22844fbe0b0f3592534d8281
MD5 96f791f5b853e199441d8911cf52021f
BLAKE2b-256 180587abd5abe3e5eebea6b386dd0dcbd34708f7c9718bfbe029cdf7da962772

See more details on using hashes here.

File details

Details for the file openyuanrong_datasystem-0.8.0-cp310-cp310-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for openyuanrong_datasystem-0.8.0-cp310-cp310-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 7d943345565a104d3e3459f9eccddc5ca30246eb5e71e79e3e4bfd431eead335
MD5 297102a818da1d7c916ff4b5077c0c65
BLAKE2b-256 bff4188d931d7d5662fd0cedfdd38f735d00e221d02ba760a05979cc9ddacb9f

See more details on using hashes here.

File details

Details for the file openyuanrong_datasystem-0.8.0-cp39-cp39-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for openyuanrong_datasystem-0.8.0-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 bc0bb5cccaaa17d446b1f930518491bb10755b1263b38bfca3c5b1e2d0a7fc07
MD5 7472a323ed95f9e6b86b8fa274e781a3
BLAKE2b-256 b6a5234f695dcdf59d12cd383ab775c764d5655588e2640193a7d58a96af7c0a

See more details on using hashes here.

File details

Details for the file openyuanrong_datasystem-0.8.0-cp39-cp39-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for openyuanrong_datasystem-0.8.0-cp39-cp39-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 ff757b6b142607852f5bfbf87ed47e16bc20c7ec00a5efa4ae7fe2f2a738a8ee
MD5 7e7dc195d9707defc4b83b37c67830b3
BLAKE2b-256 ad3e038d65e1bcd8fa8e72384ad61c08e6a1b8dfe3f49d07f2b63a38d9f6d4c8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page