Mooncake 鲲鹏 Kunpeng UB 传输层(Unified Bus Transport)构建与使用指南

发布时间:2026/10/6 18:39:35

Mooncake 鲲鹏 Kunpeng UB 传输层(Unified Bus Transport)构建与使用指南 人工智能大模型模型推理服务后端【免费下载链接】MooncakeMooncake is the serving platform for Kimi, a leading LLM service provided by Moonshot AI.项目地址https://gitcode.com/gh_mirrors/mo/Mooncake点击查看免费下载导读本文面向希望在鲲鹏 950Kunpeng 950平台上为 Mooncake 启用 UBUnified Bus统一总线传输能力的开发者完整介绍基于 URMAUnified Remote Memory Access与 OBMMOwnership Based Memory Management两种 UB 协议实现的 Kunpeng UB Transport从新增依赖、CMake 构建开关、注册验证到单节点/多设备基准测试与源码级原理剖析。读完本文你将能够独立在 openEuler 24.03LTS-SP3上编译出带ub协议支持的 Mooncake并在真实或 Mock URMA 设备上运行传输引擎基准测试与单元测试。一、背景UB 协议与 URMA / OBMMKunpeng UB Transport 的源码位于mooncake-transfer-engine/src/transport/kunpeng_transport源码目录实际命名为kunpeng_transport内部包含针对 UB 协议的 Transport 对接代码与实现逻辑相关实现细节可对照 ub_transport.cpp 与 ub_transport.h。UBUnified Bus统一总线是与 RDMA、CXL、NVLink 和 TCP 处于同一抽象层的传输协议属于可在应用层灵活选择的一类传输方案。目前 UB 协议有两个开源实现URMAUnified Remote Memory Access统一远程内存访问UB 协议为上层应用提供的统一编程抽象与核心语义层。它基于 UB 协议低延迟、高带宽的底层特性为远程共享内存的访问与操作提供统一的 API 和语义接口。URMA 的开源项目为 openEuler 社区的 UMDK。OBMMOwnership Based Memory Management面向超节点环境的内核内存管理系统支持跨节点的物理内存共享。系统通过内核模块obmm.ko和用户态库libobmm.so提供高效的远程内存访问能力。OBMM 的开源项目为 openEuler 社区的 obmm。在 Mooncake 的代码中这两种端点类型被定义为枚举UB_ENDPOINT_TYPE { URMA_ENDPOINT 0, OBMM_ENDPOINT 1 }见 ub_transport.hUbTransport构造函数默认采用URMA_ENDPOINT。二、新增依赖与前置条件Kunpeng UbTransport 在 Mooncake 本身依赖的基础上新增了部分 URMA 和 OBMM 相关依赖要点如下依赖类别要求硬件平台支持原生 UB 互联架构的鲲鹏 950 CPUOS 版本openEuler 24.03LTS-SP3URMA 依赖UMDKyum install umdk-urma-devel或从 UMDK 源码构建安装协议优势URMA 提供类似 RDMA 的内存语义并针对鲲鹏芯片片上互联进行了专门优化URMA 的 UMDK 安装方式有两种等价路径# 方式一yum 直接安装开发包 yum install umdk-urma-devel # 方式二从源码构建 git clone https://atomgit.com/openeuler/umdk.git cd umdk mkdir build cd build cmake .. make -j$(nproc) sudo make install构建 Mooncake 本体所需的常规编译依赖CMake、glog、jsoncpp、numa、gtest、pybind11 等与此前一致。另外仓库通过 FindUrma.cmake 自动探测系统是否已安装 UMDK优先在/usr/include、/usr/local/include及其子路径下查找urma_api.h并在/usr/lib、/usr/lib64等路径下查找liburma.so若系统未安装则会通过 FetchContent 拉取 UMDK 源码仅提供头文件此时真实的 UB 后端在运行期不可用测试环境会注入自己的适配层。三、构建与编译3.1 前置条件openEuler 24.03LTS-SP3操作系统已安装 UMDKyum install umdk-urma-devel或已从源码构建安装满足urma_api.h头文件与liburma.so库可用即可。3.2 CMake 配置与编译# 克隆 Mooncake 仓库并初始化子模块 git clone https://github.com/kvcache-ai/Mooncake.git cd Mooncake git submodule update --init --recursive # 启用 UB 传输层进行配置 mkdir build cd build cmake .. -DUSE_UBON \ -DURMA_INCLUDE_DIR/usr/include \ -DURMA_LIBRARY/usr/lib64/liburma.so \ -DCMAKE_BUILD_TYPERelWithDebInfo # 编译 make -j$(nproc)编译选项说明-DUSE_UBON总开关。在 src/transport/CMakeLists.txt 中只有USE_UB为 ON 时才会把kunpeng_transport子目录编入并链接ub_transport对象库-DURMA_INCLUDE_DIRURMA 头文件目录默认探测值为/usr/include-DURMA_LIBRARYliburma.so的完整路径。该值会被 kunpeng_transport/CMakeLists.txt 读取若找到真实库则编译ub_transport时链接真实 URMA 库若未找到则编译时加入urma/mock_urma.cppMock 实现用于无真实硬件环境下的测试CMake 会打印Not Found liburma.so building ub_transport with Mock URMA library警告。3.3 验证 UB 传输层注册# 检查 UB 传输层是否已注册 ./mooncake_server --list-transports # 预期输出: rdma, tcp, nvlink, ubUbTransport::getName()返回字符串ub见 ub_transport.h因此它会在传输层列表中以上述名字呈现。3.4 Python 侧验证可选构建完 Python 绑定后也可以用 TransferEngine 直接初始化ub协议from mooncake.engine import TransferEngine te TransferEngine() result te.initialize(127.0.0.1, P2PHANDSHAKE, ub, ) print(fInitialize result: {result}) # 预期为 0初始化成功后日志应包含类似内容URMA module init success found 1 devices. device_name : urma0 EID : 01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10四、源码视角UbTransport 的组成与工作流程4.1 类层次与核心组件UB 传输层的源码设计围绕三个层次展开对应 urma_endpoint.h 中的类定义组件职责UbTransport传输层主类负责管理 URMA 资源与端点、内存注册、提交传输、查询状态UbContext子类UrmaContext每个设备一个上下文负责设备打开、上下文/JFC/JFR 等资源创建与销毁、内存区注册、事件轮询UbEndPoint子类UrmaEndpoint每个远端连接一个端点负责 jettyURMA 通信队列创建、握手建连、实际的数据收发从源码结构看URMA 侧的实体对象对应关系为urma_contextURMA 设备上下文句柄urma_jfceJetty Factory for Completion Events完成事件队列UrmaContext::construct中按num_jfce_per_ctx创建urma_jfcJetty Factory for Completion发送完成队列num_jfc_per_ctx个每个深度为max_jfc_e默认 4096urma_jfr接收队列num_jfc_per_ctx个深度 2048传输模式URMA_TM_RCurma_jetty通信 jetty每个端点按num_jetty_per_ep默认 1创建采用 Reliable ConnectionRC模式。4.2 安装install流程UbTransport::install()见 ub_transport.cpp是传输层初始化的入口依次完成保存元数据TransferMetadata与本地拓扑Topology引用initializeUbResources()调用init()初始化 URMA 模块urma_init从拓扑中获取 HCA 设备列表若拓扑为空则回退到mock_urma_device用于测试逐个设备构建UrmaContext并调用doConstruct失败的设备会被disableDevice禁用若无任何可用设备则返回ERR_DEVICE_NOT_FOUNDallocateLocalSegmentID()以ub为协议名创建本地 SegmentDesc 并登记每个设备的名称与 EIDstartHandshakeDaemon()启动握手守护进程注册onSetupConnections回调用于被动接收远端建连请求updateLocalSegmentDesc()把本地段描述发布到元数据服务。4.3 内存注册与数据通路注册registerLocalMemory()对每个 context 调用registerMemoryRegion()与buildLocalBufferDesc()。URMA 实现urma_endpoint.cpp通过urma_register_seg注册内存段访问权限为URMA_ACCESS_READ | URMA_ACCESS_WRITE | URMA_ACCESS_ATOMICToken 策略为URMA_TOKEN_NONE注册长度受max_seg_size默认0x10000000000即 1 TiB约束。当注册名称为kWildcardLocation*时会自动通过getMemoryLocation探测内存位置并写入 BufferDesc提交submitTransfer()把批量请求挂到 BatchDesc 上submitTransferTask()按slice_size将请求切分为 Slice为每个 Slice 选择设备selectDevice按 buffer 地址范围与拓扑亲和性选择最终经submitPostSend下发到对应 context 的 worker 池完成worker 通过urma_poll_jfc轮询发送完成队列JFC成功的 Slice 调用markSuccess()失败含URMA_CR_WR_FLUSH_ERR的 Slice 交回上层做重试或失败处理urma_endpoint.cpp。五、运行与测试5.1 单节点基准测试利用mooncake-transfer-engine/example下的transfer_engine_bench其命令行参数定义见 transfer_engine_bench.cpp# 终端 1目标端Target ./transfer_engine_bench \ --modetarget \ --protocolub \ --device_nameurma0 \ --local_server_name127.0.0.1 \ --metadata_serverP2PHANDSHAKE # 终端 2发起端Initiator ./transfer_engine_bench \ --modeinitiator \ --protocolub \ --device_nameurma0 \ --metadata_serverP2PHANDSHAKE \ --segment_size8388608 \ --batch_size1 \ --segment_id127.0.0.1:$PORT参数含义--mode运行模式initiator或target发起端负责读写远端段目标端被动等待--protocolub选择 UB 传输协议。bench 程序中--protocolub分支会先通过拓扑discover({FLAGS_device_name})发现设备再以空参安装ub传输层见 transfer_engine_bench.cpp--device_nameurma0指定 URMA 设备名urma0,urma1,...逗号分隔即可启用多设备--metadata_serverP2PHANDSHAKE元数据服务地址P2PHANDSHAKE表示点对点握手模式无需 etcd也可使用etcd://...、redis://...等格式--segment_size8388608发起端申请的段大小8 MiB--batch_size每批传输任务数--segment_id127.0.0.1:$PORT目标段标识$PORT需替换为目标端实际监听端口。5.2 多设备基准测试自动发现多个 URMA 设备./transfer_engine_bench \ --protocolub \ --device_nameurma0,urma1,urma2,urma3多个设备名逗号分隔后会生成对应的 CPU/NIC 拓扑 JSON包含多个 device 的亲和矩阵使传输引擎能够按拓扑选择最优设备。5.3 单元测试UB 传输层单测位于 ub_transport_test.cpp构建后运行./build/mooncake-transfer-engine/tests/ub_transport_test测试套件包含两个核心用例测试描述MultiWrite多次10 轮写入操作每次 4 MB 数据校验提交与完成状态机MultipleRead多次读写操作并做数据完整性校验也可用 CTest 一次性运行全部单测cd build ctest --output-on-failure单测相关的环境变量export MC_METADATA_SERVERP2PHANDSHAKE # 默认值 export MC_LOCAL_SERVER_NAME127.0.0.1:12345 # 默认值需要注意的是单测在没有真实 URMA 硬件时会走 Mock 路径URMA_LIBRARY未找到时 CMake 会编译urma/mock_urma.cpp见 kunpeng_transport/CMakeLists.txt且拓扑为空时initializeUbResources会回退到mock_urma_device保证无硬件环境也能验证传输层逻辑。六、UB 相关配置参数UB 传输层在 config.h 中定义了一组专属调优参数参数默认值说明num_jfc_per_ctx2每个 context 的发送完成队列JFC数量num_jfce_per_ctx2每个 context 的完成事件队列JFCE数量eid_index0设备 EID 索引多 EID 设备时选择使用哪个 EIDmax_seg_size0x10000000000单个内存段注册的最大长度1 TiBmax_jfc_e4096JFC 队列深度URMA 侧当前使用该默认值num_jetty_per_ep1每个端点的 jetty通信队列数量其中num_jfc_per_ctx与num_jfce_per_ctx可通过环境变量MC_NUM_CQ_PER_CTX同时覆盖见 config.cppeid_index在 urma_endpoint.cpp 的openDevice中决定从设备 EID 列表中选择哪个 EID 创建 context若该 EID 对应的 GID 为空日志会提示 GID is NULL, please check your EID index。另外updateUrmaGlobalConfig会根据设备实际能力自动下调max_ep_per_ctx与num_jfc_per_ctx避免超出硬件容量urma_endpoint.h。七、常见问题排查现象排查方法UbTransport: No URMA devices found确认 URMA 已正确安装且设备可见ls /usr/lib64/liburma.so、检查头文件urma_api.h是否存在用urma_admin -l查看设备列表URMA module init failed确认 URMA 内核模块已加载sudo modprobe urma用sudo lsmod \| grep urma检查模块状态用urma_admin -l查看设备状态Device urma0 port not active确认 UB 端口已配置并激活urma_admin -p urma0cannot find -lurma确认liburma.so已安装且在库路径中export LD_LIBRARY_PATH/usr/lib64:$LD_LIBRARY_PATH结语Kunpeng UB Transport 为 Mooncake 在鲲鹏 950 CPU 平台上提供了一套与 RDMA 同层、针对片上互联优化的高速传输方案URMA 语义层负责远程内存访问的统一抽象OBMM 面向超节点内存共享场景二者都以UbTransport这一统一接口接入 Mooncake 传输引擎。通过本文的构建开关、验证命令、基准测试与源码级剖析开发者可以快速在 openEuler 24.03 鲲鹏 950 环境中启用ub协议并借助 Mock URMA 在无硬件环境下先行验证传输层逻辑后续可依据MC_NUM_CQ_PER_CTX等参数与设备能力进行调优以适配大规模参数传输与分布式训练等场景。赞分享人工智能大模型模型推理服务后端【免费下载链接】MooncakeMooncake is the serving platform for Kimi, a leading LLM service provided by Moonshot AI.项目地址https://gitcode.com/gh_mirrors/mo/Mooncake点击查看免费下载相关推荐Mooncake 鲲鹏 UB 传输Kunpeng UB Transport接入指南基于 URMA 的 Unified Bus 构建、配置与验证Mooncake 鲲鹏 UB 传输Kunpeng UB Transport接入指南基于 URMA 的 Unified Bus 构建、配置与验证 本文面向在人工智能大模型模型推理服务后端Mooncake FlagCX 传输Transport接入指南构建、启用与 tebench 连通性验证Mooncake FlagCX 传输Transport接入指南构建、启用与 tebench 连通性验证 本篇技术指南围绕 Mooncake 开源仓库中 d人工智能大模型模型推理服务后端Mooncake EFA Transport 实战指南基于 AWS EFA 与 libfabric 构建高速传输引擎Mooncake EFA Transport 实战指南基于 AWS EFA 与 libfabric 构建高速传输引擎 导读 本文聚焦 Mooncake 项目中人工智能大模型模型推理服务后端上一篇5分钟精通SSHFS-WinWindows远程文件挂载终极实战指南下一篇Tiled编辑器完全指南从零开始制作专业级游戏地图创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/6 18:34:35

