Skip to content

feat: embedding service support rdma arpc#830

Open
JINGE-ui wants to merge 1 commit into
alibaba:mainfrom
JINGE-ui:feat/rdma_arpc
Open

feat: embedding service support rdma arpc#830
JINGE-ui wants to merge 1 commit into
alibaba:mainfrom
JINGE-ui:feat/rdma_arpc

Conversation

@JINGE-ui
Copy link
Copy Markdown
Collaborator

为embedding service arpc增加 rdma arpc选择

@JINGE-ui JINGE-ui requested a review from LLLLKKKK as a code owner March 25, 2026 06:20
@LLLLKKKK
Copy link
Copy Markdown
Collaborator

🤖 AI Code Review — PR #830 feat: embedding service support rdma arpc

概述

为 embedding service 的 ARPC 通信层增加 RDMA 传输模式选择。将 ArpcServerWrapper 重构为抽象基类,派生 AnetArpcServerWrapper(TCP)和 RdmaArpcServerWrapper(RDMA),通过 --embedding_arpc_rdma_mode 配置项在运行时选择传输模式。

优点

  • 重构结构清晰,策略模式拆分合理,基类虚析构函数正确
  • 配置传递链路完整:命令行参数 → EmbeddingConfigEngineConfig → C++ 层
  • 命令行参数风格与项目一致(str2boolenv_namebind_to

建议改进

P1 - 重要

  1. RdmaArpcServerWrapper 是纯占位实现,用户启用后直接 crash
    RdmaArpcServerWrapper::start() 直接 throw std::runtime_error。用户设置 --embedding_arpc_rdma_mode=true 后服务启动即异常退出。建议:

    • 实现 RDMA server 逻辑,或在创建前做前置检查给出清晰错误提示
    • 如果是分阶段提交,PR description 中应明确标注为 skeleton PR
  2. 缺少测试覆盖
    重构引入了继承体系但没有测试。至少需要:

    • AnetArpcServerWrapper 基本构造/start/stop 测试(验证重构未破坏原有功能)
    • 配置传递端到端测试(embedding_arpc_rdma_mode 从参数到 C++ 层)
  3. BUILD 文件可能缺少 RDMA 依赖
    RdmaArpcServerWrapper.h include 了 aios/network/rdma/arpc/RdmaRPCServer.h,但 embedding_engine_arpc_server_header target 的 deps 中未添加 RDMA 相关依赖,可能导致编译失败。

P2 - 建议

  1. RdmaArpcServerWrapper 持有未使用的 arpc_server_ 成员
    start()/stop() 直接 throw,std::unique_ptr<arpc::RdmaRPCServer> arpc_server_ 完全未使用。建议等实际实现时再声明,避免不必要的头文件依赖。

P3 - Nit

  1. 文件末尾缺少换行符
    AnetArpcServerWrapper.hRdmaArpcServerWrapper.hRdmaArpcServerWrapper.ccArpcServerWrapper.h 均缺少末尾换行符。

总结

架构重构方向正确,策略模式为后续 RDMA 支持做好了准备。主要风险是 RDMA 实现为空壳(用户误启用会 crash)、BUILD 依赖可能不完整、缺少测试。建议补充实现或明确标注 skeleton,并添加基本测试。

@LLLLKKKK
Copy link
Copy Markdown
Collaborator

🤖 AI Code Review — PR #830 (增量 v2)

概述

v2(17fbfbe963da)是 force-push 重写,但与 v1(9369fa8100a5)的 diff 内容完全相同,无实质性改动。v1 提出的 3 个 P1 问题均未修复。

优点

  • 架构设计清晰:将 ArpcServerWrapper 重构为抽象基类 + 策略子类,为 RDMA 支持做好了扩展准备
  • 配置传递链路完整:从命令行参数 → EmbeddingConfigEngineConfig → C++ pybind 层,链路清晰
  • 虚析构函数、unique_ptr 多态使用正确

建议改进

P1 - 重要(与 v1 相同,均未修复)

  1. RdmaArpcServerWrapper 是纯占位实现,用户启用后直接 crash
    RdmaArpcServerWrapper::start() 直接 throw std::runtime_error("rdma arpc mode not supported")。用户设置 --embedding_arpc_rdma_mode=true 后服务启动即异常退出。建议实现实际逻辑,或在创建前做前置检查给出清晰提示,或在 PR description 中明确标注为 skeleton PR。

  2. 缺少测试覆盖
    重构引入了继承体系但没有任何测试。至少需要:AnetArpcServerWrapper 的 start/stop 测试、RdmaArpcServerWrapper 的异常行为测试、配置端到端传递测试。

  3. BUILD 文件缺少 RDMA 依赖
    RdmaArpcServerWrapper.h#include "aios/network/rdma/arpc/RdmaRPCServer.h",但 BUILD 的 embedding_engine_arpc_server_header target 的 deps 中没有 RDMA 相关依赖,会导致编译失败。

P2 - 建议

  1. RdmaArpcServerWrapper 持有未使用的 arpc_server_ 成员start()/stop() 直接 throw,std::unique_ptr<arpc::RdmaRPCServer> arpc_server_ 完全未使用但引入了头文件依赖。建议等实际实现时再添加。

总结

v2 无实质性改动,3 个 P1 问题仍然存在。建议优先解决 BUILD 依赖(否则 CI 编译必定失败)和测试覆盖,并明确 RDMA 实现的完成计划。

@LLLLKKKK
Copy link
Copy Markdown
Collaborator

🤖 AI Code Review — PR #830 v3 (feat: embedding service support rdma arpc)

v3 rebase + 新增 EmbeddingConfig 到 EngineConfig。v2 的 3 个 P1(RDMA wrapper 空壳、缺少测试、BUILD 缺依赖)需确认是否在内源代码中修复。

Conditional LGTM — EmbeddingConfig 添加正确。

Review by Claude | Commit: 3899aba

@LLLLKKKK
Copy link
Copy Markdown
Collaborator

🤖 AI Code Review — PR #830

PR 概述

Title: feat: embedding service support rdma arpc
Author: JINGE-ui
规模: 11(GitHub) + 8(内源) files, ~+200/-50

核心目标

为 embedding service 的 ARPC 通信添加 RDMA 模式选择:将 ArpcServerWrapper 重构为抽象基类,新增 AnetArpcServerWrapper 子类,通过工厂函数按配置选择实现。


改动逻辑拆解

1. ArpcServerWrapper 抽象化

  • ArpcServerWrapper.h:改为抽象基类(纯虚 start/stop),成员 protected
  • AnetArpcServerWrapper.h/cc:新增子类,实现原有 ANet 逻辑

2. 工厂函数

  • createArpcServerWrapper(arpc_rdma_mode, ...):开源版 RDMA 抛异常,内源版提供真实实现

3. 配置传播

  • EmbeddingConfig.embedding_arpc_rdma_mode(默认 false)→ EngineConfigRtpEmbeddingOp

Review 意见

问题

  1. 缺少 AnetArpcServerWrapper 单元测试 [P2]
    重构拆分了基类 + 子类,但无对应测试验证 start/stop 行为不变。

  2. 开源版 RDMA 运行时抛异常无编译时检查 [P3]
    建议在配置解析阶段 warning。

整体评价

干净的重构,抽象基类 + 工厂模式为 RDMA 预留扩展点。配置传播完整,开源版正确 stub 了 RDMA 路径。

LGTM ready to ci

@JINGE-ui JINGE-ui force-pushed the feat/rdma_arpc branch 2 times, most recently from 45a1630 to 6e626e5 Compare March 27, 2026 10:10
@LLLLKKKK
Copy link
Copy Markdown
Collaborator

🤖 AI Code Review — PR #830

PR 概述

Title: feat: embedding service support rdma arpc
Author: JINGE-ui
规模: 11(GitHub) + 8(内源) files, +111/-33 (GitHub), +122/-13 (内源)
Review 类型: 检测到 force push/rebase,本次为 PR 全量 review(第 3 次)

核心目标

为 embedding service 的 ARPC 服务端增加 RDMA 传输模式支持。通过将原有的 ArpcServerWrapper 重构为抽象基类,派生出 AnetArpcServerWrapper(原有 ANet 传输)和 RdmaArpcServerWrapper(RDMA 传输),并通过工厂函数 createArpcServerWrapper 根据配置选择实现。配置通过新增 embedding_arpc_rdma_mode 参数从 Python 层传递到 C++ 层。


改动逻辑拆解

GitHub 开源仓库变更(主要代码)

1. C++ ARPC 抽象层重构

  • ArpcServerWrapper.h:从具体类重构为抽象基类,start()/stop() 改为纯虚函数,成员从 private 改为 protected,移除 ANet 特有成员,新增虚析构函数
  • AnetArpcServerWrapper.h(新增):继承 ArpcServerWrapper,持有 ANet 特有成员
  • AnetArpcServerWrapper.cc(从 ArpcServerWrapper.cc 重命名):实现不变,仅类名更新
  • ArpcServiceCreator.h/cc:新增工厂函数 createArpcServerWrapper(),开源版本在 arpc_rdma_mode=true 时抛异常

2. Python 配置层

  • py_config_modules.pyEmbeddingConfig 新增 embedding_arpc_rdma_mode: bool = False
  • engine_config.pyEngineConfig 新增 embedding_config 字段,create() 方法传递该配置
  • embedding_group_args.py:新增 --embedding_arpc_rdma_mode 命令行参数

3. Pybind 调用层

  • RtpEmbeddingOp.cc/h:从 engine_config.embedding_config 读取 arpc_rdma_mode,改用工厂函数替代直接构造

内源仓库变更

1. RDMA 实现

  • RdmaArpcServerWrapper.h/cc(新增):使用 arpc::RdmaRPCServer 实现 RDMA 传输
  • ArpcServiceCreator.cc(内源覆盖):工厂函数根据模式返回对应实现

2. 测试

  • MainseTestArpcClient:新增 rdma_mode 参数,支持 RDMA channel manager
  • Smoke 测试:传递 rdma_mode 参数

Checklist 检查结果

通用原则

软件工程原则

检查项 结果
SRP ✅ 每个类职责单一
OCP ✅ 新增 RDMA 通过新子类实现
LSP ✅ 子类遵守基类契约
ISP ✅ 接口精简
DIP ✅ 依赖抽象基类
DRY
KISS
YAGNI

架构审视

检查项 结果
抽象边界
依赖方向
状态完整性
错误语义 ❌ 见 P2-1
可观测性
可演进性
可运维性

测试 — 全部 ✅

代码质量与文档 — 全部 ✅

领域检查

  • A. 兼容性与配置 — 全部 ✅
  • B. 正确性与逻辑 — ❌ 见 P2-1
  • C~I — 全部 ✅

Review 意见

问题

  1. RdmaArpcServerWrapper::start() 中 Init() 失败后继续执行 [P2]

    内源 RdmaArpcServerWrapper.cc

    if (!arpc_server_->Init()) {
        RTP_LLM_LOG_ERROR("init rdma arpc server failed");
    }
    // 继续执行 Listen()...

    Init() 失败时仅打印 ERROR 日志,但继续执行 Listen()。虽然 Listen() 大概率也会失败并被 RTP_LLM_CHECK_WITH_INFO 捕获,但 fail-fast 语义更清晰。

    建议: 改为 RTP_LLM_CHECK_WITH_INFO(arpc_server_->Init(), "init rdma arpc server failed"),与 AnetArpcServerWrapper::start() 风格一致。

  2. RdmaArpcServerWrapper.cc 多余分号 [P3]

    serverConfig.rdmaIoThreadNum = autil::EnvUtil::getEnv("ARPC_SERVER_RDMA_IO_THREAD_NUM", ioThreadNum_);;

    行末有两个分号 ;;,应删除一个。

  3. RDMA 配置使用环境变量 [P3]

    rdmaIoThreadNumrdmaWorkerThreadNum 通过环境变量读取。当前有合理默认值可接受,后续可考虑统一到 ArpcConfig

小问题

  • Smoke 测试中 self.qr_info.get("rdma_mode", None) == True:安全但不够 Pythonic,建议 bool(self.qr_info.get("rdma_mode", False))

整体评价

设计清晰、范围明确的 PR。通过经典的抽象基类+工厂模式为 embedding ARPC 服务端引入 RDMA 传输支持,开源/内源分层合理,配置传播链完整,测试已覆盖。

P0 和 P1 均为 0。✅ LGTM ready to ci — 当前 review 未发现阻塞级或重要级问题,可进入 CI 验证和合入流程;P2/P3 建议后续改进但不阻塞。

@JINGE-ui JINGE-ui force-pushed the feat/rdma_arpc branch 2 times, most recently from 1f891a1 to e05e4e5 Compare April 9, 2026 09:27
@LLLLKKKK
Copy link
Copy Markdown
Collaborator

LLLLKKKK commented Apr 9, 2026

🤖 AI Code Review (incremental) — PR #830
Head SHA: e05e4e5220fc | Previous: 6e626e59da31 | Verdict: LGTM

Changes since last review

Single new commit e05e4e5220fc ("feat: support rawstring") — adds arpc_rdma_mode parameter to createEmbeddingArpcService signature in both .cc and .h, and passes it through from RtpEmbeddingOp.cc. Pure parameter plumbing consistent with the existing RDMA mode threading.

Findings

No issues. The change is mechanical, default parameter value false is correct, and the open-source stub behavior is unchanged.

@LLLLKKKK
Copy link
Copy Markdown
Collaborator

🤖 AI Code Review — PR #830

PR 概述

Title: feat: embedding service support rdma arpc
Author: JINGE-ui
规模: 11(GitHub) + 15(内源) files, +117/-36 (GitHub)

为 embedding service 的 ARPC 通信层增加 RDMA 模式支持。将 ArpcServerWrapper 重构为抽象基类,派生 AnetArpcServerWrapper(TCP)和 RdmaArpcServerWrapper(RDMA),通过工厂函数按配置选择实现。Proto 新增 raw_data 字段实现 RDMA 零拷贝 tensor 序列化。


Review 意见

问题

  1. RDMA 路径缺少测试覆盖 [P1]
    新增的 RDMA ARPC 通信路径(RdmaArpcServerWrapperTensorInfoUtils RawString 序列化/反序列化)没有任何专门的单元测试或 smoke 测试。建议为 TensorInfoUtils 的 RawString 路径添加 UT(至少覆盖各 dtype 的 round-trip)。

  2. tensorInfoToTorchTensorWithRawStringfrom_blob 的内存生命周期风险 [P1]
    torch::from_blob(dataPtr, tensor_shape, options) 创建的 tensor 不拥有底层内存,内存由 tensor_info.raw_data() 的 RawString 持有。如果 protobuf request 对象在 tensor 使用期间被释放,会导致 use-after-free。需确认调用链中 request 生命周期覆盖整个计算过程,否则应改为 .clone()

  3. RdmaArpcServerWrapper::start() Init 失败静默返回 [P1]
    arpc_server_->Init() 失败时仅 LOG_ERROR 后 return,调用方不知道失败。对比 AnetArpcServerWrapper::start() 使用 RTP_LLM_CHECK_WITH_INFO 会直接 abort,两个实现的错误处理策略不一致。建议与 ANet 路径保持一致,Init 失败时抛异常或使用 RTP_LLM_CHECK_WITH_INFO

  4. engine_config.py 中 hasattr 控制流 [P2]
    EmbeddingConfig 始终定义了 to_string() 方法,hasattr 检查无意义。建议直接调用。

  5. RDMA 环境变量隐式配置 [P2]
    ARPC_SERVER_RDMA_IO_THREAD_NUMARPC_SERVER_RDMA_WORKER_THREAD_NUM 未通过标准命令行参数链路。

  6. DRY 违反:MainseTestArpcClient channel 初始化重复 [P2]
    sendDecodeRequestsendEmbeddingRequest 中 RDMA/ANet channel manager 初始化逻辑完全重复,建议提取为辅助方法。

  7. DRY 违反:TensorInfoUtils dtype switch 重复 [P2]
    RawString 路径与标准路径的 dtype switch 高度重复,建议提取统一的 dtype 映射函数。


亮点

  • ArpcServerWrapper 抽象化 + 工厂模式的架构设计合理,扩展性好
  • 配置传播链路完整:命令行参数 → EmbeddingConfig → EngineConfig → pybind → C++ 工厂函数
  • 开源 stub 正确处理 RDMA 不可用场景

结论

存在 3 个 P1 问题(测试缺失、内存生命周期风险、错误处理不一致),不建议合入。

@LLLLKKKK
Copy link
Copy Markdown
Collaborator

AI Code Review — PR #830

Summary: P0/0 · P1/0 · P2/0 · P3/0

Review status: LGTM

lgtm ready to ci

Strengths

  • Clean refactoring of ArpcServerWrapper into abstract base + concrete AnetArpcServerWrapper with proper virtual destructor
  • Factory pattern (createArpcServerWrapper) cleanly separates open-source TCP path from internal RDMA path
  • Config plumbing is complete end-to-end: CLI arg → EmbeddingConfig → EngineConfig → C++ startRpcServer → factory

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants