Bailian gRPC 服务(predict_v2)与 gRPC 配置拆分#813
Conversation
|
🤖 AI Code Review — PR #813 (feat: add bailian predict_v2 gRPC frontend server) 概述新增 优点
建议改进P1 - 重要
P2 - 建议
P3 - Nit
总结功能完整的新模块,结构清晰。主要建议:清理 print 语句、复用 gRPC channel、补充 Python 单元测试。解决 P1 问题后可以合并。 |
|
🤖 AI Code Review — PR #813 Develop/bailian (incremental, commit 14691a0) 概述增量 review(969520b6 → 14691a0,2 commits "feat, fix bailian")。核心架构未变,上一轮 P1 问题均未修复。新发现一个 P0 破坏性变更。 优点
建议改进P0 - 破坏性变更
P1 - 重要(上一轮遗留,仍未修复)
P1 - 新发现
P2 - 建议
总结上一轮 4 个 P1 问题均未修复。新增 P0: |
|
🤖 AI Code Review — PR #813 — Develop/bailian (v3 incremental, commit 1e0f11f) 概述PR #813 新增 优点
建议改进P0 - 阻塞
P1 - 重要
P2 - 建议
总结新发现 P0 调试残留(硬编码个人路径覆盖测试输出目录),加上上一轮遗留的端口默认值破坏性变更,建议在合并前至少解决这两个 P0 和 P1 问题。 |
|
🤖 AI Code Review — PR #813 Develop/bailian (v4, commit 0f412ff) 概述新增 优点
建议改进P0 - 编译错误 / 阻塞
P1 - 重要
P2 - 建议
总结本轮新增 3 个 C++ 编译/逻辑错误(P0),加上上轮遗留 2 个 P0,共 5 个 P0 阻塞合并。C++ 编译错误表明变更未经本地编译验证。NOT LGTM — 建议修复所有 P0 后再请求 review。 |
|
🤖 AI Code Review — PR #813 Develop/bailian (v5, commit 45e4133) 概述新增 与 v4 对比v4 发现的 3 个 C++ 编译错误( 优点
建议改进P0 — 阻塞合并
P1 — 重要
P2 — 建议
总结相比 v4 修复了 3 个 C++ 编译错误,进展明显。仍有 2 个 P0 未修复(调试路径硬编码 + 端口默认值破坏性变更)。建议修复后再合并。 Verdict: NOT LGTM — 2 个 P0 阻塞合并 |
|
🤖 AI Code Review — PR #813 (Develop/bailian) v6 Reviewed commit: 遗留 P0(仍未修复,已连续 3 轮提出)
持续存在的问题
整体评价v6 与 v5 相比无实质性代码变更。2 个 P0 已连续 3 轮未修复,建议优先处理后再合并。 |
ea18b54 to
4034325
Compare
|
🤖 AI Code Review — PR #813 Develop/bailian (v7, incremental from b360fc8) 概述v7 对整个 PR 做了 squash rebase(单 commit 优点
建议改进P1 - 重要
P3 - Nit
总结v7 修复了 v6 的主要阻塞问题。代码质量有明显提升。剩余问题主要是端口变更需文档标注和建议添加 feature flag。 Verdict: Conditional LGTM — P1 需文档标注(端口变更),建议添加 feature flag |
|
🤖 AI Code Review — PR #813 Develop/bailian (v8, incremental from 4034325) 概述本轮增量(3 commits)修复了 v7 提出的 3 个 P1 中的 2 个:补充了 优点
v7 问题修复状态
建议改进P2 - 建议
总结LGTM — v7 的核心问题(文档缺失、测试缺失)均已修复,代码质量和文档质量都很高。剩余 P2(feature flag)建议后续迭代处理,不阻塞本次合并。 |
|
🤖 AI Code Review — PR #813 Develop/bailian (v9, commit 406d04b) 概述本轮增量(1 commit, ~40 行)改进 Bailian gRPC server 启动可靠性:启动同步(调用方阻塞等待 优点
建议改进P1 - 重要
P3 - Nit
总结启动同步机制实现正确,但 Verdict: 需要修改 — 1 个 P1 |
|
🤖 AI Code Review — PR #813 (Bailian gRPC 服务(predict_v2)与 gRPC 配置拆分) 增量 Review v10 — commit 889c6db (incremental from 406d04b) 增量变更概述本轮增量新增 变更文件(4 files, +105/-1)
Checklist 检查结果通用原则软件工程原则
架构审视
测试
代码质量与文档
领域检查
Review 意见问题
历史遗留问题(未在本轮修复)
改进亮点
整体评价本轮增量改动质量良好, 但 PR 整体仍有 2 个历史遗留 P1 未解决:(1) gRPC 无条件启动 + 失败 fatal;(2) gRPC channel per-request 创建。建议在合并前解决。 Verdict: 本轮增量 LGTM(无新增 P0/P1),但 PR 整体仍有 2 个历史遗留 P1 待解决 |
889c6db to
05946d4
Compare
|
🤖 AI Code Review — PR #813 PR 概述Title: 核心目标引入 Bailian predict_v2 方向的 Python gRPC 服务端/客户端,将 Model RPC(C++)与 Bailian(Python)的 gRPC 配置在命令行和代码层面拆分为独立参数,同时统一 C++ 侧流日志标签( 改动逻辑拆解GitHub 开源仓库变更(主要代码)1. C++ 配置层(ConfigModules / ConfigInit)
2. Python 配置与启动链路
3. Bailian gRPC 服务实现(新增
|
| 检查项 | 结果 |
|---|---|
| SRP | ✅ 各模块职责清晰:request 解析、response 构建、server 启动分离 |
| OCP | ✅ fake/real 双模式通过 backend_visitor 参数切换,不修改核心逻辑 |
| LSP | ✅ GrpcConfig / BailianGrpcConfig 继承 GrpcMapsConfig 契约一致 |
| ISP | ✅ |
| DIP | ✅ run_enqueue_sync 通过参数注入,便于测试 mock |
| DRY | ✅ parse_grpc_client_server_maps_json / append_grpc_maps_to_stream 复用 |
| KISS | ✅ |
| YAGNI | ✅ |
架构审视
| 检查项 | 结果 |
|---|---|
| 抽象边界 | ✅ Bailian gRPC 作为独立模块,通过 backend_visitor 接入主链路 |
| 依赖方向 | ✅ bailian → ops/config/utils,无循环依赖 |
| 状态完整性 | ❌ 见 P2-1:_bailian_grpc_server 全局单例无 shutdown/reset 机制 |
| 错误语义 | ✅ 启动失败 raise,enqueue 异常返回 error_message |
| 可观测性 | ✅ 日志充分,streamLogTag 统一 |
| 可演进性 | ✅ 配置独立,proto 标准 |
| 可运维性 | ❌ 见 P1-1:worker_info_port_num 默认值变更是破坏性变更 |
测试
| 检查项 | 结果 |
|---|---|
| 新功能有对应测试 | ✅ bailian_grpc_request_test(170 行)+ bailian_grpc_response_server_test(323 行)+ 内源 smoke 测试 |
| 删除的测试有等价替代 | ✅ 无删除 |
| 边界 case 覆盖 | ✅ 空 input_ids、raw mismatch、empty outputs、exception 路径均覆盖 |
| 分布式改动有多卡测试 | ✅ 端口布局变更不涉及分布式计算逻辑 |
代码质量与文档
| 检查项 | 结果 |
|---|---|
| 无关改动分离 | ❌ 见 P2-2:backend_rpc_server_visitor.py 纯格式化混入功能 PR |
| mega-PR 拆分 | ❌ 见 P2-3:PR 包含 5 个独立功能方向,建议拆分 |
| Commit 原子性 | ✅ 单 commit,虽大但自包含 |
| Commit message 准确性 | ✅ |
| PR description 说明动机和设计 | ✅ 非常详细,含迁移说明和破坏性更文档 |
| 日志频率控制 | ✅ Bailian gRPC 日志均为 DEBUG 级别 |
领域检查
A. 兼容性与配置
| 检查项 | 结果 |
|---|---|
| 环境变量/参数重命名有兼容 fallback(1.1) | ❌ 见 P1-1:worker_info_port_num 默认值 8→9 无 deprecation warning |
| 默认值变更已评估影响(1.2) | ✅ PR description 详细说明了影响范围和迁移方案 |
| 新增配置字段传播至所有变体(1.12) | ✅ BailianGrpcConfig 在 PyEnvConfigs / EngineConfig / pybind 均传播 |
| 可选依赖 lazy import(1.32) | ✅ grpcio 在 _run_bailian_grpc_server_startup 中 lazy import |
B. 正确性与逻辑
| 检查项 | 结果 |
|---|---|
| 逻辑错误 / off-by-one | ✅ |
| 边界 case | ✅ |
| 死代码 / 不可达分支(1.7) | ✅ |
| 状态标志生命周期(1.16) | ❌ 见 P2-1:_bailian_grpc_server 全局变量只 set 不 reset |
C. 线程安全与并发
| 检查项 | 结果 |
|---|---|
| 静态/全局状态 atomic(1.10) | ❌ 见 P2-4:_enqueue_loop 全局变量无锁保护 |
| TOCTOU 竞态(1.10) | ✅ _get_async_loop 有 lock 保护 |
D. 性能 — 全部 ✅
E. 分布式 — 全部 ✅
F. 跨平台(ROCm/ARM) — 全部 ✅
G. 语言与框架特有
| 检查项 | 结果 |
|---|---|
| Python 变量安全(1.8) | ✅ |
| Python 重命名全局搜索(1.17) | ✅ init_grpc_group_args → init_model_grpc_group_args 已更新所有消费者 |
| gRPC channel 复用(1.40) | ✅ 客户端是 CLI 工具,per-run 创建 channel 合理 |
| 环境变量滥用(1.36) | ✅ 新增参数走 --bailian_grpc_config_json 命令行 |
H. 测试与 CI — 全部 ✅
I. 代码质量 — 全部 ✅
Review 意见
问题
-
worker_info_port_num默认值 8→9 缺少运行时 deprecation warning [P1]
虽然 PR description 和文档详细说明了破坏性变更,但代码层面没有任何运行时提示。多 rank 分布式部署如果未显式设置该参数,升级后 rank>=1 的端口会静默偏移,可能导致服务发现失败。
建议:在server_group_args.py解析后或ServerConfig初始化时,如果worker_info_port_num使用默认值且tp_size > 1或rank_id > 0,打印一条 WARNING 日志提示默认值已变更。或者在启动日志中始终打印当前worker_info_port_num值和端口布局。
位置:rtp_llm/server/server_args/server_group_args.py、rtp_llm/config/py_config_modules.py -
_bailian_grpc_server全局单例无 shutdown/reset 机制 [P2]
bailian_grpc_server.py中_bailian_grpc_server全局变量只在start_bailian_grpc_server中赋值,没有stop_bailian_grpc_server或 reset 路径。虽然当前场景下进程退出即清理,但如果未来需要 graceful shutdown(如shutdown_timeout场景),缺少server.stop(grace)调用。
建议:添加stop_bailian_grpc_server(grace=None)函数,在frontend_appshutdown 时调用。
位置:rtp_llm/bailian/bailian_grpc_server.py:151-187 -
backend_rpc_server_visitor.py纯格式化混入功能 PR [P2]
该文件的改动全部是空白行调整和 import 合并,与 Bailian gRPC 功能无关。按 review patterns 1.4,格式化改动应与功能改动分离。
建议:后续 PR 中分离纯格式化改动。 -
PR 包含多个独立功能方向 [P2]
本 PR 同时包含:(1) Bailian gRPC 服务实现 (2) gRPC 配置拆分 (3)worker_info_port_num默认值变更 (4) C++streamLogTag()日志统一 (5)/liveness端点。其中 (3)(4)(5) 可独立 PR。
建议:当前 PR 已较成熟,不强制要求拆分,但后续类似规模的改动建议拆分。 -
_enqueue_loop全局变量无锁保护 [P2]
set_bailian_grpc_enqueue_event_loop写入_enqueue_loop,_run_enqueue_sync读取它,两者在不同线程执行。Python GIL 在 CPython 下保证了引用赋值的原子性,实际不会出问题,但从代码规范角度,建议使用threading.Lock或至少添加注释说明依赖 GIL 保证。
位置:rtp_llm/bailian/bailian_grpc_server.py:53-68 -
parse_optional_root_int_json正则不支持负数 [P3]
ConfigModules.cc中parse_optional_root_int_json的正则(\\d+)只匹配正整数。虽然当前max_server_pollers和max_server_workers不会为负,但作为通用解析函数,建议改为(-?\\d+)。
位置:rtp_llm/cpp/config/ConfigModules.cc:401-409 -
_run_enqueue_sync无超时保护 [P3]
asyncio.run_coroutine_threadsafe(collect(), loop).result()无 timeout 参数,如果 backend enqueue hang,gRPC worker thread 会永久阻塞。
建议:添加合理的 timeout(如max_rpc_timeout_ms对齐),超时后返回 error_message。
位置:rtp_llm/bailian/bailian_grpc_server.py:113
小问题
bailian_grpc_client.py:297默认--grpc_addr为127.0.0.1:8608,但按默认端口布局 rank0 的 Bailian gRPC 端口应为8088+8=8096,建议修正默认值或在 help 中说明。bailian_start.sh使用find递归搜索config.json,在大目录树下可能较慢,建议限制maxdepth。
整体评价
PR 整体质量较高,架构设计清晰(fake/real 双模式、配置拆分、lazy import),文档和测试覆盖充分。破坏性变更(worker_info_port_num 8→9)在 PR description 中有详细说明和迁移指南,但缺少运行时 warning 是主要风险点。C++ 侧 streamLogTag() 统一是有价值的改进。
❌ 存在阻塞/重要问题(P1-1:worker_info_port_num 默认值变更缺少运行时 deprecation warning,多 rank 部署可能静默故障)
Bailian gRPC 服务(predict_v2)
本文档对应变更说明(
feat: bailian grpc server)。摘要
引入 Bailian predict_v2 方向的 Python gRPC 服务端与客户端:补齐 proto、生成脚本与 Bazel 目标,并把 Model RPC(C++) 与 Bailian(Python) 的 gRPC 通道/服务端参数在配置与命令行上拆开,同时在引擎侧统一部分流日志标签,便于排查。
主要变更
1. Bailian gRPC(
rtp_llm/bailian/)proto/BUILD,以及通过generate_proto_py/create_grpc_proto.py生成 Python 桩的流程(含link_py_proto.sh等辅助脚本)。bailian_grpc_server.py、请求解析bailian_grpc_request.py、真实/占位响应bailian_grpc_response_{real,fake}.py、客户端bailian_grpc_client.py与grpc_client_run.sh。bailian_grpc_request_test单测与顶层rtp_llm打包/BUILD 调整,便于随 wheel/依赖分发。2. C++ 配置与 Pybind(
ConfigModules/ConfigInit)GrpcMapsConfig(client_config/server_config映射),GrpcConfig在其上增加max_server_pollers(同步服务端 completion queue poller)。BailianGrpcConfig,包含 Bailian Python 侧max_server_workers(ThreadPoolExecutor规模)及相同的 maps 解析。ConfigInit.cc等 pybind 中暴露/初始化上述配置,与 Python 侧默认值对齐。3. 服务端参数与启动链路(
grpc_group_args/server_args/frontend_app)init_model_grpc_group_args,--grpc_config_json/GRPC_CONFIG_JSON,默认含max_server_pollers(常量默认 4)。init_bailian_grpc_group_args,--bailian_grpc_config_json/BAILIAN_GRPC_CONFIG_JSON,在 Model 默认基础上增加max_server_workers(默认 4)。server_args/server_group_args/engine_config/backend_rpc_server_visitor等,使启动与后端访问使用正确的配置对象。frontend_app.py增加与 Bailian gRPC 相关的启动/依赖提示(如 proto 生成说明)。4. 引擎与日志(C++)
GenerateStream等路径补充/统一streamLogTag()一类日志标识,并在 BatchDecode / FIFO / Normal / MTP 等调度与流处理处改用该标签,减少仅打streamId时的排查成本。5 破坏性变更:
worker_info_port_num默认值 8 → 9--worker_info_port_num/WORKER_INFO_PORT_NUM的默认值由 8 调整为 9(server_group_args.py、py_config_modules.MIN_WORKER_INFO_PORT_NUM)。每台 worker 的端口基址为
start_port + rank_id * worker_info_port_num,其下再挂 RPC、HTTP、Bailian gRPC(base + 8) 等固定偏移。start_port,与旧版一致。rank ≥ 1的基址会从start_port + 8k变为start_port + 9k,各服务端口语会与旧版错位,需更新服务发现、防火墙或运维文档。--worker_info_port_num 8(须自行确认是否与 Bailian gRPC 等端口占用冲突)。6. 其他
.gitignore、bazel/tf_proto.bzl、rtp_llm/server/BUILD、RtpLLMOp/RtpEmbeddingOp等与构建或注册相关的微调。deepep_test.py等小修复。配置与迁移说明
--grpc_config_json/GRPC_CONFIG_JSONmax_server_pollers控制 C++ 同步服务端 poller(默认由代码注入为 4)。--bailian_grpc_config_json/BAILIAN_GRPC_CONFIG_JSONmax_server_workers对应 Pythongrpc服务端ThreadPoolExecutor规模。若旧文档或脚本仍只描述「一套 gRPC JSON」,需改为按 Model / Bailian 两套参数分别配置。
测试建议
bazel test //rtp_llm/bailian:bailian_grpc_request_test(及本变更涉及的rtp_llm相关 target)。Proto 生成(开发)
在仓库根目录执行:
需已安装
grpcio-tools。生成物位于rtp_llm/bailian/proto/。