数模混合芯片SDF反标实战:Cadence后仿时间对齐指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 18:34:35

SI9000阻抗计算完全指南:从安装调试到高速PCB设计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 19:44:39

多用户多仓库进销存系统源码解析:基于uniapp的跨端库存管理方案

跑进销存这条路的人都知道,真正的痛点从来不是“做一张入库单”或者“打一张出库单”,而是当公司有多个门店、多个仓,甚至多人同时操作时,数据到底怎么算得清。前阵子我拿到一套基于uniapp的多用户多仓库进销存管理系统源码&#…

2026/10/6 19:44:39

用OpenSSH与dotfiles打造标准化Shell环境:登录配置安全一键搞定

把一套散落在不同机器上的 Shell 环境,收拢成可复用、可迁移、可安全交付的标准化方案,这件事我琢磨了很久。OpenShell 这个名字听起来像是一个开源项目,其实它更像是我给自己定的一套“终端环境建设规则”:把 SSH 登录、dotfiles…

2026/10/6 19:44:39

C++自定义字面量高级用法:编译期单位换算与字符串解析

一提到C里的自定义字面量,很多人的第一反应是“哦,不就是operator""嘛,给数值加个后缀,看着挺酷,实际上用不上”。说实话,我早几年也是这个态度。直到有一次在系统里接测量模块,满屏的…

2026/10/6 19:44:39

华为云码道代码智能体实战:从零上手到代码检视与修复

1. 从零上手华为云码道代码智能体:一个后端老兵的真实踩坑记录 第一次听说华为云码道(CodeArts)代码智能体的时候,我正被一个祖传项目折磨得够呛。那是一个跑了快六年的老系统,代码里到处是复制粘贴留下的痕迹&#xf…

2026/10/6 19:39:38

Agent-Reach 实战:用 CLI 让 AI Agent 稳定触达外部世界

Agent-Reach 这个名字第一次看到的时候,我下意识以为是某个网络代理工具,后来翻了翻社区讨论和相关的技术标签,才反应过来它指向的是另一件事:让 AI Agent 真正"够得着"外部世界的那一层能力。CLI、Python、AI Agent 这…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