| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
支持Nodemanager原生拉起引擎,解除Engine Server层依赖 Co-authored-by: tobking<wangjun292@huawei.com> # message auto-generated for no-merge-commit merge: !698 merge feat/pr2-native-engine-routing into master 支持Nodemanager原生拉起引擎,解除Engine Server层依赖 Created-by: tobking Commit-by: tobking Merged-by: towncharlie Description: ## **1. 合入背景** > 请描述为什么要做这个PR内的改动。\ > 如涉及,请关联前序PR或同特性/需求下的其他PR。\ > 如果是修复之前PR引入的问题,请关联引入问题的PR。\ > 请通过#ISSUE ID关联issue。\ > 注意: Fixes #ISSUE ID会自动关闭issue,如问题部分解决请不要使用Fixes,可以用Fix part of #ISSUE ID替代. **当前Motor侵入式修改引擎侧API SERVER,会导致引擎版本变更时,不兼容变更。且Coordinator组件无法支持独立部署。** [#394](https://gitcode.com/Ascend/MindIE-Motor/issues/394) ## **2. 修改内容** > 请<ins>**描述修改内容的具体实现**</ins>,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列。 > 如果是需求或者重构类的PR,需要<ins>**补充详细设计文档**</ins>(说明上下游组件关系、时序图、类图、DFX能力等内容)。 1. NodeManager 不再拉起Engine Server, 直接通过原生指令拉起引擎; 2. Engine server中vllm \sglang adapter 上移到coordinator中; 3. Coordinator直连原生引擎做PD调度; 4. 虚推、容器快照相关逻辑上移到nodemanager,心跳和健康检查改为引擎0原生状态查询(health); 当前PR未删除Engine Server代码,后续单独PR统一删除冗余代码 ## **3. 资料变更** > 请确认<ins>**是否涉及资料变更**</ins>。\ > 如涉及,需要在PR中体现,并简要说明修改内容。\ > 如不涉及,需填写“不涉及”。 涉及 ## **4. 接口变更** > 请确认<ins>**是否涉及跨代码仓或者客户面可见的接口变更**</ins>。\ > 如涉及,需详细说明接口以及对应的变更内容,同时需要在资料中体现。\ > 如不涉及,需填写“不涉及”。 不涉及 ## **5. 测试结果** > 需体现<ins>**测试场景,测试方法以及测试结果**</ins>。\ > 测试用例设计时需考虑硬件、部署方式、功能、性能、精度、显存等维度。 ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [x] 代码注释完备 [x] 正确记录维测日志 [x] 是否有UT用例 [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 [引擎原生拉起验证报告](https://wiki.huawei.com/domains/114540/wiki/411410/WIKI2026081412302804) See merge request: Ascend/MindIE-Motor!698 | 1 个月前 | |
[Feature] 推理大EP场景下支持DP域缩容运行 Co-authored-by: yilunh<hanyilun1@huawei.com> Co-authored-by: Jechin<yuzechen1@huawei.com> # message auto-generated for no-merge-commit merge: !964 merge scaledown into master [Feature] 推理大EP场景下支持DP域缩容运行 Created-by: yilunh Commit-by: yilunh;Jechin Merged-by: towncharlie Description: ## **1. 合入背景** MoE/EP 推理实例中部分 DP rank 因 NPU、网络或引擎故障失效时,现网主要走隔离实例后的引擎重拉起、Pod 重调度或 Scale P2D。单 rank 死亡也会扰动全部健康 Pod,恢复偏慢。 本 PR 在 **引擎 FT + external-lb + EPLB 冗余专家** 等条件满足时,由 Controller 编排 **DP 域缩容**:只移除权威故障原始 DP rank,存活 rank 重建通信域后继续服务,实际缩容可行性由引擎在 apply 后做最终可执行判断。 Fixes [#575](https://gitcode.com/Ascend/MindIE-Motor/issues/575) ## **2. 修改内容** 领域与策略: - motor/controller/fault_tolerance/dp_scale_down.py(新增) - motor/controller/fault_tolerance/serving_overlay.py(新增) - motor/controller/fault_tolerance/pod_lifecycle.py(新增) - motor/controller/fault_tolerance/strategy/dp_scale_down.py(新增) - motor/controller/fault_tolerance/strategy/fast_recovery.py - motor/controller/fault_tolerance/strategy/reconfiguration.py - motor/controller/fault_tolerance/strategy/engine_relaunch.py - motor/controller/fault_tolerance/strategy/strategy.py - motor/controller/fault_tolerance/fault_manager.py - motor/controller/fault_tolerance/fault_types.py - motor/controller/fault_tolerance/mixin/persistence.py 控制面衔接: - motor/controller/core/instance_manager.py - motor/controller/core/event_pusher.py - motor/controller/core/instance_assembler.py - motor/controller/api_server/controller_api.py - motor/controller/api_client/node_manager_api_client.py - motor/controller/controller.py NodeManager: - motor/node_manager/api_server/node_manager_api.py - motor/node_manager/core/engine_ft_manager.py(新增) - motor/node_manager/core/fault_reporter.py - motor/node_manager/core/heartbeat_manager.py - motor/node_manager/core/register_manager.py - motor/node_manager/core/daemon.py 公共与配置: - motor/common/http/engine_ft_client.py - motor/common/resources/instance.py - motor/common/resources/http_msg_spec.py - motor/common/constants.py - motor/config/controller.py - motor/config/node_manager.py - examples/features/config_sample.json - docs/zh/user_guide/configuration/config_reference.md - .agents/skills/motor-dev/references/controller.md - .agents/skills/motor-dev/references/nodeman.md **FaultManager**:当前仅占位,is_applicable() 为 false 时,有 DEAD 或可映射硬件候选则进 DpScaleDownStrategy;仅 UNHEALTHY 且无权威候选时不猜 rank、不启动 30 秒 apply-ready 计时器,等待后续 DEAD / 硬件候选或故障清除事件;其他不能缩容的故障走原 fallback。硬件 L4–L6 可映射时推迟 separate_instance。失败绑定进入缩容前的 fallback_strategy,不重复本轮缩容。抢占时同时等 is_finished() 与执行器 Future。 异步策略完成时,FaultManager 先结算完成结果并清理上一轮软件故障,再构建下一轮恢复计划,避免残留 survivor UNHEALTHY 把已提交的 SCALED_DOWN_RUNNING 覆盖回 WAITING_ENGINE_FAULT。 **DpScaleDownStrategy**:门禁 → 按完整 NM 拓扑分组 → guard(request_id, lease) → 等到 survivor UNHEALTHY 且无 ft_state(引擎 id 必须等于全局 DP rank)→ ServingOverlay.withdraw → 一次 scale_down apply → 轮询至全部 HEALTHY → finalize(commit) → 可选 stop_recyclable_pods → publish。finally 未 commit 则 finalize(abort);NM 拒绝 stale request_id。 **ServingOverlay / EventPusher / InstanceManager**:权威拓扑不变;Coordinator 只看到过滤后的 endpoint。缩容事务中抑制 partial-loss shutdown;SCALED_DOWN_RUNNING 心跳允许且仅允许 dead_committed 缺失。 **FtRuntimeStore**:进程内原子状态;etcd 开启时只持久 phase/original_dp_ranks/dead_committed/fallback_strategy。中断事务恢复为 RECONFIGURING,不重放 apply。连续缩容由累计 dead_committed 表达,不设置人工轮数上限;旧快照中的 generation 被忽略。实例删除时同步删除对应 runtime;同 Job 的最新替代实例 Ready 后清理旧 instance id 的 runtime,删除结果同步持久化。 **NodeManager**:enable_dp_scale_down_proxy 由 Controller 的 enable_fault_tolerance && enable_dp_scale_down 派生,客户不单独配。四条 FT 路由;guard/finalize 带事务 id。commit 后 retired ranks 从心跳、EngineFtManager 轮询和进程死亡上报中过滤。EngineFtManager 仅在引擎 readiness 成功后启动,运行期首次 status 请求失败即上报 DEAD;遗留 max_poll_failures 当前不参与判定。 **FtGate**:校验引擎 FT、external-lb、scale_down_supported、auto recovery 冲突、enable_eplb 与 eplb_config.num_redundant_experts > 0。不再校验 additional_config.enable_fused_mc2,也不引入私有「可删 DP 预算」;apply 后由引擎对算子兼容性和真实专家槽位做最终判断。 **查询**:GET /controller/fault_tolerance/status;开关关闭返回 DISABLED。接口只返回当前生命周期内的 runtime:活动重配置状态保持可观察,已删除或已被 Ready 新实例替代的旧实例状态不再残留。 ## **3. 资料变更** - 更新 examples/features/config_sample.json 与配置参考,说明缩容/扩容控制项统一位于 Controller 的 fault_tolerance_config。 - 更新 Controller、NodeManager 开发参考,记录 FT runtime、服务视图投影、NM proxy、guard/finalize、retired endpoint 过滤及测试入口。 - RFC 补充状态机、事务一致性窗口、失败语义、REST 状态示例和 E2E 验收矩阵。 ## **4. 接口变更** 新增客户面可见配置开关 json "fault_tolerance_config": { "enable_fault_tolerance": true, "enable_dp_scale_down": false, "enable_dp_scale_up": false, "dp_scale_down_config": { "request_timeout_sec": 5.0, "poll_interval_sec": 1.0, "execution_deadline_sec": 30.0 } } NodeManager 的代理开关由上述两项派生,不必在 NM 配置里再写一份。 enable_dp_scale_up 是暂定内部名称。本 PR 中它只控制“缩容成功后是否允许 stop 已收空 Pod、交给集群补充资源”,不代表 Motor 已实现 DP rank 扩容事务。 | 类型 | 变化 | 开关关闭时行为 | |---|---|---| | Controller REST | 新增 GET /controller/fault_tolerance/status[?instance_id=] | 返回 phase=DISABLED,不进入缩容编排 | | NodeManager REST | 新增 POST /node-manager/fault-tolerance/status | proxy 未派生启用时返回 404 | | NodeManager REST | 新增 POST /node-manager/fault-tolerance/apply | proxy 未派生启用时返回 404 | | NodeManager REST | 新增 POST /node-manager/fault-tolerance/guard | proxy 未派生启用时返回 404,不冻结 suicide | | NodeManager REST | 新增 POST /node-manager/fault-tolerance/finalize | proxy 未派生启用时返回 404,不维护 retired endpoint | | NodeManager 注册 | 注册信息携带 ft_capability,包括引擎是否支持 scale_down 及静态门禁能力 | 不驱动缩容逻辑 | | 实例组装 | 同一实例各 Pod 的 FT capability 必须一致;缺失或不一致时失败封闭 | 不影响未开启缩容的既有服务路径 | | 内部配置 | enable_dp_scale_down_proxy = enable_fault_tolerance && enable_dp_scale_down | 客户无需单独配置;结果为 false | ## **5. 测试结果** Kill worker_dp1  Curl四个dp的status,由healthy变unhealthy  dp3同步hccl状态后也变成unhealthy,检测到dead+unhealthy之后触发dp缩容,NM下发apply:  缩容结束,健康rank的status状态变为healthy,   推理恢复正常  精度正常  缩容状态查询,由SCALING_DOWN更新为SCALED_DOWN_RUNNING  ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [ ] 代码注释完备 [ ] 正确记录维测日志 [ ] 是否有UT用例 [ ] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-Motor!964 | 27 天前 | |
[Feature] 推理大EP场景下支持DP域缩容运行 Co-authored-by: yilunh<hanyilun1@huawei.com> Co-authored-by: Jechin<yuzechen1@huawei.com> # message auto-generated for no-merge-commit merge: !964 merge scaledown into master [Feature] 推理大EP场景下支持DP域缩容运行 Created-by: yilunh Commit-by: yilunh;Jechin Merged-by: towncharlie Description: ## **1. 合入背景** MoE/EP 推理实例中部分 DP rank 因 NPU、网络或引擎故障失效时,现网主要走隔离实例后的引擎重拉起、Pod 重调度或 Scale P2D。单 rank 死亡也会扰动全部健康 Pod,恢复偏慢。 本 PR 在 **引擎 FT + external-lb + EPLB 冗余专家** 等条件满足时,由 Controller 编排 **DP 域缩容**:只移除权威故障原始 DP rank,存活 rank 重建通信域后继续服务,实际缩容可行性由引擎在 apply 后做最终可执行判断。 Fixes [#575](https://gitcode.com/Ascend/MindIE-Motor/issues/575) ## **2. 修改内容** 领域与策略: - motor/controller/fault_tolerance/dp_scale_down.py(新增) - motor/controller/fault_tolerance/serving_overlay.py(新增) - motor/controller/fault_tolerance/pod_lifecycle.py(新增) - motor/controller/fault_tolerance/strategy/dp_scale_down.py(新增) - motor/controller/fault_tolerance/strategy/fast_recovery.py - motor/controller/fault_tolerance/strategy/reconfiguration.py - motor/controller/fault_tolerance/strategy/engine_relaunch.py - motor/controller/fault_tolerance/strategy/strategy.py - motor/controller/fault_tolerance/fault_manager.py - motor/controller/fault_tolerance/fault_types.py - motor/controller/fault_tolerance/mixin/persistence.py 控制面衔接: - motor/controller/core/instance_manager.py - motor/controller/core/event_pusher.py - motor/controller/core/instance_assembler.py - motor/controller/api_server/controller_api.py - motor/controller/api_client/node_manager_api_client.py - motor/controller/controller.py NodeManager: - motor/node_manager/api_server/node_manager_api.py - motor/node_manager/core/engine_ft_manager.py(新增) - motor/node_manager/core/fault_reporter.py - motor/node_manager/core/heartbeat_manager.py - motor/node_manager/core/register_manager.py - motor/node_manager/core/daemon.py 公共与配置: - motor/common/http/engine_ft_client.py - motor/common/resources/instance.py - motor/common/resources/http_msg_spec.py - motor/common/constants.py - motor/config/controller.py - motor/config/node_manager.py - examples/features/config_sample.json - docs/zh/user_guide/configuration/config_reference.md - .agents/skills/motor-dev/references/controller.md - .agents/skills/motor-dev/references/nodeman.md **FaultManager**:当前仅占位,is_applicable() 为 false 时,有 DEAD 或可映射硬件候选则进 DpScaleDownStrategy;仅 UNHEALTHY 且无权威候选时不猜 rank、不启动 30 秒 apply-ready 计时器,等待后续 DEAD / 硬件候选或故障清除事件;其他不能缩容的故障走原 fallback。硬件 L4–L6 可映射时推迟 separate_instance。失败绑定进入缩容前的 fallback_strategy,不重复本轮缩容。抢占时同时等 is_finished() 与执行器 Future。 异步策略完成时,FaultManager 先结算完成结果并清理上一轮软件故障,再构建下一轮恢复计划,避免残留 survivor UNHEALTHY 把已提交的 SCALED_DOWN_RUNNING 覆盖回 WAITING_ENGINE_FAULT。 **DpScaleDownStrategy**:门禁 → 按完整 NM 拓扑分组 → guard(request_id, lease) → 等到 survivor UNHEALTHY 且无 ft_state(引擎 id 必须等于全局 DP rank)→ ServingOverlay.withdraw → 一次 scale_down apply → 轮询至全部 HEALTHY → finalize(commit) → 可选 stop_recyclable_pods → publish。finally 未 commit 则 finalize(abort);NM 拒绝 stale request_id。 **ServingOverlay / EventPusher / InstanceManager**:权威拓扑不变;Coordinator 只看到过滤后的 endpoint。缩容事务中抑制 partial-loss shutdown;SCALED_DOWN_RUNNING 心跳允许且仅允许 dead_committed 缺失。 **FtRuntimeStore**:进程内原子状态;etcd 开启时只持久 phase/original_dp_ranks/dead_committed/fallback_strategy。中断事务恢复为 RECONFIGURING,不重放 apply。连续缩容由累计 dead_committed 表达,不设置人工轮数上限;旧快照中的 generation 被忽略。实例删除时同步删除对应 runtime;同 Job 的最新替代实例 Ready 后清理旧 instance id 的 runtime,删除结果同步持久化。 **NodeManager**:enable_dp_scale_down_proxy 由 Controller 的 enable_fault_tolerance && enable_dp_scale_down 派生,客户不单独配。四条 FT 路由;guard/finalize 带事务 id。commit 后 retired ranks 从心跳、EngineFtManager 轮询和进程死亡上报中过滤。EngineFtManager 仅在引擎 readiness 成功后启动,运行期首次 status 请求失败即上报 DEAD;遗留 max_poll_failures 当前不参与判定。 **FtGate**:校验引擎 FT、external-lb、scale_down_supported、auto recovery 冲突、enable_eplb 与 eplb_config.num_redundant_experts > 0。不再校验 additional_config.enable_fused_mc2,也不引入私有「可删 DP 预算」;apply 后由引擎对算子兼容性和真实专家槽位做最终判断。 **查询**:GET /controller/fault_tolerance/status;开关关闭返回 DISABLED。接口只返回当前生命周期内的 runtime:活动重配置状态保持可观察,已删除或已被 Ready 新实例替代的旧实例状态不再残留。 ## **3. 资料变更** - 更新 examples/features/config_sample.json 与配置参考,说明缩容/扩容控制项统一位于 Controller 的 fault_tolerance_config。 - 更新 Controller、NodeManager 开发参考,记录 FT runtime、服务视图投影、NM proxy、guard/finalize、retired endpoint 过滤及测试入口。 - RFC 补充状态机、事务一致性窗口、失败语义、REST 状态示例和 E2E 验收矩阵。 ## **4. 接口变更** 新增客户面可见配置开关 json "fault_tolerance_config": { "enable_fault_tolerance": true, "enable_dp_scale_down": false, "enable_dp_scale_up": false, "dp_scale_down_config": { "request_timeout_sec": 5.0, "poll_interval_sec": 1.0, "execution_deadline_sec": 30.0 } } NodeManager 的代理开关由上述两项派生,不必在 NM 配置里再写一份。 enable_dp_scale_up 是暂定内部名称。本 PR 中它只控制“缩容成功后是否允许 stop 已收空 Pod、交给集群补充资源”,不代表 Motor 已实现 DP rank 扩容事务。 | 类型 | 变化 | 开关关闭时行为 | |---|---|---| | Controller REST | 新增 GET /controller/fault_tolerance/status[?instance_id=] | 返回 phase=DISABLED,不进入缩容编排 | | NodeManager REST | 新增 POST /node-manager/fault-tolerance/status | proxy 未派生启用时返回 404 | | NodeManager REST | 新增 POST /node-manager/fault-tolerance/apply | proxy 未派生启用时返回 404 | | NodeManager REST | 新增 POST /node-manager/fault-tolerance/guard | proxy 未派生启用时返回 404,不冻结 suicide | | NodeManager REST | 新增 POST /node-manager/fault-tolerance/finalize | proxy 未派生启用时返回 404,不维护 retired endpoint | | NodeManager 注册 | 注册信息携带 ft_capability,包括引擎是否支持 scale_down 及静态门禁能力 | 不驱动缩容逻辑 | | 实例组装 | 同一实例各 Pod 的 FT capability 必须一致;缺失或不一致时失败封闭 | 不影响未开启缩容的既有服务路径 | | 内部配置 | enable_dp_scale_down_proxy = enable_fault_tolerance && enable_dp_scale_down | 客户无需单独配置;结果为 false | ## **5. 测试结果** Kill worker_dp1  Curl四个dp的status,由healthy变unhealthy  dp3同步hccl状态后也变成unhealthy,检测到dead+unhealthy之后触发dp缩容,NM下发apply:  缩容结束,健康rank的status状态变为healthy,   推理恢复正常  精度正常  缩容状态查询,由SCALING_DOWN更新为SCALED_DOWN_RUNNING  ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [ ] 代码注释完备 [ ] 正确记录维测日志 [ ] 是否有UT用例 [ ] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-Motor!964 | 27 天前 | |
[refractor] NodeManager代码微重构,提升代码可维护性 Co-authored-by: 吕有辉<lvyouhui@huawei.com> # message auto-generated for no-merge-commit merge: !620 merge refractor/node_manager into master [refractor] NodeManager代码微重构,提升代码可维护性 Created-by: codeDogPro Commit-by: 吕有辉 Merged-by: tobking Description: ## 1. 合入背景 ISSUE:https://gitcode.com/Ascend/MindIE-Motor/issues/368 ## 2. 修改内容 ### 2.1 Service Registry 重构 **文件**: motor/node_manager/core/services/registry.py 1. 用 typing.cast 消除 get_preparable() 中的 # type: ignore[arg-type,return-value]。 2. _MODULE_MAP 从模块级静态 dict 迁移到 _ServiceRegistry 实例属性,新增 add_discovery_path() API 支持动态注册后端模块路径。 3. 新增 get_active_sorted() 方法,将排序逻辑从 daemon.py 内联哨兵模式收归 registry。 4. _ServiceRegistration.is_active 改为 _is_active(active_backends) 方法,接受解析后的后端列表参数。 5. discover() 支持逗号分隔的多后端服务列表(如 "engine,memcache"),替代原来的单值匹配。 6. 删除 __slots__ 限制,2-3 个实例的内存节省可忽略。 7. 新增 tests/node_manager/core/services/test_registry.py,20 个单元测试覆盖 register、get_active 过滤、get_preparable 排序、discover 模块导入、重复注册、add_discovery_path、线程安全。 ### 2.2 服务协议提取 **文件**: motor/node_manager/core/services/protocols.py(新增) 1. DaemonService 和 PreparableService 从 registry.py 提取到 services/protocols.py。 2. daemon.py 直接从 protocols.py 导入,Protocol 定义与注册中心解耦。 ### 2.3 memcache LocalService 重构 **文件**: motor/node_manager/core/services/memcache/(新增目录) 1. **目录拆分**: services/memcache/ __init__.py worker.py ← LocalService 子进程入口(DistributedObjectStore().init(0)) lifecycle.py ← daemon 侧生命周期管理(@register_service、pull/stop/health_check) 2. **拉起方式改进**:pull() 使用 sys.executable -m motor.node_manager.core.services.memcache.worker 替代内联 -c 字符串,取消 PYTHON_EXEC_PATH 依赖。保持 subprocess.Popen(env=...) 确保与 Engine 子进程的 MMC_LOCAL_CONFIG_PATH 隔离。 3. **消除重复检查**:提取 _can_launch property,统一 should_launch() / pull() / prepare() 中的 enable、backend、mode 条件判断。 4. **简化 mark_dead()**:用 poll() 替代 wait(timeout=0) + 三重异常捕获。 5. **移除未使用的 _endpoints_count**:仅在日志中使用,改为局部变量。 ### 2.4 Engine 解耦 —— 服务配置化 **文件**: motor/node_manager/core/services/engine.py, motor/node_manager/core/daemon.py, motor/node_manager/main.py, motor/config/node_manager.py 1. @register_service(SERVICE_ENGINE) 新增 backend="engine",从 backend=None(始终激活)改为按配置激活。 2. KVCacheStoreConfig 新增 mode 字段("combined" / "separated"),通过 user_config.json 控制: json // Engine + KV 合体 Pod(默认) { "kv_cache_store_config": { "backend": "memcache", "mode": "combined" } } // KV 分离 Pod(只起 LocalService,不拉 Engine,不注册/心跳) { "kv_cache_store_config": { "backend": "memcache", "mode": "separated" } } // Engine only Pod {} 3. Daemon 新增 has_engine 属性,main.py 据此条件初始化 EngineManager / HeartbeatManager。 ### 2.5 main.py 重构 —— Application 基类 **文件**: motor/common/app/application.py(新增), motor/node_manager/node_manager.py(新增), motor/node_manager/main.py 1. **Application 基类** — 封装四个组件共享的 boilerplate: - 模块管理(add_module / get_module / stop_all_modules) - 配置热更新传播(on_config_updated → 先刷新自身间隔 _refresh_check_interval,再传播给所有带 update_config 的模块) - 可配置的 daemon loop 间隔(check_interval 参数,默认 1s,子类从 config 读取) - 信号处理(SIGINT / SIGTERM → threading.Event) - select-based daemon loop(stdin 读取 + stop_event.wait) - run() 模板方法:banner → init_modules → start_modules → config_watcher → daemon_loop → shutdown 2. **NodeManager(Application)**: - __init__ 传入 check_interval=config.basic_config.daemon_loop_interval(默认 5s,可在 user_config.json 中配置) - _refresh_check_interval():配置热更新时同步刷新间隔 - init_modules():根据 daemon.has_engine 动态注册模块 - _on_daemon_tick():每 tick 检查 HeartbeatManager 自杀标志 - exit_code:自杀时返回 -1(pod rescheduling) 3. **main.py 瘦身**:从 186 行 → 37 行 thin wrapper: python def main() -> int: config = NodeManagerConfig.from_json() reconfigure_logging(config.logging_config) run_port_setup_or_exit(apply_node_manager_ports, config) nm = NodeManager(config) return nm.run() 删除所有模块级全局变量(modules、_should_exit、config、config_watcher)和 7 个模块级函数。 ### 2.6 测试重构 1. 测试目录镜像源码结构: tests/node_manager/ __init__.py conftest.py test_config.py core/ __init__.py test_daemon.py test_engine_manager.py test_heartbeat_manager.py test_fault_reporter.py test_api_ready_event.py services/ __init__.py test_registry.py memcache/ __init__.py test_lifecycle.py 2. test_main_process_title.py 从 NodeManager 和 EngineServer 各一份合并为 tests/common/utils/test_process_title.py,NodeManager 用例适配新 NodeManager 类 API。 ### 2.7 改动文件清单 | 文件 | 改动类型 | |------|----------| | motor/common/app/__init__.py | 新增 | | motor/common/app/application.py | 新增 | | motor/node_manager/node_manager.py | 新增 | | motor/node_manager/core/services/protocols.py | 新增 | | motor/node_manager/core/services/memcache/__init__.py | 新增 | | motor/node_manager/core/services/memcache/worker.py | 新增 | | motor/node_manager/core/services/memcache/lifecycle.py | 重命名自 local_service.py | | tests/node_manager/core/__init__.py | 新增 | | tests/node_manager/core/services/__init__.py | 新增 | | tests/node_manager/core/services/memcache/__init__.py | 新增 | | tests/node_manager/core/services/test_registry.py | 新增 | | tests/node_manager/core/services/memcache/test_lifecycle.py | 重命名 | | tests/common/utils/test_process_title.py | 合并自两份拷贝 | | motor/node_manager/core/services/registry.py | 重构 | | motor/node_manager/core/daemon.py | 重构 | | motor/node_manager/core/services/engine.py | 改动 | | motor/node_manager/main.py | 瘦身 | | motor/config/node_manager.py | 改动 | | motor/node_manager/core/__init__.py | 删除多余版权声明 | | motor/node_manager/core/services/__init__.py | 删除多余版权声明 | | motor/node_manager/__init__.py | 删除多余版权声明 | ## 3. 资料变更 不涉及。 ## 4. 接口变更 不涉及(所有改动为内部重构,对外接口不变)。 ## 5. 测试结果 python -m pytest tests/node_manager/ tests/common/utils/test_process_title.py tests/engine_server/ -q 529 passed in 1.47s 测试覆盖: - **registry**:注册、过滤、排序、发现、线程安全(20 个用例) - **memcache lifecycle**:should_launch、prepare、pull、stop、health_check(11 个用例) - **daemon**:engine pull、参数校验、D2D peer、signal handler(13 个用例) - **heartbeat manager**:状态上报、端点管理、自杀检测 - **engine manager**:注册、re-register、ranktable、snapshot - **config**:配置解析、验证、热加载 - **process_title**:NodeManager + EngineServer 标题设置(4 个用例) ## 6. CheckList - [x] 代码注释完备 - [x] 正确记录维测日志 - [x] 是否有UT用例(新增 24 个用例,全量 529 passed) - [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 - _ServiceRegistry 使用 threading.Lock 保护 _registrations 和 _module_map - daemon.py 和 engine.py 的锁均为短临界区非嵌套使用 - Application 的信号处理仅设 threading.Event,清理在主线程执行 See merge request: Ascend/MindIE-Motor!620 | 2 个月前 | |
[refractor] NodeManager代码微重构,提升代码可维护性 Co-authored-by: 吕有辉<lvyouhui@huawei.com> # message auto-generated for no-merge-commit merge: !620 merge refractor/node_manager into master [refractor] NodeManager代码微重构,提升代码可维护性 Created-by: codeDogPro Commit-by: 吕有辉 Merged-by: tobking Description: ## 1. 合入背景 ISSUE:https://gitcode.com/Ascend/MindIE-Motor/issues/368 ## 2. 修改内容 ### 2.1 Service Registry 重构 **文件**: motor/node_manager/core/services/registry.py 1. 用 typing.cast 消除 get_preparable() 中的 # type: ignore[arg-type,return-value]。 2. _MODULE_MAP 从模块级静态 dict 迁移到 _ServiceRegistry 实例属性,新增 add_discovery_path() API 支持动态注册后端模块路径。 3. 新增 get_active_sorted() 方法,将排序逻辑从 daemon.py 内联哨兵模式收归 registry。 4. _ServiceRegistration.is_active 改为 _is_active(active_backends) 方法,接受解析后的后端列表参数。 5. discover() 支持逗号分隔的多后端服务列表(如 "engine,memcache"),替代原来的单值匹配。 6. 删除 __slots__ 限制,2-3 个实例的内存节省可忽略。 7. 新增 tests/node_manager/core/services/test_registry.py,20 个单元测试覆盖 register、get_active 过滤、get_preparable 排序、discover 模块导入、重复注册、add_discovery_path、线程安全。 ### 2.2 服务协议提取 **文件**: motor/node_manager/core/services/protocols.py(新增) 1. DaemonService 和 PreparableService 从 registry.py 提取到 services/protocols.py。 2. daemon.py 直接从 protocols.py 导入,Protocol 定义与注册中心解耦。 ### 2.3 memcache LocalService 重构 **文件**: motor/node_manager/core/services/memcache/(新增目录) 1. **目录拆分**: services/memcache/ __init__.py worker.py ← LocalService 子进程入口(DistributedObjectStore().init(0)) lifecycle.py ← daemon 侧生命周期管理(@register_service、pull/stop/health_check) 2. **拉起方式改进**:pull() 使用 sys.executable -m motor.node_manager.core.services.memcache.worker 替代内联 -c 字符串,取消 PYTHON_EXEC_PATH 依赖。保持 subprocess.Popen(env=...) 确保与 Engine 子进程的 MMC_LOCAL_CONFIG_PATH 隔离。 3. **消除重复检查**:提取 _can_launch property,统一 should_launch() / pull() / prepare() 中的 enable、backend、mode 条件判断。 4. **简化 mark_dead()**:用 poll() 替代 wait(timeout=0) + 三重异常捕获。 5. **移除未使用的 _endpoints_count**:仅在日志中使用,改为局部变量。 ### 2.4 Engine 解耦 —— 服务配置化 **文件**: motor/node_manager/core/services/engine.py, motor/node_manager/core/daemon.py, motor/node_manager/main.py, motor/config/node_manager.py 1. @register_service(SERVICE_ENGINE) 新增 backend="engine",从 backend=None(始终激活)改为按配置激活。 2. KVCacheStoreConfig 新增 mode 字段("combined" / "separated"),通过 user_config.json 控制: json // Engine + KV 合体 Pod(默认) { "kv_cache_store_config": { "backend": "memcache", "mode": "combined" } } // KV 分离 Pod(只起 LocalService,不拉 Engine,不注册/心跳) { "kv_cache_store_config": { "backend": "memcache", "mode": "separated" } } // Engine only Pod {} 3. Daemon 新增 has_engine 属性,main.py 据此条件初始化 EngineManager / HeartbeatManager。 ### 2.5 main.py 重构 —— Application 基类 **文件**: motor/common/app/application.py(新增), motor/node_manager/node_manager.py(新增), motor/node_manager/main.py 1. **Application 基类** — 封装四个组件共享的 boilerplate: - 模块管理(add_module / get_module / stop_all_modules) - 配置热更新传播(on_config_updated → 先刷新自身间隔 _refresh_check_interval,再传播给所有带 update_config 的模块) - 可配置的 daemon loop 间隔(check_interval 参数,默认 1s,子类从 config 读取) - 信号处理(SIGINT / SIGTERM → threading.Event) - select-based daemon loop(stdin 读取 + stop_event.wait) - run() 模板方法:banner → init_modules → start_modules → config_watcher → daemon_loop → shutdown 2. **NodeManager(Application)**: - __init__ 传入 check_interval=config.basic_config.daemon_loop_interval(默认 5s,可在 user_config.json 中配置) - _refresh_check_interval():配置热更新时同步刷新间隔 - init_modules():根据 daemon.has_engine 动态注册模块 - _on_daemon_tick():每 tick 检查 HeartbeatManager 自杀标志 - exit_code:自杀时返回 -1(pod rescheduling) 3. **main.py 瘦身**:从 186 行 → 37 行 thin wrapper: python def main() -> int: config = NodeManagerConfig.from_json() reconfigure_logging(config.logging_config) run_port_setup_or_exit(apply_node_manager_ports, config) nm = NodeManager(config) return nm.run() 删除所有模块级全局变量(modules、_should_exit、config、config_watcher)和 7 个模块级函数。 ### 2.6 测试重构 1. 测试目录镜像源码结构: tests/node_manager/ __init__.py conftest.py test_config.py core/ __init__.py test_daemon.py test_engine_manager.py test_heartbeat_manager.py test_fault_reporter.py test_api_ready_event.py services/ __init__.py test_registry.py memcache/ __init__.py test_lifecycle.py 2. test_main_process_title.py 从 NodeManager 和 EngineServer 各一份合并为 tests/common/utils/test_process_title.py,NodeManager 用例适配新 NodeManager 类 API。 ### 2.7 改动文件清单 | 文件 | 改动类型 | |------|----------| | motor/common/app/__init__.py | 新增 | | motor/common/app/application.py | 新增 | | motor/node_manager/node_manager.py | 新增 | | motor/node_manager/core/services/protocols.py | 新增 | | motor/node_manager/core/services/memcache/__init__.py | 新增 | | motor/node_manager/core/services/memcache/worker.py | 新增 | | motor/node_manager/core/services/memcache/lifecycle.py | 重命名自 local_service.py | | tests/node_manager/core/__init__.py | 新增 | | tests/node_manager/core/services/__init__.py | 新增 | | tests/node_manager/core/services/memcache/__init__.py | 新增 | | tests/node_manager/core/services/test_registry.py | 新增 | | tests/node_manager/core/services/memcache/test_lifecycle.py | 重命名 | | tests/common/utils/test_process_title.py | 合并自两份拷贝 | | motor/node_manager/core/services/registry.py | 重构 | | motor/node_manager/core/daemon.py | 重构 | | motor/node_manager/core/services/engine.py | 改动 | | motor/node_manager/main.py | 瘦身 | | motor/config/node_manager.py | 改动 | | motor/node_manager/core/__init__.py | 删除多余版权声明 | | motor/node_manager/core/services/__init__.py | 删除多余版权声明 | | motor/node_manager/__init__.py | 删除多余版权声明 | ## 3. 资料变更 不涉及。 ## 4. 接口变更 不涉及(所有改动为内部重构,对外接口不变)。 ## 5. 测试结果 python -m pytest tests/node_manager/ tests/common/utils/test_process_title.py tests/engine_server/ -q 529 passed in 1.47s 测试覆盖: - **registry**:注册、过滤、排序、发现、线程安全(20 个用例) - **memcache lifecycle**:should_launch、prepare、pull、stop、health_check(11 个用例) - **daemon**:engine pull、参数校验、D2D peer、signal handler(13 个用例) - **heartbeat manager**:状态上报、端点管理、自杀检测 - **engine manager**:注册、re-register、ranktable、snapshot - **config**:配置解析、验证、热加载 - **process_title**:NodeManager + EngineServer 标题设置(4 个用例) ## 6. CheckList - [x] 代码注释完备 - [x] 正确记录维测日志 - [x] 是否有UT用例(新增 24 个用例,全量 529 passed) - [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 - _ServiceRegistry 使用 threading.Lock 保护 _registrations 和 _module_map - daemon.py 和 engine.py 的锁均为短临界区非嵌套使用 - Application 的信号处理仅设 threading.Event,清理在主线程执行 See merge request: Ascend/MindIE-Motor!620 | 2 个月前 | |
[Feature] migrate EngineServer auto Snapshot lifecycle to native Co-authored-by: lbr711<liuboru1@huawei.com> # message auto-generated for no-merge-commit merge: !780 merge snapshot_phase2 into master [Feature] migrate EngineServer auto Snapshot lifecycle to native Created-by: lbr711 Commit-by: lbr711 Merged-by: tobking Description: ## **1. 合入背景** > migrate EngineServer Snapshot lifecycle to native vllm serve path:补齐 snapshot 配置下发、health probe、restore rebind、suicide arbitration 启动时机。 > > Fixes #509 ## **2. 修改内容** 1. EndpointConfig / LaunchContext 透传 snapshot_metadata,并据此设置 enable_auto_checkpoint 2. VLLMConfig flatten 写入 snapshot_config;存在 metadata 时 health probe 使用 /snapshot/health(202→RUNNING,200→READY) 3. restore start_cmd 路径通过 Daemon/Supervisor rebind_endpoint_ids 重绑 runtime endpoint id 4. NodeManager 在 Register/Heartbeat 初始化后再启动 start_suicide_arbitration 5. 同步更新相关 UT 与 CLI golden 断言(含 access log 默认排除 /snapshot/health) ## **3. 资料变更** 不涉及。 ## **4. 接口变更** 不涉及客户面 API;native vLLM CLI 增加 snapshot_config(snapshot_metadata / enable_auto_checkpoint),health 路径在 snapshot 场景切换为 /snapshot/health。 ## **5. 测试结果** - 场景:node_manager 单测(含 native_engine / vllm config / supervisor snapshot probe / restore 相关断言) - 方法:pytest tests/node_manager -n 6 - 结果:420 passed ## **6. CheckList** [x] 代码注释完备 [x] 正确记录维测日志 [x] 是否有UT用例 [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 关联 ISSUE:https://gitcode.com/Ascend/MindIE-Motor/issues/509 See merge request: Ascend/MindIE-Motor!780 | 1 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 27 天前 | ||
| 27 天前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 |