| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
[feature] kv-conductor /query 支持 msgpack 编码,10倍性能收益 Co-authored-by: 吕有辉<lvyouhui@huawei.com> # message auto-generated for no-merge-commit merge: !687 merge opt/kv_conductor_query_msgpack into master [feature] kv-conductor /query 支持 msgpack 编码,10倍性能收益 Created-by: codeDogPro Commit-by: 吕有辉 Merged-by: tobking Description: ## 1. 合入背景 为 kv-conductor 的 /query 与 /query_by_hash 增加 MessagePack 编解码支持,并在 Coordinator 端到端打通(ConductorApiClient.query_conductor 默认走 msgpack)。长上下文(1M/5M token)场景下,KV 亲和性查询的请求体积与编解码耗时显著下降。 借鉴 Mooncake conductor #3258 的 Content-Type 分派方案;与 KV Conductor 的前缀索引能力(#338 对应的自研 kv-conductor)配套演进。 关联 ISSUE:[#455](https://gitcode.com/Ascend/MindIE-Motor/issues/455) ## 2. 修改内容 1. **kv-conductor(Rust,motor/kv_conductor/)** - /query、/query_by_hash 按请求 Content-Type 分派:application/msgpack → rmp_serde 解码请求,响应/错误/空结果用 rmp::encode 手工编码;其他 Content-Type 走原 JSON 路径(行为不变)。 - 响应侧手工编码的原因:QueryResponse 使用 #[serde(flatten)](tenants 展开到顶层 map),msgpack 序列化器不支持 flatten——手工编码保证 msgpack wire 形状与 JSON 逐字节等价,并有单元测试(rmpv→serde_json 结构化对比)守护。 - QueryRequest / QueryByHashRequest 增加 Serialize(原仅 Deserialize)。 2. **Coordinator(Python)** - ConductorApiClient:新增 encode_query_msgpack / decode_query_response_msgpack(msgspec),query_conductor() 按 kv_conductor_config.query_encoding(默认 "msgpack")分派;响应按服务器 Content-Type 解析(msgpack → msgspec,否则 JSON),**旧版 JSON-only conductor 自动兼容,无需配置切换**。 - SafeHTTPSClient 新增 post_bytes()(原始 body POST)。 - KvConductorConfig 新增 query_encoding 配置项。 3. **测试** - Rust:单元测试 120(新增 msgpack 往返、wire 形状等价、Content-Type 嗅探、错误/空结果编码)+ 集成测试 20(新增 msgpack/JSON 查询结果一致、msgpack /query_by_hash、404/400 错误路径按请求编码返回);cargo clippy -D warnings、cargo fmt 通过。 - Python:api_client 44(新增 msgpack wire 格式断言、json 配置路径、legacy JSON 响应 fallback)、coordinator 模块 1155 全过。 - 性能验证使用临时 benchmark 脚本(真实 conductor 进程 + client 真实编解码路径),bench 属验证工具未随 PR 上库。 ## 3. 资料变更 涉及: - docs/zh/user_guide/configuration/config_reference.md:新增 kv_conductor_config.query_encoding 配置说明。 - skill reference(.agent/skills/motor-dev/references/coordinator.md、kv-conductor.md):新增 msgpack 编解码章节与端到端数据,并修正两处过时内容(服务端加权评分模型已移除、src/indexer.rs → src/indexer/ 目录)。 ## 4. 接口变更 涉及(客户面可见): - POST /query、POST /query_by_hash 新增 Content-Type: application/msgpack 请求编码支持,响应随请求编码返回(JSON 默认行为不变,向后兼容)。 - Coordinator 配置新增 kv_conductor_config.query_encoding(默认 "msgpack";对接旧版 conductor 可配 "json")。 ## 5. 测试结果 **性能收益**(真实 kv-conductor release 进程 + Coordinator client 真实编解码路径,best-of-5,DeepSeek V4 风格长上下文): === 1M tokens(block_size=128)=== step JSON msgpack 提速 请求体积 encode 29.92 ms 2.89 ms 10.4x 6.65MB -> 2.99MB (-55%) HTTP RTT 45.63 ms 12.07 ms 3.78x (客户端序列化+服务端XXH3哈希/树匹配/序列化+网络) TOTAL 45.63 ms 12.07 ms 3.78x === 5M tokens(block_size=128)=== encode 149.8 ms 14.4 ms 10.4x 33.3MB -> 14.9MB (-55%) HTTP RTT 220.5 ms 41.9 ms 5.26x TOTAL 220.5 ms 41.9 ms 5.26x - 5M 上下文单次查询省 ~178ms,1M 省 ~34ms;请求体积减半(网络传输同步受益)。 - 收益来源:客户端 msgspec 编码(10x)、服务端 rmp 解析 vs serde_json(RTT 内体现)、传输字节减半。 **短上下文覆盖**(1 ~ 16K tokens,纯编解码,msgspec vs json.dumps/loads,best-of-20000): tokens | json enc msgpack enc | json dec msgpack dec 1 | 1.07us 0.12us | 1.19us 0.21us 64 | 2.83us 0.27us | 2.94us 0.51us 1024 | 26.44us 2.31us | 26.44us 7.96us 16384 | 437.67us 32.82us | 430.86us 148.58us - 全长度区间(1 ~ 16K token)msgpack 均更快:1 token 时亦快 ~9x(编码 0.12us vs 1.07us); - **无临界点、无负收益**——msgspec 为纯 C 实现,固定开销(~0.1-0.2us)低于 json.dumps/loads 的固定开销(~1-1.2us),短上下文(普通对话场景)同样占优; - 默认 query_encoding: "msgpack" 在短/长上下文下均无回归。 **功能测试**: - cargo test:120 单元 + 20 集成全过; - bash tests/run_tests.sh tests/coordinator/:1155 用例全过; - pre-commit 全量通过(ruff/pylint/bandit/cargo clippy/fmt 等)。 **测试场景**:单元(编解码往返/等价性)、集成(HTTP Content-Type 协商、错误路径、JSON 兼容)、端到端(1M/5M 长上下文性能)。精度/显存不涉及(无模型运行)。 ## 6. CheckList - [x] 代码注释完备 - [x] 正确记录维测日志 - [x] 是否有UT用例(120 Rust 单元 + 20 集成 + 44 Python 单测) - [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题(查询路径只读锁语义未变,msgpack 编解码为无状态纯函数) See merge request: Ascend/MindIE-Motor!687 | 1 个月前 | |
[feature] kv-conductor /query 支持 msgpack 编码,10倍性能收益 Co-authored-by: 吕有辉<lvyouhui@huawei.com> # message auto-generated for no-merge-commit merge: !687 merge opt/kv_conductor_query_msgpack into master [feature] kv-conductor /query 支持 msgpack 编码,10倍性能收益 Created-by: codeDogPro Commit-by: 吕有辉 Merged-by: tobking Description: ## 1. 合入背景 为 kv-conductor 的 /query 与 /query_by_hash 增加 MessagePack 编解码支持,并在 Coordinator 端到端打通(ConductorApiClient.query_conductor 默认走 msgpack)。长上下文(1M/5M token)场景下,KV 亲和性查询的请求体积与编解码耗时显著下降。 借鉴 Mooncake conductor #3258 的 Content-Type 分派方案;与 KV Conductor 的前缀索引能力(#338 对应的自研 kv-conductor)配套演进。 关联 ISSUE:[#455](https://gitcode.com/Ascend/MindIE-Motor/issues/455) ## 2. 修改内容 1. **kv-conductor(Rust,motor/kv_conductor/)** - /query、/query_by_hash 按请求 Content-Type 分派:application/msgpack → rmp_serde 解码请求,响应/错误/空结果用 rmp::encode 手工编码;其他 Content-Type 走原 JSON 路径(行为不变)。 - 响应侧手工编码的原因:QueryResponse 使用 #[serde(flatten)](tenants 展开到顶层 map),msgpack 序列化器不支持 flatten——手工编码保证 msgpack wire 形状与 JSON 逐字节等价,并有单元测试(rmpv→serde_json 结构化对比)守护。 - QueryRequest / QueryByHashRequest 增加 Serialize(原仅 Deserialize)。 2. **Coordinator(Python)** - ConductorApiClient:新增 encode_query_msgpack / decode_query_response_msgpack(msgspec),query_conductor() 按 kv_conductor_config.query_encoding(默认 "msgpack")分派;响应按服务器 Content-Type 解析(msgpack → msgspec,否则 JSON),**旧版 JSON-only conductor 自动兼容,无需配置切换**。 - SafeHTTPSClient 新增 post_bytes()(原始 body POST)。 - KvConductorConfig 新增 query_encoding 配置项。 3. **测试** - Rust:单元测试 120(新增 msgpack 往返、wire 形状等价、Content-Type 嗅探、错误/空结果编码)+ 集成测试 20(新增 msgpack/JSON 查询结果一致、msgpack /query_by_hash、404/400 错误路径按请求编码返回);cargo clippy -D warnings、cargo fmt 通过。 - Python:api_client 44(新增 msgpack wire 格式断言、json 配置路径、legacy JSON 响应 fallback)、coordinator 模块 1155 全过。 - 性能验证使用临时 benchmark 脚本(真实 conductor 进程 + client 真实编解码路径),bench 属验证工具未随 PR 上库。 ## 3. 资料变更 涉及: - docs/zh/user_guide/configuration/config_reference.md:新增 kv_conductor_config.query_encoding 配置说明。 - skill reference(.agent/skills/motor-dev/references/coordinator.md、kv-conductor.md):新增 msgpack 编解码章节与端到端数据,并修正两处过时内容(服务端加权评分模型已移除、src/indexer.rs → src/indexer/ 目录)。 ## 4. 接口变更 涉及(客户面可见): - POST /query、POST /query_by_hash 新增 Content-Type: application/msgpack 请求编码支持,响应随请求编码返回(JSON 默认行为不变,向后兼容)。 - Coordinator 配置新增 kv_conductor_config.query_encoding(默认 "msgpack";对接旧版 conductor 可配 "json")。 ## 5. 测试结果 **性能收益**(真实 kv-conductor release 进程 + Coordinator client 真实编解码路径,best-of-5,DeepSeek V4 风格长上下文): === 1M tokens(block_size=128)=== step JSON msgpack 提速 请求体积 encode 29.92 ms 2.89 ms 10.4x 6.65MB -> 2.99MB (-55%) HTTP RTT 45.63 ms 12.07 ms 3.78x (客户端序列化+服务端XXH3哈希/树匹配/序列化+网络) TOTAL 45.63 ms 12.07 ms 3.78x === 5M tokens(block_size=128)=== encode 149.8 ms 14.4 ms 10.4x 33.3MB -> 14.9MB (-55%) HTTP RTT 220.5 ms 41.9 ms 5.26x TOTAL 220.5 ms 41.9 ms 5.26x - 5M 上下文单次查询省 ~178ms,1M 省 ~34ms;请求体积减半(网络传输同步受益)。 - 收益来源:客户端 msgspec 编码(10x)、服务端 rmp 解析 vs serde_json(RTT 内体现)、传输字节减半。 **短上下文覆盖**(1 ~ 16K tokens,纯编解码,msgspec vs json.dumps/loads,best-of-20000): tokens | json enc msgpack enc | json dec msgpack dec 1 | 1.07us 0.12us | 1.19us 0.21us 64 | 2.83us 0.27us | 2.94us 0.51us 1024 | 26.44us 2.31us | 26.44us 7.96us 16384 | 437.67us 32.82us | 430.86us 148.58us - 全长度区间(1 ~ 16K token)msgpack 均更快:1 token 时亦快 ~9x(编码 0.12us vs 1.07us); - **无临界点、无负收益**——msgspec 为纯 C 实现,固定开销(~0.1-0.2us)低于 json.dumps/loads 的固定开销(~1-1.2us),短上下文(普通对话场景)同样占优; - 默认 query_encoding: "msgpack" 在短/长上下文下均无回归。 **功能测试**: - cargo test:120 单元 + 20 集成全过; - bash tests/run_tests.sh tests/coordinator/:1155 用例全过; - pre-commit 全量通过(ruff/pylint/bandit/cargo clippy/fmt 等)。 **测试场景**:单元(编解码往返/等价性)、集成(HTTP Content-Type 协商、错误路径、JSON 兼容)、端到端(1M/5M 长上下文性能)。精度/显存不涉及(无模型运行)。 ## 6. CheckList - [x] 代码注释完备 - [x] 正确记录维测日志 - [x] 是否有UT用例(120 Rust 单元 + 20 集成 + 44 Python 单测) - [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题(查询路径只读锁语义未变,msgpack 编解码为无状态纯函数) See merge request: Ascend/MindIE-Motor!687 | 1 个月前 | |
[feature] 支持 Prefill 跨机 Pipeline Parallel 拉起 Co-authored-by: Jechin<yuzechen1@huawei.com> # message auto-generated for no-merge-commit merge: !653 merge feature/prefill-cross-node-pp into master [feature] 支持 Prefill 跨机 Pipeline Parallel 拉起 Created-by: Jechin Commit-by: Jechin Merged-by: towncharlie Description: ## **1. 合入背景** Fixes [#389](https://gitcode.com/Ascend/MindIE-Motor/issues/389) Prefill 跨机 Pipeline Parallel(如 TP=16、PP=2、nnodes=2)场景下,控制面仍按“单机并行积”计算 local_world_size(pcp×tp×pp),导致本机设备数校验失败、Endpoint 为空;同时 master_addr=placeholder / 静态 node_rank 会盖住运行时注入,分布式初始化无法连通。Assembler 在无 Endpoint 时还会误报 start 成功。本 PR 补齐跨机 PP 与跨机 PCP 共用的 nnodes 路径,并让 Deployer 从 vLLM 脚本正确生成 PP/nnodes 配置;并行度读取统一为 CLI 整数优先、缺省回退 kv_connector_extra_config(含 pp_size)。 ## **2. 修改内容** 1. **NodeManager 配置**(motor/config/node_manager.py) - 跨机时按 (pcp×tp×pp)//nnodes 折算本机 local_world_size(覆盖 PP/PCP) - pcp×pp 不能被 nnodes 整除时直接报错,避免错误拓扑静默通过 2. **EngineServer VLLMConfig**(motor/engine_server/core/vllm/vllm_config.py) - 跨机场景强制覆盖 master_addr / node_rank / headless,不再被 placeholder 挡住 - Mooncake kv extra 合并并行度时保留用户字段(如 pp_layer_partition) 3. **Controller InstanceAssembler**(motor/controller/core/instance_assembler.py) - 所有 NodeManager 均无 Endpoint 时,_send_start_command 返回失败并打 ERROR,禁止假成功 4. **Deployer 转换**(examples/deployer/config_tool/vllm_to_motor.py) - 保留并正确写出 pipeline_parallel_size,按 tp×pp 推导 Pod / nnodes - 跨机时写入 nnodes / master-port;不写 master-addr / node-rank(运行时注入) - **dp/tp/pp 统一读取优先级**:命令行给了正整数用 CLI,否则回退 kv_connector_extra_config 的 dp_size / tp_size / pp_size(kv 中的 size 在写出前剥离) - 去除硬件侧强制 remap tp/dp;infer_*_motor_deploy_config 回传 nnodes,与跨机 engine 注入共用一次 _infer_pod_layout - 抽取 hybrid 默认 deploy / 权重挂载路径 / preset+cards 等重复逻辑,降低漂移风险 5. **UT** - 覆盖 PP 折算、不可整除、placeholder 覆盖、kv 字段保留、空 Endpoint start 失败 - Deployer:CLI>kv、仅 kv 回退(含 pp_size)、跨机 nnodes/master-port、跳过脚本透传多机键等 **进程视图** mermaid flowchart LR subgraph deploy [Deploy] script["vLLM serve 脚本\nCLI 与 kv extra"] conv["vllm_to_motor\nCLI大于kv"] uc["user_config\nPP nnodes master-port"] end subgraph control [Control Plane] nm0["NodeManager node_rank=0"] nm1["NodeManager node_rank=1"] asm["InstanceAssembler"] end subgraph engine [Engine] es0["EngineServer PP stage0"] es1["EngineServer PP stage1 headless"] end script --> conv --> uc uc --> nm0 uc --> nm1 nm0 -->|"Register local_world_size"| asm nm1 -->|"Register local_world_size"| asm asm -->|"StartCmd master_dp_ip/node_rank"| nm0 asm -->|"StartCmd"| nm1 nm0 --> es0 nm1 --> es1 es0 <-->|"master-port rendezvous"| es1 ## **3. 资料变更** 不涉及仓库内用户文档更新(Deployer README / 跨机说明未改)。 ## **4. 接口变更** 涉及配置约定(客户面可见): - Prefill 跨机 PP 需配置 pipeline_parallel_size、nnodes、master-port;**不要**配置 master-addr / node-rank - Deployer 从 vLLM 脚本转换时会自动生成上述项;pipeline_parallel_size 不再被强制改写为 1 - Deployer 并行度语义:--data/tensor/pipeline-parallel-size 正整数优先于 kv extra 的 dp_size/tp_size/pp_size;二者皆无时 dp/tp 走手动占位提示,pp 缺省为 1 - 无新增/变更 HTTP API ## **5. 测试结果** (自行补充) ## **6. CheckList** [x] 代码注释完备 [x] 正确记录维测日志 [x] 是否有UT用例 [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-Motor!653 | 1 个月前 | |
[feature] kv-conductor /query 支持 msgpack 编码,10倍性能收益 Co-authored-by: 吕有辉<lvyouhui@huawei.com> # message auto-generated for no-merge-commit merge: !687 merge opt/kv_conductor_query_msgpack into master [feature] kv-conductor /query 支持 msgpack 编码,10倍性能收益 Created-by: codeDogPro Commit-by: 吕有辉 Merged-by: tobking Description: ## 1. 合入背景 为 kv-conductor 的 /query 与 /query_by_hash 增加 MessagePack 编解码支持,并在 Coordinator 端到端打通(ConductorApiClient.query_conductor 默认走 msgpack)。长上下文(1M/5M token)场景下,KV 亲和性查询的请求体积与编解码耗时显著下降。 借鉴 Mooncake conductor #3258 的 Content-Type 分派方案;与 KV Conductor 的前缀索引能力(#338 对应的自研 kv-conductor)配套演进。 关联 ISSUE:[#455](https://gitcode.com/Ascend/MindIE-Motor/issues/455) ## 2. 修改内容 1. **kv-conductor(Rust,motor/kv_conductor/)** - /query、/query_by_hash 按请求 Content-Type 分派:application/msgpack → rmp_serde 解码请求,响应/错误/空结果用 rmp::encode 手工编码;其他 Content-Type 走原 JSON 路径(行为不变)。 - 响应侧手工编码的原因:QueryResponse 使用 #[serde(flatten)](tenants 展开到顶层 map),msgpack 序列化器不支持 flatten——手工编码保证 msgpack wire 形状与 JSON 逐字节等价,并有单元测试(rmpv→serde_json 结构化对比)守护。 - QueryRequest / QueryByHashRequest 增加 Serialize(原仅 Deserialize)。 2. **Coordinator(Python)** - ConductorApiClient:新增 encode_query_msgpack / decode_query_response_msgpack(msgspec),query_conductor() 按 kv_conductor_config.query_encoding(默认 "msgpack")分派;响应按服务器 Content-Type 解析(msgpack → msgspec,否则 JSON),**旧版 JSON-only conductor 自动兼容,无需配置切换**。 - SafeHTTPSClient 新增 post_bytes()(原始 body POST)。 - KvConductorConfig 新增 query_encoding 配置项。 3. **测试** - Rust:单元测试 120(新增 msgpack 往返、wire 形状等价、Content-Type 嗅探、错误/空结果编码)+ 集成测试 20(新增 msgpack/JSON 查询结果一致、msgpack /query_by_hash、404/400 错误路径按请求编码返回);cargo clippy -D warnings、cargo fmt 通过。 - Python:api_client 44(新增 msgpack wire 格式断言、json 配置路径、legacy JSON 响应 fallback)、coordinator 模块 1155 全过。 - 性能验证使用临时 benchmark 脚本(真实 conductor 进程 + client 真实编解码路径),bench 属验证工具未随 PR 上库。 ## 3. 资料变更 涉及: - docs/zh/user_guide/configuration/config_reference.md:新增 kv_conductor_config.query_encoding 配置说明。 - skill reference(.agent/skills/motor-dev/references/coordinator.md、kv-conductor.md):新增 msgpack 编解码章节与端到端数据,并修正两处过时内容(服务端加权评分模型已移除、src/indexer.rs → src/indexer/ 目录)。 ## 4. 接口变更 涉及(客户面可见): - POST /query、POST /query_by_hash 新增 Content-Type: application/msgpack 请求编码支持,响应随请求编码返回(JSON 默认行为不变,向后兼容)。 - Coordinator 配置新增 kv_conductor_config.query_encoding(默认 "msgpack";对接旧版 conductor 可配 "json")。 ## 5. 测试结果 **性能收益**(真实 kv-conductor release 进程 + Coordinator client 真实编解码路径,best-of-5,DeepSeek V4 风格长上下文): === 1M tokens(block_size=128)=== step JSON msgpack 提速 请求体积 encode 29.92 ms 2.89 ms 10.4x 6.65MB -> 2.99MB (-55%) HTTP RTT 45.63 ms 12.07 ms 3.78x (客户端序列化+服务端XXH3哈希/树匹配/序列化+网络) TOTAL 45.63 ms 12.07 ms 3.78x === 5M tokens(block_size=128)=== encode 149.8 ms 14.4 ms 10.4x 33.3MB -> 14.9MB (-55%) HTTP RTT 220.5 ms 41.9 ms 5.26x TOTAL 220.5 ms 41.9 ms 5.26x - 5M 上下文单次查询省 ~178ms,1M 省 ~34ms;请求体积减半(网络传输同步受益)。 - 收益来源:客户端 msgspec 编码(10x)、服务端 rmp 解析 vs serde_json(RTT 内体现)、传输字节减半。 **短上下文覆盖**(1 ~ 16K tokens,纯编解码,msgspec vs json.dumps/loads,best-of-20000): tokens | json enc msgpack enc | json dec msgpack dec 1 | 1.07us 0.12us | 1.19us 0.21us 64 | 2.83us 0.27us | 2.94us 0.51us 1024 | 26.44us 2.31us | 26.44us 7.96us 16384 | 437.67us 32.82us | 430.86us 148.58us - 全长度区间(1 ~ 16K token)msgpack 均更快:1 token 时亦快 ~9x(编码 0.12us vs 1.07us); - **无临界点、无负收益**——msgspec 为纯 C 实现,固定开销(~0.1-0.2us)低于 json.dumps/loads 的固定开销(~1-1.2us),短上下文(普通对话场景)同样占优; - 默认 query_encoding: "msgpack" 在短/长上下文下均无回归。 **功能测试**: - cargo test:120 单元 + 20 集成全过; - bash tests/run_tests.sh tests/coordinator/:1155 用例全过; - pre-commit 全量通过(ruff/pylint/bandit/cargo clippy/fmt 等)。 **测试场景**:单元(编解码往返/等价性)、集成(HTTP Content-Type 协商、错误路径、JSON 兼容)、端到端(1M/5M 长上下文性能)。精度/显存不涉及(无模型运行)。 ## 6. CheckList - [x] 代码注释完备 - [x] 正确记录维测日志 - [x] 是否有UT用例(120 Rust 单元 + 20 集成 + 44 Python 单测) - [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题(查询路径只读锁语义未变,msgpack 编解码为无状态纯函数) See merge request: Ascend/MindIE-Motor!687 | 1 个月前 | |
[feature] 支持 Prefill 跨机 Pipeline Parallel 拉起 Co-authored-by: Jechin<yuzechen1@huawei.com> # message auto-generated for no-merge-commit merge: !653 merge feature/prefill-cross-node-pp into master [feature] 支持 Prefill 跨机 Pipeline Parallel 拉起 Created-by: Jechin Commit-by: Jechin Merged-by: towncharlie Description: ## **1. 合入背景** Fixes [#389](https://gitcode.com/Ascend/MindIE-Motor/issues/389) Prefill 跨机 Pipeline Parallel(如 TP=16、PP=2、nnodes=2)场景下,控制面仍按“单机并行积”计算 local_world_size(pcp×tp×pp),导致本机设备数校验失败、Endpoint 为空;同时 master_addr=placeholder / 静态 node_rank 会盖住运行时注入,分布式初始化无法连通。Assembler 在无 Endpoint 时还会误报 start 成功。本 PR 补齐跨机 PP 与跨机 PCP 共用的 nnodes 路径,并让 Deployer 从 vLLM 脚本正确生成 PP/nnodes 配置;并行度读取统一为 CLI 整数优先、缺省回退 kv_connector_extra_config(含 pp_size)。 ## **2. 修改内容** 1. **NodeManager 配置**(motor/config/node_manager.py) - 跨机时按 (pcp×tp×pp)//nnodes 折算本机 local_world_size(覆盖 PP/PCP) - pcp×pp 不能被 nnodes 整除时直接报错,避免错误拓扑静默通过 2. **EngineServer VLLMConfig**(motor/engine_server/core/vllm/vllm_config.py) - 跨机场景强制覆盖 master_addr / node_rank / headless,不再被 placeholder 挡住 - Mooncake kv extra 合并并行度时保留用户字段(如 pp_layer_partition) 3. **Controller InstanceAssembler**(motor/controller/core/instance_assembler.py) - 所有 NodeManager 均无 Endpoint 时,_send_start_command 返回失败并打 ERROR,禁止假成功 4. **Deployer 转换**(examples/deployer/config_tool/vllm_to_motor.py) - 保留并正确写出 pipeline_parallel_size,按 tp×pp 推导 Pod / nnodes - 跨机时写入 nnodes / master-port;不写 master-addr / node-rank(运行时注入) - **dp/tp/pp 统一读取优先级**:命令行给了正整数用 CLI,否则回退 kv_connector_extra_config 的 dp_size / tp_size / pp_size(kv 中的 size 在写出前剥离) - 去除硬件侧强制 remap tp/dp;infer_*_motor_deploy_config 回传 nnodes,与跨机 engine 注入共用一次 _infer_pod_layout - 抽取 hybrid 默认 deploy / 权重挂载路径 / preset+cards 等重复逻辑,降低漂移风险 5. **UT** - 覆盖 PP 折算、不可整除、placeholder 覆盖、kv 字段保留、空 Endpoint start 失败 - Deployer:CLI>kv、仅 kv 回退(含 pp_size)、跨机 nnodes/master-port、跳过脚本透传多机键等 **进程视图** mermaid flowchart LR subgraph deploy [Deploy] script["vLLM serve 脚本\nCLI 与 kv extra"] conv["vllm_to_motor\nCLI大于kv"] uc["user_config\nPP nnodes master-port"] end subgraph control [Control Plane] nm0["NodeManager node_rank=0"] nm1["NodeManager node_rank=1"] asm["InstanceAssembler"] end subgraph engine [Engine] es0["EngineServer PP stage0"] es1["EngineServer PP stage1 headless"] end script --> conv --> uc uc --> nm0 uc --> nm1 nm0 -->|"Register local_world_size"| asm nm1 -->|"Register local_world_size"| asm asm -->|"StartCmd master_dp_ip/node_rank"| nm0 asm -->|"StartCmd"| nm1 nm0 --> es0 nm1 --> es1 es0 <-->|"master-port rendezvous"| es1 ## **3. 资料变更** 不涉及仓库内用户文档更新(Deployer README / 跨机说明未改)。 ## **4. 接口变更** 涉及配置约定(客户面可见): - Prefill 跨机 PP 需配置 pipeline_parallel_size、nnodes、master-port;**不要**配置 master-addr / node-rank - Deployer 从 vLLM 脚本转换时会自动生成上述项;pipeline_parallel_size 不再被强制改写为 1 - Deployer 并行度语义:--data/tensor/pipeline-parallel-size 正整数优先于 kv extra 的 dp_size/tp_size/pp_size;二者皆无时 dp/tp 走手动占位提示,pp 缺省为 1 - 无新增/变更 HTTP API ## **5. 测试结果** (自行补充) ## **6. CheckList** [x] 代码注释完备 [x] 正确记录维测日志 [x] 是否有UT用例 [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-Motor!653 | 1 个月前 | |
[feature] kv-conductor /query 支持 msgpack 编码,10倍性能收益 Co-authored-by: 吕有辉<lvyouhui@huawei.com> # message auto-generated for no-merge-commit merge: !687 merge opt/kv_conductor_query_msgpack into master [feature] kv-conductor /query 支持 msgpack 编码,10倍性能收益 Created-by: codeDogPro Commit-by: 吕有辉 Merged-by: tobking Description: ## 1. 合入背景 为 kv-conductor 的 /query 与 /query_by_hash 增加 MessagePack 编解码支持,并在 Coordinator 端到端打通(ConductorApiClient.query_conductor 默认走 msgpack)。长上下文(1M/5M token)场景下,KV 亲和性查询的请求体积与编解码耗时显著下降。 借鉴 Mooncake conductor #3258 的 Content-Type 分派方案;与 KV Conductor 的前缀索引能力(#338 对应的自研 kv-conductor)配套演进。 关联 ISSUE:[#455](https://gitcode.com/Ascend/MindIE-Motor/issues/455) ## 2. 修改内容 1. **kv-conductor(Rust,motor/kv_conductor/)** - /query、/query_by_hash 按请求 Content-Type 分派:application/msgpack → rmp_serde 解码请求,响应/错误/空结果用 rmp::encode 手工编码;其他 Content-Type 走原 JSON 路径(行为不变)。 - 响应侧手工编码的原因:QueryResponse 使用 #[serde(flatten)](tenants 展开到顶层 map),msgpack 序列化器不支持 flatten——手工编码保证 msgpack wire 形状与 JSON 逐字节等价,并有单元测试(rmpv→serde_json 结构化对比)守护。 - QueryRequest / QueryByHashRequest 增加 Serialize(原仅 Deserialize)。 2. **Coordinator(Python)** - ConductorApiClient:新增 encode_query_msgpack / decode_query_response_msgpack(msgspec),query_conductor() 按 kv_conductor_config.query_encoding(默认 "msgpack")分派;响应按服务器 Content-Type 解析(msgpack → msgspec,否则 JSON),**旧版 JSON-only conductor 自动兼容,无需配置切换**。 - SafeHTTPSClient 新增 post_bytes()(原始 body POST)。 - KvConductorConfig 新增 query_encoding 配置项。 3. **测试** - Rust:单元测试 120(新增 msgpack 往返、wire 形状等价、Content-Type 嗅探、错误/空结果编码)+ 集成测试 20(新增 msgpack/JSON 查询结果一致、msgpack /query_by_hash、404/400 错误路径按请求编码返回);cargo clippy -D warnings、cargo fmt 通过。 - Python:api_client 44(新增 msgpack wire 格式断言、json 配置路径、legacy JSON 响应 fallback)、coordinator 模块 1155 全过。 - 性能验证使用临时 benchmark 脚本(真实 conductor 进程 + client 真实编解码路径),bench 属验证工具未随 PR 上库。 ## 3. 资料变更 涉及: - docs/zh/user_guide/configuration/config_reference.md:新增 kv_conductor_config.query_encoding 配置说明。 - skill reference(.agent/skills/motor-dev/references/coordinator.md、kv-conductor.md):新增 msgpack 编解码章节与端到端数据,并修正两处过时内容(服务端加权评分模型已移除、src/indexer.rs → src/indexer/ 目录)。 ## 4. 接口变更 涉及(客户面可见): - POST /query、POST /query_by_hash 新增 Content-Type: application/msgpack 请求编码支持,响应随请求编码返回(JSON 默认行为不变,向后兼容)。 - Coordinator 配置新增 kv_conductor_config.query_encoding(默认 "msgpack";对接旧版 conductor 可配 "json")。 ## 5. 测试结果 **性能收益**(真实 kv-conductor release 进程 + Coordinator client 真实编解码路径,best-of-5,DeepSeek V4 风格长上下文): === 1M tokens(block_size=128)=== step JSON msgpack 提速 请求体积 encode 29.92 ms 2.89 ms 10.4x 6.65MB -> 2.99MB (-55%) HTTP RTT 45.63 ms 12.07 ms 3.78x (客户端序列化+服务端XXH3哈希/树匹配/序列化+网络) TOTAL 45.63 ms 12.07 ms 3.78x === 5M tokens(block_size=128)=== encode 149.8 ms 14.4 ms 10.4x 33.3MB -> 14.9MB (-55%) HTTP RTT 220.5 ms 41.9 ms 5.26x TOTAL 220.5 ms 41.9 ms 5.26x - 5M 上下文单次查询省 ~178ms,1M 省 ~34ms;请求体积减半(网络传输同步受益)。 - 收益来源:客户端 msgspec 编码(10x)、服务端 rmp 解析 vs serde_json(RTT 内体现)、传输字节减半。 **短上下文覆盖**(1 ~ 16K tokens,纯编解码,msgspec vs json.dumps/loads,best-of-20000): tokens | json enc msgpack enc | json dec msgpack dec 1 | 1.07us 0.12us | 1.19us 0.21us 64 | 2.83us 0.27us | 2.94us 0.51us 1024 | 26.44us 2.31us | 26.44us 7.96us 16384 | 437.67us 32.82us | 430.86us 148.58us - 全长度区间(1 ~ 16K token)msgpack 均更快:1 token 时亦快 ~9x(编码 0.12us vs 1.07us); - **无临界点、无负收益**——msgspec 为纯 C 实现,固定开销(~0.1-0.2us)低于 json.dumps/loads 的固定开销(~1-1.2us),短上下文(普通对话场景)同样占优; - 默认 query_encoding: "msgpack" 在短/长上下文下均无回归。 **功能测试**: - cargo test:120 单元 + 20 集成全过; - bash tests/run_tests.sh tests/coordinator/:1155 用例全过; - pre-commit 全量通过(ruff/pylint/bandit/cargo clippy/fmt 等)。 **测试场景**:单元(编解码往返/等价性)、集成(HTTP Content-Type 协商、错误路径、JSON 兼容)、端到端(1M/5M 长上下文性能)。精度/显存不涉及(无模型运行)。 ## 6. CheckList - [x] 代码注释完备 - [x] 正确记录维测日志 - [x] 是否有UT用例(120 Rust 单元 + 20 集成 + 44 Python 单测) - [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题(查询路径只读锁语义未变,msgpack 编解码为无状态纯函数) See merge request: Ascend/MindIE-Motor!687 | 1 个月前 | |
[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 | 1 个月前 | |
[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 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 |