| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
[refractor]重构motor与memcache的交互逻辑 Co-authored-by: 吕有辉<lvyouhui@huawei.com> # message auto-generated for no-merge-commit merge: !530 merge feat/memcache_ssd into master [refractor]重构motor与memcache的交互逻辑 Created-by: codeDogPro Commit-by: 吕有辉 Merged-by: tobking Description: ## **1. 合入背景** https://gitcode.com/Ascend/MindIE-Motor/issues/353 ## **2. 修改内容** 1、完全重构motor与memcache的对接逻辑,解耦组件的交互 2、local service独立为单独的进程,由daemon拉起,提升拉起速度 ## **3. 资料变更** 涉及 ## **4. 接口变更** 不涉及 ## **5. 测试结果** 使用新拉起方式后A3拉起正常(standalone) HELP motor:prompt_tokens_per_second Prompt tokens per second computed from vllm:prompt_tokens_total counter deltas # TYPE motor:prompt_tokens_per_second gauge motor:prompt_tokens_per_second 0.0 # HELP motor:generation_tokens_per_second Generation tokens per second computed from vllm:generation_tokens_total counter deltas # TYPE motor:generation_tokens_per_second gauge motor:generation_tokens_per_second 0.0 # HELP vllm:prefix_cache_hit_rate Prefix cache hit rate (cached tokens / queried tokens). # TYPE vllm:prefix_cache_hit_rate gauge vllm:prefix_cache_hit_rate 0.0 # HELP motor:active_prefill_workers Number of active prefill instances # TYPE motor:active_prefill_workers gauge motor:active_prefill_workers 1 # HELP motor:active_decode_workers Number of active decode instances # TYPE motor:active_decode_workers gauge motor:active_decode_workers 1 # HELP motor:inactive_prefill_workers Number of inactive prefill instances # TYPE motor:inactive_prefill_workers gauge motor:inactive_prefill_workers 0 # HELP motor:inactive_decode_workers Number of inactive decode instances # TYPE motor:inactive_decode_workers gauge motor:inactive_decode_workers 0 # HELP kv_store_size KV store size in GB (layer=cpu|ssd|all, stat=usage|total) # TYPE kv_store_size gauge kv_store_size{layer="cpu",stat="usage"} 0.0 kv_store_size{layer="cpu",stat="total"} 64.0 kv_store_size{layer="ssd",stat="usage"} 0.0 kv_store_size{layer="ssd",stat="total"} 0.0 kv_store_size{layer="all",stat="usage"} 0.0 kv_store_size{layer="all",stat="total"} 64.0 # HELP kv_store_ratio KV store used ratio 0-1 (layer=cpu|ssd|all, stat=usage_rate) # TYPE kv_store_ratio gauge kv_store_ratio{layer="cpu",stat="usage_rate"} 0.0 kv_store_ratio{layer="ssd",stat="usage_rate"} 0.0 kv_store_ratio{layer="all",stat="usage_rate"} 0.0 # HELP kv_store_keys KV store number of stored keys # TYPE kv_store_keys gauge kv_store_keys 0.0 # HELP kv_store_eviction KV store eviction counters (stat=success|attempts) # TYPE kv_store_eviction gauge kv_store_eviction{stat="success"} 0.0 kv_store_eviction{stat="attempts"} 0.0 # HELP motor:memcache_segment_capacity_bytes Segment total capacity in bytes # TYPE motor:memcache_segment_capacity_bytes gauge motor:memcache_segment_capacity_bytes{segment="rank-0-dram"} 17179869184 motor:memcache_segment_capacity_bytes{segment="rank-1-dram"} 17179869184 # HELP motor:memcache_segment_allocated_bytes Segment allocated bytes # TYPE motor:memcache_segment_allocated_bytes gauge motor:memcache_segment_allocated_bytes{segment="rank-0-dram"} 0 motor:memcache_segment_allocated_bytes{segment="rank-1-dram"} 0 # HELP motor:memcache_total_capacity_bytes Total capacity by medium in bytes # TYPE motor:memcache_total_capacity_bytes gauge motor:memcache_total_capacity_bytes{medium="hbm"} 0 motor:memcache_total_capacity_bytes{medium="dram"} 34359738368 # HELP motor:memcache_allocated_bytes Allocated bytes by medium 压测性能: ╒══════════════════════════╤═════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╤═════╕ │ Performance Parameters │ Stage │ Average │ Min │ Max │ Median │ P75 │ P90 │ P99 │ N │ ╞══════════════════════════╪═════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╪═════╡ │ E2EL │ total │ 6848.4 ms │ 4251.6 ms │ 7985.9 ms │ 7590.0 ms │ 7717.7 ms │ 7879.3 ms │ 7975.2 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ TTFT │ total │ 422.2 ms │ 253.7 ms │ 733.2 ms │ 369.6 ms │ 486.8 ms │ 637.4 ms │ 723.6 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ TPOT │ total │ 14.4 ms │ 14.1 ms │ 14.5 ms │ 14.4 ms │ 14.5 ms │ 14.5 ms │ 14.5 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ ITL │ total │ 14.3 ms │ 0.0 ms │ 62.8 ms │ 13.8 ms │ 14.1 ms │ 15.3 ms │ 27.8 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ InputTokens │ total │ 1491.5 │ 1460.0 │ 1545.0 │ 1490.5 │ 1499.25 │ 1515.6 │ 1542.06 │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ OutputTokens │ total │ 448.375 │ 245.0 │ 512.0 │ 512.0 │ 512.0 │ 512.0 │ 512.0 │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ OutputTokenThroughput │ total │ 65.0576 token/s │ 57.6249 token/s │ 68.1729 token/s │ 65.8792 token/s │ 66.6954 token/s │ 67.1812 token/s │ 68.0737 token/s │ 8 │ ╘══════════════════════════╧═════════╧═════════════════╧═════════════════╧═════════════════╧═════════════════╧═════════════════╧═════════════════╧═════════════════╧═════╛ inprocess 模式测试如下: # HELP motor:memcache_segment_capacity_bytes Segment total capacity in bytes # TYPE motor:memcache_segment_capacity_bytes gauge motor:memcache_segment_capacity_bytes{segment="rank-0-dram"} 2147483648 motor:memcache_segment_capacity_bytes{segment="rank-1-dram"} 2147483648 motor:memcache_segment_capacity_bytes{segment="rank-2-dram"} 2147483648 motor:memcache_segment_capacity_bytes{segment="rank-3-dram"} 2147483648 motor:memcache_segment_capacity_bytes{segment="rank-4-dram"} 2147483648 motor:memcache_segment_capacity_bytes{segment="rank-5-dram"} 2147483648 motor:memcache_segment_capacity_bytes{segment="rank-6-dram"} 2147483648 motor:memcache_segment_capacity_bytes{segment="rank-7-dram"} 2147483648 # HELP motor:memcache_segment_allocated_bytes Segment allocated bytes # TYPE motor:memcache_segment_allocated_bytes gauge motor:memcache_segment_allocated_bytes{segment="rank-0-dram"} 12582912 motor:memcache_segment_allocated_bytes{segment="rank-1-dram"} 37748736 motor:memcache_segment_allocated_bytes{segment="rank-2-dram"} 37748736 motor:memcache_segment_allocated_bytes{segment="rank-3-dram"} 25165824 motor:memcache_segment_allocated_bytes{segment="rank-4-dram"} 50331648 motor:memcache_segment_allocated_bytes{segment="rank-5-dram"} 44040192 motor:memcache_segment_allocated_bytes{segment="rank-6-dram"} 56623104 motor:memcache_segment_allocated_bytes{segment="rank-7-dram"} 25165824 # HELP motor:memcache_total_capacity_bytes Total capacity by medium in by 压测性能一致 ``` ╒══════════════════════════╤═════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╤════════════════╤═════════════════╤═════╕ │ Performance Parameters │ Stage │ Average │ Min │ Max │ Median │ P75 │ P90 │ P99 │ N │ ╞══════════════════════════╪═════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╪════════════════╪═════════════════╪═════╡ │ E2EL │ total │ 6847.9 ms │ 4285.2 ms │ 8056.9 ms │ 7528.6 ms │ 7755.3 ms │ 7959.6 ms │ 8047.2 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼────────────────┼─────────────────┼─────┤ │ TTFT │ total │ 431.8 ms │ 259.8 ms │ 723.0 ms │ 414.1 ms │ 458.9 ms │ 614.0 ms │ 712.1 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼────────────────┼─────────────────┼─────┤ │ TPOT │ total │ 14.4 ms │ 13.9 ms │ 14.7 ms │ 14.4 ms │ 14.7 ms │ 14.7 ms │ 14.7 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼────────────────┼─────────────────┼─────┤ │ ITL │ total │ 14.3 ms │ 0.0 ms │ 71.6 ms │ 13.8 ms │ 14.2 ms │ 15.4 ms │ 24.7 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼────────────────┼─────────────────┼─────┤ │ InputTokens │ total │ 1491.5 │ 1460.0 │ 1545.0 │ 1490.5 │ 1499.25 │ 1515.6 │ 1542.06 │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼────────────────┼─────────────────┼─────┤ │ OutputTokens │ total │ 448.375 │ 245.0 │ 512.0 │ 512.0 │ 512.0 │ 512.0 │ 512.0 │ 8 │ ├──────────────────────────┼─────────┼── See merge request: Ascend/MindIE-Motor!530 | 27 天前 | |
[feature] Print MindIE-Motor ASCII logo on component startup Co-authored-by: Jechin<yuzechen1@huawei.com> # message auto-generated for no-merge-commit merge: !588 merge feat/startup-logo into master [feature] Print MindIE-Motor ASCII logo on component startup Created-by: Jechin Commit-by: Jechin Merged-by: towncharlie Description: ## **1. 合入背景** 组件启动缺少统一品牌识别,且 setup.py / motor.__version__ / version.info 三处版本硬编码不一致。 Fixes #347 双合 PR:[#589](https://gitcode.com/Ascend/MindIE-PyMotor/merge_requests/589)(合入 v3.1.0)。 ## **2. 修改内容** 1. 新增 motor/common/utils/startup_banner.py,以 Unicode Block MOTOR 字样打印启动 Banner;副标题为 MindIE-Motor · v{version} · {role},与字画左对齐,上方留空行。 2. 在 coordinator / controller / node_manager 的 main 入口调用 log_startup_banner(不接入 EngineServer)。 3. 支持环境变量 MOTOR_DISABLE_LOG_LOGO(与 vLLM 对齐):置 1 时不打印 ASCII 字画,改为单行 MindIE-Motor version …, role …;单容器启动脚本 all_combine_in_single_container.sh 中默认开启,避免多进程刷屏。 4. 以 motor/__init__.py 的 __version__(现为 3.1.0)为唯一版本源;setup.py 解析该字段作为 wheel 版本;build.sh 读取后写入 version.info 的 motor_version(兼容单/双引号),并删除未使用的 vllm_version / vllm_ascend_version 字段。 5. 安装文档/脚本中的 wheel 路径改为 motor-*.whl 通配,避免写死版本号。 6. 补充 tests/common/utils/test_startup_banner.py 单测(含 disable 环境变量路径)。 ## **3. 资料变更** 涉及:构建/部署文档与 ModelArts 安装示例中的 wheel 安装路径改为通配(motor-*.whl)。 ## **4. 接口变更** 不涉及跨仓或客户面接口变更。新增可选环境变量 MOTOR_DISABLE_LOG_LOGO(默认 0,关闭 logo 时设为 1)。 ## **5. 测试结果**   - 场景:本地渲染 Banner / UT;单容器脚本关闭 logo - 方法:pytest tests/common/utils/test_startup_banner.py;验证 setup.py/build.sh 读取版本与 __version__ 一致;MOTOR_DISABLE_LOG_LOGO=1 时输出单行文案 - 结果:单测通过;版本读取一致为 3.1.0 ## **6. CheckList** [x] 代码注释完备 [x] 正确记录维测日志 [x] 是否有UT用例 [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!588 | 1 个月前 | |
[feature] deployer NodePort 冲突检测与 user_config 重映射 Co-authored-by: yangan7<yangan7@h-partners.com> # message auto-generated for no-merge-commit merge: !676 merge nodeport into master [feature] deployer NodePort 冲突检测与 user_config 重映射 Created-by: mindie_yangan Commit-by: yangan7 Merged-by: tobking Description: ## 1. 合入背景 Motor 多服务同集群部署时,默认 NodePort(如 31015 / 31017 / 31027)若已被占用,kubectl apply 会因 nodePort already allocated 失败,相关 Pod 起不来。 本 PR 在 apply 前检测集群已占用 NodePort,支持交互式 remap,并使 user_config 中三个 NodePort 配置生效。 Related Issue:https://gitcode.com/Ascend/MindIE-Motor/issues/379 ## 2. 修改内容 **方案**:deployer apply 前扫描生成 yaml 中的 NodePort,与集群占用对比;冲突时按端口交互(y=自动分配、<port>=指定口、N=保持冲突口并给出修复指引);非 TTY 视为 N。交互 remap **只回写本次** output_yamls,**不**自动改 user_config.json(需手动同步 motor_deploy_config.*_node_port)。 ### 2.1 业务代码 - examples/deployer/lib/nodeport_allocator.py(新增) - 采集计划口 / 集群占用、冲突判定(同 ns + 同 service 名视为自有,不算冲突;同端口只提示一次) - 交互 remap:y / <port> / N;dry-run 只打印建议映射(返回空 remapping),不改 yaml、不清已有告警文件 - N / 非 TTY:继续部署冲突口,写 coordinator/controller showlog 告警,并提示手动改 user_config - examples/deployer/lib/generator/k8s_utils.py - apply / configmap 前调用 resolve_nodeports_for_yaml_files;configmap 挂载冲突告警文件 - examples/deployer/deploy.py - dry-run 路径在生成 yaml 后做冲突检测(只打印) - examples/deployer/lib/utils.py + generator(controller / coordinator / infer_service) - coordinator_infer_node_port / coordinator_obs_node_port / controller_observability_node_port 生效 - is_observability_service_name() 避免 robust 一类误匹配(coordinator/controller/infer_service 复用) - examples/deployer/startup/roles/{coordinator,controller}.sh - 启动时打印 NodePort 冲突告警(若 configmap 中有内容) - examples/deployer/README.md - 补充三端口说明与冲突交互说明 ### 2.2 测试 - tests/examples/deployer/test_nodeport_allocator.py(新增) - 计划口采集、自有忽略、跨 ns 冲突、y/port/N、dry-run、非 TTY、showlog、obs 名称匹配、同端口只弹一次、拒绝占用其他 planned 端口等 ## 3. 自验证   See merge request: Ascend/MindIE-Motor!676 | 11 天前 | |
[feature] deployer NodePort 冲突检测与 user_config 重映射 Co-authored-by: yangan7<yangan7@h-partners.com> # message auto-generated for no-merge-commit merge: !676 merge nodeport into master [feature] deployer NodePort 冲突检测与 user_config 重映射 Created-by: mindie_yangan Commit-by: yangan7 Merged-by: tobking Description: ## 1. 合入背景 Motor 多服务同集群部署时,默认 NodePort(如 31015 / 31017 / 31027)若已被占用,kubectl apply 会因 nodePort already allocated 失败,相关 Pod 起不来。 本 PR 在 apply 前检测集群已占用 NodePort,支持交互式 remap,并使 user_config 中三个 NodePort 配置生效。 Related Issue:https://gitcode.com/Ascend/MindIE-Motor/issues/379 ## 2. 修改内容 **方案**:deployer apply 前扫描生成 yaml 中的 NodePort,与集群占用对比;冲突时按端口交互(y=自动分配、<port>=指定口、N=保持冲突口并给出修复指引);非 TTY 视为 N。交互 remap **只回写本次** output_yamls,**不**自动改 user_config.json(需手动同步 motor_deploy_config.*_node_port)。 ### 2.1 业务代码 - examples/deployer/lib/nodeport_allocator.py(新增) - 采集计划口 / 集群占用、冲突判定(同 ns + 同 service 名视为自有,不算冲突;同端口只提示一次) - 交互 remap:y / <port> / N;dry-run 只打印建议映射(返回空 remapping),不改 yaml、不清已有告警文件 - N / 非 TTY:继续部署冲突口,写 coordinator/controller showlog 告警,并提示手动改 user_config - examples/deployer/lib/generator/k8s_utils.py - apply / configmap 前调用 resolve_nodeports_for_yaml_files;configmap 挂载冲突告警文件 - examples/deployer/deploy.py - dry-run 路径在生成 yaml 后做冲突检测(只打印) - examples/deployer/lib/utils.py + generator(controller / coordinator / infer_service) - coordinator_infer_node_port / coordinator_obs_node_port / controller_observability_node_port 生效 - is_observability_service_name() 避免 robust 一类误匹配(coordinator/controller/infer_service 复用) - examples/deployer/startup/roles/{coordinator,controller}.sh - 启动时打印 NodePort 冲突告警(若 configmap 中有内容) - examples/deployer/README.md - 补充三端口说明与冲突交互说明 ### 2.2 测试 - tests/examples/deployer/test_nodeport_allocator.py(新增) - 计划口采集、自有忽略、跨 ns 冲突、y/port/N、dry-run、非 TTY、showlog、obs 名称匹配、同端口只弹一次、拒绝占用其他 planned 端口等 ## 3. 自验证   See merge request: Ascend/MindIE-Motor!676 | 11 天前 | |
[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 | 24 天前 | |
[feature] 多kv池化后端支持 Co-authored-by: 吕有辉<lvyouhui@huawei.com> # message auto-generated for no-merge-commit merge: !382 merge memcache into master [feature] 多kv池化后端支持 Created-by: codeDogPro Commit-by: 吕有辉 Merged-by: towncharlie Description: ## **1. 合入背景** 适配多个池化后端【当前PR适配Memcache,yuanrong后端后续支持】 ## **2. 修改内容** 1、特性文档优化,多后端可拓展 2、startup脚本抽象kv_store_backends/,提升可维护性 3、添加memcache的metaservice,local service的脚本支持; 4、A2的聚合拉起;A3,A5的聚合、分离拉起local service的能力支持 ## **3. 资料变更** 设计 ## **4. 接口变更** 不涉及 ## **5. 测试结果** 能正常拉起memcache池化,压测请求无报错。 ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [ ] 代码注释完备 [ ] 正确记录维测日志 [ ] 是否有UT用例 [ ] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!382 | 1 个月前 | |
【feature】kv-conductor Co-authored-by: 吕有辉<lvyouhui@huawei.com> # message auto-generated for no-merge-commit merge: !568 merge feat/kv-conductor into master 【feature】kv-conductor Created-by: codeDogPro Commit-by: 吕有辉 Merged-by: towncharlie Description: ## **1. 合入背景** https://gitcode.com/Ascend/MindIE-PyMotor/issues/338 内部subCMC已经评审,该大PR同意合入 ## **2. 修改内容** 1、引入kv-conductor【rust源代码,测试代码,设计文档】 2、Coordinator conductor client适配kv-conductor 3、新增kv-conductor config 4、kvcache_affine.md重写,以kv-conductor为准 5、build.sh集成kv-conductor二进制打包进whl的能力,支持跳过kv-conductor打包,便于在无rust编译环境上构建基础组件 ## **3. 资料变更** 涉及 ## **4. 接口变更** 涉及 ## **5. 测试结果** whl包版kv-conductor拉起成功,请求命中匹配成功 Looking in indexes: https://repo.huaweicloud.com/repository/pypi/simple, https://mirrors.huaweicloud.com/ascend/repos/pypi Processing ./dist/motor-0.1.0-py3-none-any.whl Installing collected packages: motor Attempting uninstall: motor Found existing installation: motor 0.1.0 Uninstalling motor-0.1.0: Successfully uninstalled motor-0.1.0 Successfully installed motor-0.1.0 WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv [notice] A new release of pip is available: 24.0 -> 26.1.2 [notice] To update, run: pip install --upgrade pip Current node role: ROLE=kv_conductor Starting KV Conductor on 0.0.0.0:13333 2026-07-21T17:12:09.17062356+08:00 INFO scoring config hbm_weight=3 cpu_weight=2 disk_weight=1 2026-07-21T17:12:09.17093877+08:00 INFO KV conductor starting on 0.0.0.0:13333 2026-07-21T17:12:10.44555639+08:00 TRACE connection 192.168.196.1:50480 accepted 2026-07-21T17:12:10.44581192+08:00 TRACE connection 192.168.196.1:50480 closed 2026-07-21T18:18:48.26729199+08:00 DEBUG request{method=POST uri=/query version=HTTP/1.1}: started processing request 2026-07-21T18:18:48.26737949+08:00 DEBUG request{method=POST uri=/query version=HTTP/1.1}: query request model=Qwen3-30B-A3B-W8A8 tenant=default num_tokens=1503 2026-07-21T18:18:48.26740762+08:00 DEBUG request{method=POST uri=/query version=HTTP/1.1}: find_matches seq_len=12 depth=11 active_workers=2 elapsed_us=13 2026-07-21T18:18:48.26741747+08:00 DEBUG request{method=POST uri=/query version=HTTP/1.1}: hash_computed num_tokens=1503 block_size=128 num_hashes=12 hash_us=2 scores=2 2026-07-21T18:18:48.26743069+08:00 DEBUG request{method=POST uri=/query version=HTTP/1.1}: query profile num_tokens=1503 block_size=128 hash_us=37 total_us=43 2026-07-21T18:18:48.26745731+08:00 DEBUG request{method=POST uri=/query version=HTTP/1.1}: finished processing request latency=0 ms status=200 Qwen3-30B-A3B,Prefill DP2,Decode DP2测试如下: 发送8个请求,gsm8 未开启亲和性调度: ╒══════════════════════════╤═════════╤═════════════════╤════════════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╤═════╕ │ Performance Parameters │ Stage │ Average │ Min │ Max │ Median │ P75 │ P90 │ P99 │ N │ ╞══════════════════════════╪═════════╪═════════════════╪════════════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╪═════╡ │ E2EL │ total │ 7389.6 ms │ 4197.7 ms │ 8487.4 ms │ 8063.4 ms │ 8298.8 ms │ 8377.5 ms │ 8476.4 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ TTFT │ total │ 311.4 ms │ 226.1 ms │ 484.5 ms │ 284.1 ms │ 373.7 ms │ 409.9 ms │ 477.0 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ TPOT │ total │ 15.7 ms │ 15.3 ms │ 15.9 ms │ 15.8 ms │ 15.9 ms │ 15.9 ms │ 15.9 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ ITL │ total │ 15.6 ms │ 0.0 ms │ 48.4 ms │ 15.6 ms │ 15.8 ms │ 16.0 ms │ 20.1 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ InputTokens │ total │ 1491.5 │ 1460.0 │ 1545.0 │ 1490.5 │ 1499.25 │ 1515.6 │ 1542.06 │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ OutputTokens │ total │ 452.125 │ 242.0 │ 512.0 │ 509.0 │ 512.0 │ 512.0 │ 512.0 │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ OutputTokenThroughput │ total │ 60.9652 token/s │ 57.651 token/s │ 63.2079 token/s │ 61.2631 token/s │ 62.0915 token/s │ 63.0926 token/s │ 63.1963 token/s │ 8 │ ╘══════════════════════════╧═════════╧═════════════════╧════════════════╧═════════════════╧═════════════════╧═════════════════╧═════════════════╧═════════════════╧═════╛ 开启亲和性: ╒══════════════════════════╤═════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╤═════╕ │ Performance Parameters │ Stage │ Average │ Min │ Max │ Median │ P75 │ P90 │ P99 │ N │ ╞══════════════════════════╪═════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╪═════╡ │ E2EL │ total │ 7240.3 ms │ 4261.9 ms │ 8632.0 ms │ 7745.1 ms │ 8326.5 ms │ 8438.4 ms │ 8612.6 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ TTFT │ total │ 320.5 ms │ 241.6 ms │ 519.1 ms │ 260.4 ms │ 393.4 ms │ 432.8 ms │ 510.5 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ TPOT │ total │ 15.8 ms │ 15.4 ms │ 15.9 ms │ 15.9 ms │ 15.9 ms │ 15.9 ms │ 15.9 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ ITL │ total │ 15.7 ms │ 0.0 ms │ 45.1 ms │ 15.6 ms │ 15.9 ms │ 16.1 ms │ 23.1 ms │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ InputTokens │ total │ 1491.5 │ 1460.0 │ 1545.0 │ 1490.5 │ 1499.25 │ 1515.6 │ 1542.06 │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ OutputTokens │ total │ 439.125 │ 254.0 │ 512.0 │ 481.5 │ 512.0 │ 512.0 │ 512.0 │ 8 │ ├──────────────────────────┼─────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────┤ │ OutputTokenThroughput │ total │ 60.5041 token/s │ 58.5203 token/s │ 62.9559 token/s │ 60.4373 token/s │ 61.3642 token/s │ 61.9798 token/s │ 62.8583 token/s │ 8 │ ╘══════════════════════════╧═════════╧═════════════════╧═════════════════╧═════════════════╧═════════════════╧═════════════════╧═════════════════╧═════════════════╧═════╛ ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [ ] 代码注释完备 [ ] 正确记录维测日志 [ ] 是否有UT用例 [ ] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-Motor!568 | 1 个月前 | |
[feature]对接SGLang — coordinator、deploy Co-authored-by: l00855614<linghubiao@huawei.com> # message auto-generated for no-merge-commit merge: !9 merge lhb_sglang_dev into master [feature]对接SGLang — coordinator、deploy Created-by: linghb Commit-by: l00855614 Merged-by: towncharlie Description: ## **1. 合入背景** https://gitcode.com/Ascend/MindIE-PyMotor/issues/3 ## **2. 修改内容** 1、coordinator 新增pd_dual_dispatch_router,支持同时P和D双选,并发下发请求的模式; 2、deploy (1)Ascend_MF_STORE 单独部署;(2)user_config 增加sglang配置; ## **3. 资料变更** 不涉及 ## **4. 接口变更** 不涉及 ## **5. 测试结果** 部署成功  推理请求成功 v1/completions  ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [ ] 代码注释完备 [ ] 正确记录维测日志 [ ] 是否有UT用例 [ ] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!9 | 5 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 27 天前 | ||
| 1 个月前 | ||
| 11 天前 | ||
| 11 天前 | ||
| 24 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 5 个月前 |