一、传统 Serverless 的痛点在传统的 Serverless 架构中运行时通常采用独立进程或容器化的部署方式。这种模式存在以下问题1. 架构复杂2. 通信开销大3. 运维门槛高二、openYuanrong 的设计理念2. 核心优势零通信开销函数调用直接在进程内完成无需序列化/反序列化无进程间通信IPC简化运维无需管理独立的运行时进程SDK 随用户程序一起启动和停止资源由用户进程统一管理部署简单Python 部署步骤我的系统是Ubuntu 24.04 的 Python 是系统管理的安装了# 1. 激活 conda 环境source~/miniconda/etc/profile.d/conda.sh conda activate yr查看 Python 版本python3--version安装 openYuanrongpip install https://openyuanrong.obs.cn-southwest-2.myhuaweicloud.com/release/0.7.0/linux/x86_64/openyuanrong-0.7.0-cp311-cp311-manylinux_2_34_x86_64.whl验证 yr 命令 yr version 查看 Python SDK 路径 python-cimport yr; import os; print(os.path.dirname(yr.__file__))C 部署步骤查看 C SDK 结构ls-la/home/test/miniconda/envs/yr/lib/python3.11/site-packages/yr/inner/runtime/sdk/cpp/创建项目目录mkdir-p~/cpp_democd~/cpp_demo创建 CMakeLists.txt和创建 main.cppcatCMakeLists.txtEOF cmake_minimum_required(VERSION 3.10) project(cpp_demo) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # openYuanrong SDK 路径 set(YR_INSTALL_PATH /home/test/miniconda/envs/yr/lib/python3.11/site-packages/yr/inner/runtime/sdk/cpp) include_directories(${YR_INSTALL_PATH}/include) link_directories(${YR_INSTALL_PATH}/lib) set(CMAKE_INSTALL_RPATH ${YR_INSTALL_PATH}/lib) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) add_executable(demo main.cpp) target_link_libraries(demo yr-api functionsdk datasystem litebus) EOFcatmain.cppEOF #include iostream #include yr/yr.h int main() { std::cout openYuanrong C Demo std::endl; YR::Config conf; conf.mode YR::Config::LOCAL_MODE; YR::Init(conf); std::cout openYuanrong initialized successfully! std::endl; YR::Finalize(); std::cout Demo completed! std::endl; return 0; } EOF# 编译mkdir-pbuildcdbuild cmake..make# 运行exportLD_LIBRARY_PATH/home/test/miniconda/envs/yr/lib/python3.11/site-packages/yr/inner/runtime/sdk/cpp/lib:$LD_LIBRARY_PATH./demo运行成功输出Java SDK 部署教程# 查看 Java SDK 文件ls-la/home/test/miniconda/envs/yr/lib/python3.11/site-packages/yr/inner/runtime/sdk/java/# 创建 Java 项目mkdir-p~/java_democd~/java_demo# 创建 Java 源文件mkdir-psrc/main/java/democatsrc/main/java/demo/Demo.javaEOF package demo; import org.yuanrong.YR; import org.yuanrong.Config; public class Demo { public static void main(String[] args) { System.out.println(openYuanrong Java Demo); // 配置本地模式 Config config new Config(); config.setMode(Config.Mode.LOCAL_MODE); // 初始化 YR.init(config); System.out.println(openYuanrong initialized successfully!); // 清理 YR.finalize(); System.out.println(Demo completed!); } } EOF我这里用的nano你们用linux也可以# 设置 SDK 路径SDK_PATH/home/test/miniconda/envs/yr/lib/python3.11/site-packages/yr/inner/runtime/sdk/java# 编译javac-cp$SDK_PATH/yr-api-sdk-0.7.0.jar:$SDK_PATH/faas-function-sdk-0.7.0.jar\src/main/java/demo/Demo.java# 运行java-cp$SDK_PATH/yr-api-sdk-0.7.0.jar:$SDK_PATH/faas-function-sdk-0.7.0.jar:src/main/java demo.Demo三种语言 SDK 对比特性Python SDKC SDKJava SDK形式Python 模块 .so 库头文件 动态库JAR 包大小约 100MB97MB15MB安装方式pip installCMake 链接Maven 依赖初始化yr.init()YR::Init()YR.init()openYuanrong 拓扑感知调度提升函数运行时性能一、什么是拓扑感知调度1. NUMA 架构基础现代多核服务器通常采用 NUMANon-Uniform Memory Access 架构即非统一内存访问架构。核心特点每个 NUMA 节点有自己的本地内存访问本地内存速度快跨 NUMA 访问内存速度慢延迟高 2-3 倍2. 拓扑层级openYuanrong 支持多级拓扑感知3. 为什么需要拓扑感知调度问题场景二、openYuanrong 的拓扑感知调度层级说明示例NodeNUMA 节点node0, node1SocketCPU 插槽socket0, socket1Core物理核心core0 - core19L1/L2/L3 Cache缓存层级共享或独立1. 调度亲和性 APIopenYuanrong 提供了丰富的调度亲和性 APIfrom yr.affinityimport(Affinity, AffinityKind, AffinityType, AffinityScope, LabelOperator, OperatorType)亲和性类型类型说明使用场景PREFERRED优先满足尽量调度到指定节点REQUIRED必须满足必须调度到指定节点PREFERRED_ANTI优先避开尽量避开指定节点REQUIRED_ANTI必须避开必须避开指定节点亲和性作用域作用域说明PODPOD 级别实例亲和NODENODE 级别实例亲和2. 使用示例示例 1优先调度到特定 NUMA 节点importyr from yr.affinityimport(Affinity, AffinityKind, AffinityType, LabelOperator, OperatorType)# 初始化yr.init()# 创建拓扑亲和性affinityAffinity(affinity_kindAffinityKind.RESOURCE,affinity_typeAffinityType.PREFERRED,label_operators[LabelOperator(OperatorType.LABEL_IN,numa_node,[node0])])# 定义分布式函数yr.invoke(affinities[affinity])def compute(data):returndata *2# 调用resultcompute.invoke(10)valueyr.get(result)print(fResult: {value})# 清理yr.finalize()结果示例 2必须调度到有 GPU 的节点importyr from yr.affinityimport(Affinity, AffinityKind, AffinityType, LabelOperator, OperatorType)yr.init()# 标签存在gpugpu_affinityAffinity(affinity_kindAffinityKind.RESOURCE,affinity_typeAffinityType.REQUIRED,label_operators[LabelOperator(OperatorType.LABEL_EXISTS,gpu,[])])yr.invoke(affinities[gpu_affinity])def gpu_compute(data):# GPU 计算任务returnprocess_on_gpu(data)运行结果示例 3实例亲和函数间通信优化importyr from yr.affinityimport(Affinity, AffinityKind, AffinityType, LabelOperator, OperatorType, AffinityScope)yr.init()# 让多个函数实例运行在同一节点减少网络通信instance_affinityAffinity(affinity_kindAffinityKind.INSTANCE,affinity_typeAffinityType.PREFERRED,label_operators[LabelOperator(OperatorType.LABEL_EXISTS,same_node,[])],affinity_scopeAffinityScope.NODE)yr.invoke(affinities[instance_affinity])def process(data):returndata这个是三个示例的全部结果。python affinity_demo.py → Result: 20 python gpu_affinity_demo.py → Result: 20 python instance_affinity_demo.py → Result: 20总结多语言运行时独立部署openYuanrong 的多语言运行时独立部署方案通过库集成的设计理念有效解决了传统 Serverless 架构的痛点对比项传统 ServerlessopenYuanrong架构复杂度多进程协作单进程集成通信开销IPC 序列化零开销运维门槛高需管理运行时低SDK 随程序启动冷启动延迟毫秒~秒级微秒级部署方式容器/VM库依赖核心优势零通信开销 - 函数调用直接在进程内完成无需序列化/反序列化简化运维 - SDK 随用户程序一起启动和停止无需管理独立进程多语言支持 - Python、C、Java 三种 SDK满足不同开发需求轻量部署 - Python 约 100MB、C 97MB、Java 仅 15MB这种设计特别适合高性能计算HPC需要低延迟的函数调用边缘计算资源受限需要轻量级部署企业应用希望简化运维复杂度的场景拓扑感知调度openYuanrong 的拓扑感知调度功能通过感知底层硬件拓扑结构智能地将函数调度到最优的计算节点优化点效果减少跨 NUMA 内存访问降低内存延迟提升缓存命中率提高计算效率减少网络通信降低函数间调用延迟核心特性多级拓扑感知 - 支持 Node、Socket、NUMA node 等层级灵活的亲和性配置 - PREFERRED/REQUIRED/PREFERRED_ANTI/REQUIRED_ANTI 四种类型多种作用域 - 支持 POD 级别和 NODE 级别实例亲和多语言 API - Python 和 C 均提供完整的调度亲和性 API适用场景场景推荐配置HPC 高性能计算绑定到特定 NUMA 节点REQUIREDAI 推理调度到有 GPU 的节点REQUIRED LABEL_EXISTS大数据处理函数和数据在同一节点INSTANCE NODE 作用域微服务服务间频繁通信部署在同一节点INSTANCE PREFERRED这对于 HPC 高性能计算、AI 推理、大数据处理 等场景尤为重要可以显著提升函数运行时性能
openYuanrong:多语言运行时独立部署以库集成简化 Serverless 架构 拓扑感知调度:提升函数运行时性能
一、传统 Serverless 的痛点在传统的 Serverless 架构中运行时通常采用独立进程或容器化的部署方式。这种模式存在以下问题1. 架构复杂2. 通信开销大3. 运维门槛高二、openYuanrong 的设计理念2. 核心优势零通信开销函数调用直接在进程内完成无需序列化/反序列化无进程间通信IPC简化运维无需管理独立的运行时进程SDK 随用户程序一起启动和停止资源由用户进程统一管理部署简单Python 部署步骤我的系统是Ubuntu 24.04 的 Python 是系统管理的安装了# 1. 激活 conda 环境source~/miniconda/etc/profile.d/conda.sh conda activate yr查看 Python 版本python3--version安装 openYuanrongpip install https://openyuanrong.obs.cn-southwest-2.myhuaweicloud.com/release/0.7.0/linux/x86_64/openyuanrong-0.7.0-cp311-cp311-manylinux_2_34_x86_64.whl验证 yr 命令 yr version 查看 Python SDK 路径 python-cimport yr; import os; print(os.path.dirname(yr.__file__))C 部署步骤查看 C SDK 结构ls-la/home/test/miniconda/envs/yr/lib/python3.11/site-packages/yr/inner/runtime/sdk/cpp/创建项目目录mkdir-p~/cpp_democd~/cpp_demo创建 CMakeLists.txt和创建 main.cppcatCMakeLists.txtEOF cmake_minimum_required(VERSION 3.10) project(cpp_demo) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # openYuanrong SDK 路径 set(YR_INSTALL_PATH /home/test/miniconda/envs/yr/lib/python3.11/site-packages/yr/inner/runtime/sdk/cpp) include_directories(${YR_INSTALL_PATH}/include) link_directories(${YR_INSTALL_PATH}/lib) set(CMAKE_INSTALL_RPATH ${YR_INSTALL_PATH}/lib) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) add_executable(demo main.cpp) target_link_libraries(demo yr-api functionsdk datasystem litebus) EOFcatmain.cppEOF #include iostream #include yr/yr.h int main() { std::cout openYuanrong C Demo std::endl; YR::Config conf; conf.mode YR::Config::LOCAL_MODE; YR::Init(conf); std::cout openYuanrong initialized successfully! std::endl; YR::Finalize(); std::cout Demo completed! std::endl; return 0; } EOF# 编译mkdir-pbuildcdbuild cmake..make# 运行exportLD_LIBRARY_PATH/home/test/miniconda/envs/yr/lib/python3.11/site-packages/yr/inner/runtime/sdk/cpp/lib:$LD_LIBRARY_PATH./demo运行成功输出Java SDK 部署教程# 查看 Java SDK 文件ls-la/home/test/miniconda/envs/yr/lib/python3.11/site-packages/yr/inner/runtime/sdk/java/# 创建 Java 项目mkdir-p~/java_democd~/java_demo# 创建 Java 源文件mkdir-psrc/main/java/democatsrc/main/java/demo/Demo.javaEOF package demo; import org.yuanrong.YR; import org.yuanrong.Config; public class Demo { public static void main(String[] args) { System.out.println(openYuanrong Java Demo); // 配置本地模式 Config config new Config(); config.setMode(Config.Mode.LOCAL_MODE); // 初始化 YR.init(config); System.out.println(openYuanrong initialized successfully!); // 清理 YR.finalize(); System.out.println(Demo completed!); } } EOF我这里用的nano你们用linux也可以# 设置 SDK 路径SDK_PATH/home/test/miniconda/envs/yr/lib/python3.11/site-packages/yr/inner/runtime/sdk/java# 编译javac-cp$SDK_PATH/yr-api-sdk-0.7.0.jar:$SDK_PATH/faas-function-sdk-0.7.0.jar\src/main/java/demo/Demo.java# 运行java-cp$SDK_PATH/yr-api-sdk-0.7.0.jar:$SDK_PATH/faas-function-sdk-0.7.0.jar:src/main/java demo.Demo三种语言 SDK 对比特性Python SDKC SDKJava SDK形式Python 模块 .so 库头文件 动态库JAR 包大小约 100MB97MB15MB安装方式pip installCMake 链接Maven 依赖初始化yr.init()YR::Init()YR.init()openYuanrong 拓扑感知调度提升函数运行时性能一、什么是拓扑感知调度1. NUMA 架构基础现代多核服务器通常采用 NUMANon-Uniform Memory Access 架构即非统一内存访问架构。核心特点每个 NUMA 节点有自己的本地内存访问本地内存速度快跨 NUMA 访问内存速度慢延迟高 2-3 倍2. 拓扑层级openYuanrong 支持多级拓扑感知3. 为什么需要拓扑感知调度问题场景二、openYuanrong 的拓扑感知调度层级说明示例NodeNUMA 节点node0, node1SocketCPU 插槽socket0, socket1Core物理核心core0 - core19L1/L2/L3 Cache缓存层级共享或独立1. 调度亲和性 APIopenYuanrong 提供了丰富的调度亲和性 APIfrom yr.affinityimport(Affinity, AffinityKind, AffinityType, AffinityScope, LabelOperator, OperatorType)亲和性类型类型说明使用场景PREFERRED优先满足尽量调度到指定节点REQUIRED必须满足必须调度到指定节点PREFERRED_ANTI优先避开尽量避开指定节点REQUIRED_ANTI必须避开必须避开指定节点亲和性作用域作用域说明PODPOD 级别实例亲和NODENODE 级别实例亲和2. 使用示例示例 1优先调度到特定 NUMA 节点importyr from yr.affinityimport(Affinity, AffinityKind, AffinityType, LabelOperator, OperatorType)# 初始化yr.init()# 创建拓扑亲和性affinityAffinity(affinity_kindAffinityKind.RESOURCE,affinity_typeAffinityType.PREFERRED,label_operators[LabelOperator(OperatorType.LABEL_IN,numa_node,[node0])])# 定义分布式函数yr.invoke(affinities[affinity])def compute(data):returndata *2# 调用resultcompute.invoke(10)valueyr.get(result)print(fResult: {value})# 清理yr.finalize()结果示例 2必须调度到有 GPU 的节点importyr from yr.affinityimport(Affinity, AffinityKind, AffinityType, LabelOperator, OperatorType)yr.init()# 标签存在gpugpu_affinityAffinity(affinity_kindAffinityKind.RESOURCE,affinity_typeAffinityType.REQUIRED,label_operators[LabelOperator(OperatorType.LABEL_EXISTS,gpu,[])])yr.invoke(affinities[gpu_affinity])def gpu_compute(data):# GPU 计算任务returnprocess_on_gpu(data)运行结果示例 3实例亲和函数间通信优化importyr from yr.affinityimport(Affinity, AffinityKind, AffinityType, LabelOperator, OperatorType, AffinityScope)yr.init()# 让多个函数实例运行在同一节点减少网络通信instance_affinityAffinity(affinity_kindAffinityKind.INSTANCE,affinity_typeAffinityType.PREFERRED,label_operators[LabelOperator(OperatorType.LABEL_EXISTS,same_node,[])],affinity_scopeAffinityScope.NODE)yr.invoke(affinities[instance_affinity])def process(data):returndata这个是三个示例的全部结果。python affinity_demo.py → Result: 20 python gpu_affinity_demo.py → Result: 20 python instance_affinity_demo.py → Result: 20总结多语言运行时独立部署openYuanrong 的多语言运行时独立部署方案通过库集成的设计理念有效解决了传统 Serverless 架构的痛点对比项传统 ServerlessopenYuanrong架构复杂度多进程协作单进程集成通信开销IPC 序列化零开销运维门槛高需管理运行时低SDK 随程序启动冷启动延迟毫秒~秒级微秒级部署方式容器/VM库依赖核心优势零通信开销 - 函数调用直接在进程内完成无需序列化/反序列化简化运维 - SDK 随用户程序一起启动和停止无需管理独立进程多语言支持 - Python、C、Java 三种 SDK满足不同开发需求轻量部署 - Python 约 100MB、C 97MB、Java 仅 15MB这种设计特别适合高性能计算HPC需要低延迟的函数调用边缘计算资源受限需要轻量级部署企业应用希望简化运维复杂度的场景拓扑感知调度openYuanrong 的拓扑感知调度功能通过感知底层硬件拓扑结构智能地将函数调度到最优的计算节点优化点效果减少跨 NUMA 内存访问降低内存延迟提升缓存命中率提高计算效率减少网络通信降低函数间调用延迟核心特性多级拓扑感知 - 支持 Node、Socket、NUMA node 等层级灵活的亲和性配置 - PREFERRED/REQUIRED/PREFERRED_ANTI/REQUIRED_ANTI 四种类型多种作用域 - 支持 POD 级别和 NODE 级别实例亲和多语言 API - Python 和 C 均提供完整的调度亲和性 API适用场景场景推荐配置HPC 高性能计算绑定到特定 NUMA 节点REQUIREDAI 推理调度到有 GPU 的节点REQUIRED LABEL_EXISTS大数据处理函数和数据在同一节点INSTANCE NODE 作用域微服务服务间频繁通信部署在同一节点INSTANCE PREFERRED这对于 HPC 高性能计算、AI 推理、大数据处理 等场景尤为重要可以显著提升函数运行时性能