| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
在P节点tokenizer后,校验请求长度+最大输出长度 > 模型上下文长度, 避免P产生KV cache残留问题 Co-authored-by: tobking<wangjun292@huawei.com> # message auto-generated for no-merge-commit merge: !513 merge pd-handoff-context-precheck into master 在P节点tokenizer后,校验请求长度+最大输出长度 > 模型上下文长度, 避免P产生KV cache残留问题 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替代. [#309](https://gitcode.com/Ascend/MindIE-PyMotor/issues/309) ## **2. 修改内容** > 请<ins>**描述修改内容的具体实现**</ins>,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列。 > 如果是需求或者重构类的PR,需要<ins>**补充详细设计文档**</ins>(说明上下游组件关系、时序图、类图、DFX能力等内容)。 Coordinator 在构造 _motor_dispatch 时,从原始 req_info.req_data 提取输出预算: 优先使用 max_completion_tokens; 否则使用 max_tokens。 为 MotorDispatch 增加可选字段 original_max_output_tokens,并随 dispatch 传递至 P 实例。 P 侧 vLLM adapter 从 MotorDispatch 读取该字段。 在 prompt render/tokenizer 完成后,校验: ## **3. 资料变更** > 请确认<ins>**是否涉及资料变更**</ins>。\ > 如涉及,需要在PR中体现,并简要说明修改内容。\ > 如不涉及,需填写“不涉及”。 不涉及 ## **4. 接口变更** > 请确认<ins>**是否涉及跨代码仓或者客户面可见的接口变更**</ins>。\ > 如涉及,需详细说明接口以及对应的变更内容,同时需要在资料中体现。\ > 如不涉及,需填写“不涉及”。 不涉及 ## **5. 测试结果** > 需体现<ins>**测试场景,测试方法以及测试结果**</ins>。\ > 测试用例设计时需考虑硬件、部署方式、功能、性能、精度、显存等维度。 ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [ ] 代码注释完备 [ ] 正确记录维测日志 [ ] 是否有UT用例 [ ] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!513 | 20 天前 | |
engine server错误码处理与引擎侧保持一致 Co-authored-by: tobking<wangjun292@huawei.com> # message auto-generated for no-merge-commit merge: !450 merge engine-vllm-validation-error-response into master 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替代. engine server当前基于错误信息匹配错误码,处理流程与vllm原生不一致。需要对齐。 [#281](https://gitcode.com/Ascend/MindIE-PyMotor/issues/281) ## **2. 修改内容** > 请<ins>**描述修改内容的具体实现**</ins>,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列。 > 如果是需求或者重构类的PR,需要<ins>**补充详细设计文档**</ins>(说明上下游组件关系、时序图、类图、DFX能力等内容)。 对齐vllm 原生处理错误码逻辑 ## **3. 资料变更** > 请确认<ins>**是否涉及资料变更**</ins>。\ > 如涉及,需要在PR中体现,并简要说明修改内容。\ > 如不涉及,需填写“不涉及”。 ## **4. 接口变更** > 请确认<ins>**是否涉及跨代码仓或者客户面可见的接口变更**</ins>。\ > 如涉及,需详细说明接口以及对应的变更内容,同时需要在资料中体现。\ > 如不涉及,需填写“不涉及”。 ## **5. 测试结果** > 需体现<ins>**测试场景,测试方法以及测试结果**</ins>。\ > 测试用例设计时需考虑硬件、部署方式、功能、性能、精度、显存等维度。 ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [ ] 代码注释完备 [ ] 正确记录维测日志 [ ] 是否有UT用例 [ ] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!450 | 23 天前 | |
[feature] EngineServer支持原生命令拉起vLLM或SGLang Co-authored-by: zhoujing101<zhoujing101@huawei.com> Co-authored-by: gitcode-bot<noreply@gitcode.com> # message auto-generated for no-merge-commit merge: !399 merge EPD_2 into master [feature] EngineServer支持原生命令拉起vLLM或SGLang Created-by: zhoujing101 Commit-by: zhoujing101;gitcode-bot Merged-by: towncharlie Description: ## **1. 合入背景** [#234](https://gitcode.com/Ascend/MindIE-PyMotor/issues/234) 当前 EngineServer CLI 启动 vLLM/SGLang 时采用侵入式(in-process)方式,引擎以 Python 库的形式嵌入到 MindIE 进程中运行。这种方式耦合较紧,不利于独立调试和问题定位。 现新增**原生启动模式**:通过常量 NATIVE_LAUNCH_ENABLED 控制,当设置为 True 时,引擎通过原生命令(vllm serve ... / python3 -m sglang.launch_server ...)以子进程方式启动,拉起参数与侵入式模式保持一致。同时保留管理端口(MgmtEndpoint)的健康检查和指标采集能力。 ## **2. 修改内容** ### 2.1 接口层:IConfig 新增 get_cli_args 方法 **涉及文件:** motor/engine_server/core/config.py 在 IConfig 抽象接口中新增方法 get_cli_args() -> list[str],返回适用于原生 CLI 启动的参数列表。 ### 2.2 vLLM 引擎:实现 get_cli_args **涉及文件:** motor/engine_server/core/vllm/vllm_config.py 通过 _get_param_list() 获取 vLLM CLI 参数列表,供原生 vllm serve 命令使用。 ### 2.3 SGLang 引擎:实现 get_cli_args **涉及文件:** motor/engine_server/core/sglang/sglang_config.py 通过 _get_param_list() 获取 SGLang CLI 参数列表,供原生 python3 -m sglang.launch_server 命令使用。 ### 2.4 CLI 主入口:新增原生启动逻辑 **涉及文件:** motor/engine_server/cli/main.py | 变更项 | 说明 | |--------|------| | 新增常量 NATIVE_LAUNCH_ENABLED | 布尔常量,False 时走侵入式路径(向后兼容),设为 True 启用原生启动 | | 新增函数 _build_native_launch_cmd | 根据 engine_type 构建原生命令:vllm serve <args> / python3 -m sglang.launch_server <args> | | 新增函数 _run_native | 通过 subprocess.Popen 启动子进程,注册 SIGTERM/SIGINT 信号转发给子进程,退出时恢复旧信号处理器 | | 新增函数 _run_native_mode | 封装原生启动完整生命周期:MgmtEndpoint + 子进程 + 清理 | | 新增函数 _log_safe_cmd | 使用 shlex.quote() 安全格式化命令用于日志输出 | | 修改 main() | 判断 NATIVE_LAUNCH_ENABLED,原生模式下通过 _run_native_mode 统一管理各组件生命周期 | **信号处理安全增强:** - 注册信号前保存旧处理器,process.wait() 退出后在 finally 块中恢复,避免影响上层调用者 **原生启动流程:** main() ├─ 解析配置 (ConfigFactory.parse) ├─ _run_native_mode(endpoint_config, config) │ ├─ 创建 MgmtEndpoint 并 run() (管理端口在守护线程中运行) │ ├─ _run_native(config) │ │ ├─ 构建原生命令: vllm serve ... │ │ ├─ subprocess.Popen 启动子进程 │ │ ├─ 保存旧信号处理器,注册 SIGTERM/SIGINT → 转发给子进程 │ │ ├─ process.wait() 阻塞等待 │ │ └─ 恢复旧信号处理器 │ └─ finally: mgmt_endpoint.shutdown()清理 └─ return ### 2.5 测试前置:conftest **新增文件:** tests/engine_server/cli/conftest.py 仅安装 vllm 模块 fakes(其他测试不会导入 vllm),避免全局 sys.modules 污染。 ### 2.6 功能测试用例 **新增文件:** tests/engine_server/cli/test_main_native_launch.py 共 12 个测试用例,覆盖命令构建、原生路由、子进程启动三部分。路由测试通过 patch.object 直接修改 NATIVE_LAUNCH_ENABLED 常量进行测试。 ### 2.7 启用方式 | 方式 | 行为 | |------|------| | NATIVE_LAUNCH_ENABLED = False(默认) | 侵入式 in-process 启动(向后兼容) | | NATIVE_LAUNCH_ENABLED = True | 原生 CLI 子进程启动,同时运行管理端口 | ### 2.8 安全加固 | 措施 | 说明 | |------|------| | engine_type whitelist | 仅允许 vllm / sglang 作为引擎类型 | | subprocess.Popen list 模式 | 无 shell=True,参数以字面量传递,不被 shell 解释 | | _log_safe_cmd() | 日志中使用 shlex.quote() 转义含空格的参数,防止日志注入 | | 信号处理器 save/restore | signal.signal() 保存旧处理器,finally 块恢复,避免干扰上层调用方 | ## **3. 资料变更** 不涉及。 ## **4. 接口变更** 不涉及。 ## **5. 测试结果** **12/12 passed** · Python 3.11.15 · pytest 9.0.2 | 测试类 | 用例数 | 覆盖内容 | 结果 | |--------|--------|----------|------| | TestBuildNativeLaunchCmd | 6 | _build_native_launch_cmd: vLLM/SGLang 命令结构、空参数、不支持引擎 | ✅ | | TestMainNativeLaunchRouting | 3 | main() 路由:NATIVE_LAUNCH_ENABLED=True → 原生、False → 侵入式 | ✅ | | TestRunNative | 3 | _run_native: Popen 调用参数、信号注册与恢复、wait 阻塞 | ✅ | ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [x] 代码注释完备 [x] 正确记录维测日志 [x] 是否有UT用例 [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!399 | 28 天前 | |
add storage feature Co-authored-by: supermario_leo<leo.stack@outlook.com> # message auto-generated for no-merge-commit merge: !440 merge feature_add_ucm into master add storage feature Created-by: leo6393 Commit-by: supermario_leo Merged-by: towncharlie Description: ## **1. 合入背景** 在分布式 PD 架构上接入 **UCMConnector** 作为 KV 存储层,为 Prefill 节点提供前缀缓存(prefix cache)复用能力,降低重复前缀的 TTFT、提升整体吞吐。 由于 UCM 的 storage_backends 需要一块 **P/D 跨节点共享**的持久化存储,本分支同时补齐了通用的**引擎 Pod 存储能力**(不绑定 UCM),作为 UCM 前缀缓存池的落盘载体。 - 关联特性:UCM 前缀缓存接入(分布式 PD) - 不涉及对既有 PR 问题的修复 ## **2. 修改内容** 1. **UCM Connector 接入(motor/engine_server/core/vllm/vllm_config.py)** - MultiConnector 场景下识别 connectors[1] = UCMConnector:提前处理并强制 kv_role = kv_both(UCM 在 P/D 两端均双向 store),**不注入任何 rpc port**,避免污染 UCM 的内联 kv_connector_extra_config,处理后 return early。 - 独立 UCMConnector 在 prefill/decode 角色下 **fail loud**(该拓扑需额外 dispatch/profile 工作,当前不支持);union 角色原样透传。 - AscendStoreConnector / MooncakeStore 分支行为保持不变,报错信息修正为打印实际 connector 名。 2. **端口注入适配(motor/config/endpoint.py、motor/config/node_manager.py)** - MultiConnector 组装时,UCM store 无 lookup_rpc_port。改用 .get() 判断 connector 类型,**仅跳过 UCM**;其余 store(如 AscendStore)保持直接索引 —— 真正缺失端口时仍按原逻辑 fail fast,不被静默跳过。 3. **常量新增(motor/engine_server/constants/constants.py、motor/config/node_manager.py)** - UCM_CONNECTOR = "UCMConnector"、KV_BOTH = "kv_both"、KV_CONNECTOR_MODULE_PATH。 4. **通用引擎 Pod 存储能力(新增 examples/deployer/lib/generator/storage.py)** - motor_deploy_config.storage 为**列表**,每条目必须声明 type: - pvc —— 两种互斥模式:storage_class_name 动态创建 PVC / claim_name **挂载已有 PVC**(不生成 PVC 对象,且与 size/access_mode/storage_class_name 互斥,混填/漏填均 fail loud;claim_name 用于非 pvc 类型也会被拒绝)。 - nfs —— k8s 原生 NFS 卷直挂(server+path),无需 CSI/供给器。 - hostpath —— 节点本地目录直挂。 - dshm_size —— 独立抬高 /dev/shm emptyDir sizeLimit(容纳 UCM CacheStore),带无单位值校验。 - 挂载逻辑幂等,复用到 engine.py / infer_service.py / single_container.py 三条部署路径;卷名/动态 PVC 名按序号自动生成(mindie-motor-store-<i>)。 5. **示例与镜像** - examples/infer_engines/vllm/ucm_pd/(README + user_config.json):分布式 PD + UCM 内联配置示例。 - docker/mindie-motor-vllm-ucm/(Dockerfile + README):UCM 叠加镜像。 ## **3. 资料变更** **涉及。** - 新增 examples/infer_engines/vllm/ucm_pd/README.md:UCM 前缀缓存拓扑、存储三种类型(pvc/nfs/hostpath)字段表、动态创建 / 挂已有 PVC(claim_name)两种写法示例、dshm_size 说明及硬约束(storage_backends == mount_path)。 - 新增 docker/mindie-motor-vllm-ucm/README.md:UCM 叠加镜像构建说明。 ## **4. 接口变更** **涉及客户面可见的配置项变更(user_config.json),不涉及跨代码仓 API 变更。** - kv_connector 支持 UCMConnector,及 MultiConnector 中内嵌 UCM 作为 connectors[1];需配套 kv_connector_module_path。 - motor_deploy_config 新增 storage 列表(type: pvc/nfs/hostpath,pvc 支持 claim_name 挂已有卷)与 dshm_size。 - 均为新增可选项,对存量配置向后兼容。 ## **5. 测试结果** 新增 / 覆盖 UT: | 用例文件 | 用例数 | 覆盖场景 | |---|---|---| | tests/examples/deployer/test_storage.py | 22 | pvc/nfs/hostpath 三类挂载;pvc 动态创建 vs claim_name 挂已有;参数互斥与缺失校验;非 pvc 类型拒绝 claim_name;多条目/同 claim 多挂载点;挂载幂等;dshm_size 设置与无单位校验 | | tests/engine_server/core/test_vllm_config.py | 13 | UCM kv_role=kv_both、不注入端口;独立 UCM 在 P/D 角色 fail loud;MultiConnector 内嵌 UCM;既有 mooncake/ascend 分支回归 | | tests/node_manager/test_config.py | 33 | MultiConnector 组装跳过 UCM 端口注入;非 UCM store 缺端口仍 fail fast | - 部署方式维度:覆盖 Deployment(engine)、InferServiceSet、single-container 三条路径的存储挂载。 - 本地已执行 deployer UT 套件:54 passed;test_vllm_config.py / test_config.py 依赖运行时环境,请在集成环境执行确认。 - 建议补充:UCM 叠加镜像 + 实机分布式 PD 端到端前缀缓存命中 / TTFT 验证。 ## **6. CheckList** - [x] 代码注释完备 - [x] 正确记录维测日志 - [x] 是否有UT用例 - [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题(本次改动为配置解析 / YAML 生成,无新增多线程逻辑) See merge request: Ascend/MindIE-PyMotor!440 | 16 天前 | |
【fix】修复engine server kv_transfer_config错误问题 Co-authored-by: 吕有辉<lvyouhui@huawei.com> # message auto-generated for no-merge-commit merge: !298 merge fix_engine_server_bug into master 【fix】修复engine server kv_transfer_config错误问题 Created-by: codeDogPro Commit-by: 吕有辉 Merged-by: ascend-robot Description: ## **1. 合入背景** 修复问题单bug ## **2. 修改内容** 1、删除冗余代码 2、修复错误配置kv_transfer_extra_config ## **3. 资料变更** 涉及 ## **4. 接口变更** 不涉及 ## **5. 测试结果** 自验证ok ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [x] 代码注释完备 [x] 正确记录维测日志 [x] 是否有UT用例 [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-pyMotor-private!298 | 4 个月前 | |
[feature] EngineServer支持原生命令拉起vLLM或SGLang Co-authored-by: zhoujing101<zhoujing101@huawei.com> Co-authored-by: gitcode-bot<noreply@gitcode.com> # message auto-generated for no-merge-commit merge: !399 merge EPD_2 into master [feature] EngineServer支持原生命令拉起vLLM或SGLang Created-by: zhoujing101 Commit-by: zhoujing101;gitcode-bot Merged-by: towncharlie Description: ## **1. 合入背景** [#234](https://gitcode.com/Ascend/MindIE-PyMotor/issues/234) 当前 EngineServer CLI 启动 vLLM/SGLang 时采用侵入式(in-process)方式,引擎以 Python 库的形式嵌入到 MindIE 进程中运行。这种方式耦合较紧,不利于独立调试和问题定位。 现新增**原生启动模式**:通过常量 NATIVE_LAUNCH_ENABLED 控制,当设置为 True 时,引擎通过原生命令(vllm serve ... / python3 -m sglang.launch_server ...)以子进程方式启动,拉起参数与侵入式模式保持一致。同时保留管理端口(MgmtEndpoint)的健康检查和指标采集能力。 ## **2. 修改内容** ### 2.1 接口层:IConfig 新增 get_cli_args 方法 **涉及文件:** motor/engine_server/core/config.py 在 IConfig 抽象接口中新增方法 get_cli_args() -> list[str],返回适用于原生 CLI 启动的参数列表。 ### 2.2 vLLM 引擎:实现 get_cli_args **涉及文件:** motor/engine_server/core/vllm/vllm_config.py 通过 _get_param_list() 获取 vLLM CLI 参数列表,供原生 vllm serve 命令使用。 ### 2.3 SGLang 引擎:实现 get_cli_args **涉及文件:** motor/engine_server/core/sglang/sglang_config.py 通过 _get_param_list() 获取 SGLang CLI 参数列表,供原生 python3 -m sglang.launch_server 命令使用。 ### 2.4 CLI 主入口:新增原生启动逻辑 **涉及文件:** motor/engine_server/cli/main.py | 变更项 | 说明 | |--------|------| | 新增常量 NATIVE_LAUNCH_ENABLED | 布尔常量,False 时走侵入式路径(向后兼容),设为 True 启用原生启动 | | 新增函数 _build_native_launch_cmd | 根据 engine_type 构建原生命令:vllm serve <args> / python3 -m sglang.launch_server <args> | | 新增函数 _run_native | 通过 subprocess.Popen 启动子进程,注册 SIGTERM/SIGINT 信号转发给子进程,退出时恢复旧信号处理器 | | 新增函数 _run_native_mode | 封装原生启动完整生命周期:MgmtEndpoint + 子进程 + 清理 | | 新增函数 _log_safe_cmd | 使用 shlex.quote() 安全格式化命令用于日志输出 | | 修改 main() | 判断 NATIVE_LAUNCH_ENABLED,原生模式下通过 _run_native_mode 统一管理各组件生命周期 | **信号处理安全增强:** - 注册信号前保存旧处理器,process.wait() 退出后在 finally 块中恢复,避免影响上层调用者 **原生启动流程:** main() ├─ 解析配置 (ConfigFactory.parse) ├─ _run_native_mode(endpoint_config, config) │ ├─ 创建 MgmtEndpoint 并 run() (管理端口在守护线程中运行) │ ├─ _run_native(config) │ │ ├─ 构建原生命令: vllm serve ... │ │ ├─ subprocess.Popen 启动子进程 │ │ ├─ 保存旧信号处理器,注册 SIGTERM/SIGINT → 转发给子进程 │ │ ├─ process.wait() 阻塞等待 │ │ └─ 恢复旧信号处理器 │ └─ finally: mgmt_endpoint.shutdown()清理 └─ return ### 2.5 测试前置:conftest **新增文件:** tests/engine_server/cli/conftest.py 仅安装 vllm 模块 fakes(其他测试不会导入 vllm),避免全局 sys.modules 污染。 ### 2.6 功能测试用例 **新增文件:** tests/engine_server/cli/test_main_native_launch.py 共 12 个测试用例,覆盖命令构建、原生路由、子进程启动三部分。路由测试通过 patch.object 直接修改 NATIVE_LAUNCH_ENABLED 常量进行测试。 ### 2.7 启用方式 | 方式 | 行为 | |------|------| | NATIVE_LAUNCH_ENABLED = False(默认) | 侵入式 in-process 启动(向后兼容) | | NATIVE_LAUNCH_ENABLED = True | 原生 CLI 子进程启动,同时运行管理端口 | ### 2.8 安全加固 | 措施 | 说明 | |------|------| | engine_type whitelist | 仅允许 vllm / sglang 作为引擎类型 | | subprocess.Popen list 模式 | 无 shell=True,参数以字面量传递,不被 shell 解释 | | _log_safe_cmd() | 日志中使用 shlex.quote() 转义含空格的参数,防止日志注入 | | 信号处理器 save/restore | signal.signal() 保存旧处理器,finally 块恢复,避免干扰上层调用方 | ## **3. 资料变更** 不涉及。 ## **4. 接口变更** 不涉及。 ## **5. 测试结果** **12/12 passed** · Python 3.11.15 · pytest 9.0.2 | 测试类 | 用例数 | 覆盖内容 | 结果 | |--------|--------|----------|------| | TestBuildNativeLaunchCmd | 6 | _build_native_launch_cmd: vLLM/SGLang 命令结构、空参数、不支持引擎 | ✅ | | TestMainNativeLaunchRouting | 3 | main() 路由:NATIVE_LAUNCH_ENABLED=True → 原生、False → 侵入式 | ✅ | | TestRunNative | 3 | _run_native: Popen 调用参数、信号注册与恢复、wait 阻塞 | ✅ | ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [x] 代码注释完备 [x] 正确记录维测日志 [x] 是否有UT用例 [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!399 | 28 天前 | |
【重构】EngineServer重构&EngineServer对接SGLang Co-authored-by: ganglv<lvgang1@huawei.com> # message auto-generated for no-merge-commit merge: !36 merge pymotor_master_refactor_sglang into master 【重构】EngineServer重构&EngineServer对接SGLang Created-by: ganglv Commit-by: ganglv Merged-by: towncharlie Description: ## **1. 合入背景** > 请描述为什么要做这个PR内的改动。\ > 如涉及,请关联前序PR或同特性/需求下的其他PR。\ > 如果是修复之前PR引入的问题,请关联引入问题的PR。\ > 请通过#ISSUE ID关联issue。\ > 注意: Fixes #ISSUE ID会自动关闭issue,如问题部分解决请不要使用Fixes,可以用Fix part of #ISSUE ID替代. ## **2. 修改内容** > 请<ins>**描述修改内容的具体实现**</ins>,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列。 > 如果是需求或者重构类的PR,需要<ins>**补充详细设计文档**</ins>(说明上下游组件关系、时序图、类图、DFX能力等内容)。 ## **3. 资料变更** > 请确认<ins>**是否涉及资料变更**</ins>。\ > 如涉及,需要在PR中体现,并简要说明修改内容。\ > 如不涉及,需填写“不涉及”。 ## **4. 接口变更** > 请确认<ins>**是否涉及跨代码仓或者客户面可见的接口变更**</ins>。\ > 如涉及,需详细说明接口以及对应的变更内容,同时需要在资料中体现。\ > 如不涉及,需填写“不涉及”。 ## **5. 测试结果** > 需体现<ins>**测试场景,测试方法以及测试结果**</ins>。\ > 测试用例设计时需考虑硬件、部署方式、功能、性能、精度、显存等维度。 ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [ ] 代码注释完备 [ ] 正确记录维测日志 [ ] 是否有UT用例 [ ] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!36 | 4 个月前 | |
[refractor] 提取http相关公共文件,简化utils文件夹内文件数量 Co-authored-by: 吕有辉<lvyouhui@huawei.com> # message auto-generated for no-merge-commit merge: !55 merge master into master [refractor] 提取http相关公共文件,简化utils文件夹内文件数量 Created-by: codeDogPro Commit-by: 吕有辉 Merged-by: towncharlie Description: ## **1. 合入背景** https://gitcode.com/Ascend/MindIE-PyMotor/issues/47 ## **2. 修改内容** 提取utils函数,汇聚目录 ## **3. 资料变更** 涉及 ## **4. 接口变更** 不涉及 ## **5. 测试结果** 服务能正常拉起 ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [x] 代码注释完备 [x] 正确记录维测日志 [x] 是否有UT用例 [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!55 | 3 个月前 | |
[bugfix] 增加引擎健康探测默认超时并支持超时重试 Co-authored-by: lbr711<liuboru1@huawei.com> # message auto-generated for no-merge-commit merge: !521 merge timeout into master [bugfix] 增加引擎健康探测默认超时并支持超时重试 Created-by: lbr711 Commit-by: lbr711 Merged-by: towncharlie Description: ## **1. 合入背景** > 默认 health_collector_timeout 为 2 秒偏短,推理面 /health 探测偶发超时,同时单次超时无重试,偶发抖动易误判。 > > Fixes #314 ## **2. 修改内容** 1. 将 HealthCheckConfig.health_collector_timeout 默认值由 2 调整为 5 2. 新增配置项 health_collector_timeout_retry_attempts(默认 3):HealthCollector 探测 /health 仅在超时时重试,其它错误不重试 3. 同步更新配置参考与虚推特性文档 4. 补充 HealthCollector UT,并同步相关单测断言 ## **3. 资料变更** 涉及: - docs/zh/user_guide/deployment/k8s/config_reference.md - docs/zh/user_guide/features/sim_inference.md ## **4. 接口变更** 客户面配置变更: - health_check_config.health_collector_timeout 默认值 2 → 5 - 新增 health_check_config.health_collector_timeout_retry_attempts,默认 3(含首次) ## **5. 测试结果** - 单测:tests/engine_server/core/test_health_collector.py(超时重试、非超时不重试、配置项等) - 单测:tests/engine_server/config/test_endpoint.py 中 HealthCheckConfig 默认值与 from_dict 用例已同步 ## **6. CheckList** [x] 代码注释完备 [x] 正确记录维测日志 [x] 是否有UT用例 [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!521 | 17 天前 | |
在P节点tokenizer后,校验请求长度+最大输出长度 > 模型上下文长度, 避免P产生KV cache残留问题 Co-authored-by: tobking<wangjun292@huawei.com> # message auto-generated for no-merge-commit merge: !513 merge pd-handoff-context-precheck into master 在P节点tokenizer后,校验请求长度+最大输出长度 > 模型上下文长度, 避免P产生KV cache残留问题 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替代. [#309](https://gitcode.com/Ascend/MindIE-PyMotor/issues/309) ## **2. 修改内容** > 请<ins>**描述修改内容的具体实现**</ins>,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列。 > 如果是需求或者重构类的PR,需要<ins>**补充详细设计文档**</ins>(说明上下游组件关系、时序图、类图、DFX能力等内容)。 Coordinator 在构造 _motor_dispatch 时,从原始 req_info.req_data 提取输出预算: 优先使用 max_completion_tokens; 否则使用 max_tokens。 为 MotorDispatch 增加可选字段 original_max_output_tokens,并随 dispatch 传递至 P 实例。 P 侧 vLLM adapter 从 MotorDispatch 读取该字段。 在 prompt render/tokenizer 完成后,校验: ## **3. 资料变更** > 请确认<ins>**是否涉及资料变更**</ins>。\ > 如涉及,需要在PR中体现,并简要说明修改内容。\ > 如不涉及,需填写“不涉及”。 不涉及 ## **4. 接口变更** > 请确认<ins>**是否涉及跨代码仓或者客户面可见的接口变更**</ins>。\ > 如涉及,需详细说明接口以及对应的变更内容,同时需要在资料中体现。\ > 如不涉及,需填写“不涉及”。 不涉及 ## **5. 测试结果** > 需体现<ins>**测试场景,测试方法以及测试结果**</ins>。\ > 测试用例设计时需考虑硬件、部署方式、功能、性能、精度、显存等维度。 ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [ ] 代码注释完备 [ ] 正确记录维测日志 [ ] 是否有UT用例 [ ] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!513 | 20 天前 | |
[feature] 在 vLLM 配置解析前启动 mgmt 端点 Co-authored-by: Jechin<yuzechen1@huawei.com> # message auto-generated for no-merge-commit merge: !441 merge feature/early-mgmt-endpoint-bootstrap into master [feature] 在 vLLM 配置解析前启动 mgmt 端点 Created-by: Jechin Commit-by: Jechin Merged-by: towncharlie Description: ## **1. 合入背景** Fixes [#244](https://gitcode.com/Ascend/MindIE-PyMotor/issues/244) Fixes [#242](https://gitcode.com/Ascend/MindIE-PyMotor/issues/242) EngineServer 在 vLLM 冷启动 ConfigFactory.parse() 完成前不监听 mgmt 端口,NodeManager 在此期间探测 /status 会得到 Connection refused,可能触发连续异常心跳。本 PR 调整启动时序,使 mgmt 端口尽早可达,并在 parse 完成后绑定引擎健康检查逻辑。 ## **2. 修改内容** 1. **motor/engine_server/cli/main.py**:启动顺序改为 MgmtEndpoint(endpoint_config).run() → ConfigFactory.parse() → attach_engine(config) → 启动 InferEndpoint。 2. **motor/engine_server/core/mgmt_endpoint.py**:MgmtEndpoint 仅接收 EndpointConfig 构造;新增 attach_engine(IConfig) 延迟绑定 SimInference;/status 在 attach 前返回 initial;移除遗留 _server_core 与 bootstrap 阶段日志。 3. **motor/engine_server/core/mgmt_sim_inference_factory.py**(新增):下沉 headless/DP rank 虚推开关与 SimInference 创建逻辑。 4. **motor/engine_server/core/health_collector.py**:构造函数改为接收 EndpointConfig,mgmt 早期阶段即可探活 infer 端口。 5. **motor/node_manager/core/heartbeat_manager.py**:update_endpoint 时重置 120s 心跳宽限期,覆盖 EngineServer 晚注册场景。 6. **单元测试**:补充 mgmt 早期 /status、attach 幂等与 main 启动顺序断言;补充 heartbeat 宽限期重置用例。 **进程视图** mermaid sequenceDiagram participant Main as EngineServer_main participant Mgmt as MgmtEndpoint participant Parse as ConfigFactory_parse participant NM as NodeManager Main->>Mgmt: __init__ + run() Note over Mgmt: mgmt 端口开始监听 NM->>Mgmt: GET /status Mgmt-->>NM: initial Main->>Parse: parse() 慢路径 Main->>Mgmt: attach_engine(config) NM->>Mgmt: GET /status Mgmt-->>NM: normal/abnormal ## **3. 资料变更** 不涉及 ## **4. 接口变更** 不涉及跨代码仓或客户面可见的接口变更。mgmt /status 在引擎 attach 前仍返回 HTTP 200 与 initial 状态,行为与早期 bootstrap 设计一致。 ## **5. 测试结果** (自行补充) ## **6. CheckList** [x] 代码注释完备 [x] 正确记录维测日志 [x] 是否有UT用例 [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!441 | 28 天前 | |
engine server错误码处理与引擎侧保持一致 Co-authored-by: tobking<wangjun292@huawei.com> # message auto-generated for no-merge-commit merge: !450 merge engine-vllm-validation-error-response into master 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替代. engine server当前基于错误信息匹配错误码,处理流程与vllm原生不一致。需要对齐。 [#281](https://gitcode.com/Ascend/MindIE-PyMotor/issues/281) ## **2. 修改内容** > 请<ins>**描述修改内容的具体实现**</ins>,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列。 > 如果是需求或者重构类的PR,需要<ins>**补充详细设计文档**</ins>(说明上下游组件关系、时序图、类图、DFX能力等内容)。 对齐vllm 原生处理错误码逻辑 ## **3. 资料变更** > 请确认<ins>**是否涉及资料变更**</ins>。\ > 如涉及,需要在PR中体现,并简要说明修改内容。\ > 如不涉及,需填写“不涉及”。 ## **4. 接口变更** > 请确认<ins>**是否涉及跨代码仓或者客户面可见的接口变更**</ins>。\ > 如涉及,需详细说明接口以及对应的变更内容,同时需要在资料中体现。\ > 如不涉及,需填写“不涉及”。 ## **5. 测试结果** > 需体现<ins>**测试场景,测试方法以及测试结果**</ins>。\ > 测试用例设计时需考虑硬件、部署方式、功能、性能、精度、显存等维度。 ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [ ] 代码注释完备 [ ] 正确记录维测日志 [ ] 是否有UT用例 [ ] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!450 | 23 天前 | |
[feature] 虚推(SimInference)健壮性加固 Co-authored-by: Jechin<yuzechen1@huawei.com> # message auto-generated for no-merge-commit merge: !456 merge fix/sim-inference-hardening into master [feature] 虚推(SimInference)健壮性加固 Created-by: Jechin Commit-by: Jechin Merged-by: towncharlie Description: ## **1. 合入背景** Fixes [#258](https://gitcode.com/Ascend/MindIE-PyMotor/issues/258) 虚推(SimInference)在 warmup 后失败计数、abnormal 生命周期、SGLang 误启用及 shutdown 资源释放等方面存在多处健壮性缺陷,可能导致 GET /status 长期 normal 或状态抖动,进而影响 Node Manager HeartbeatManager 的连续 abnormal 计数与 Pod 重调度。本 PR 逐项加固虚推行为并补充 UT。 ## **2. 修改内容** 1. **motor/engine_server/core/sim_inference.py**:SGLang 引擎类型运行时自动关闭虚推。 2. **sim_inference.py**:warmup 成功后将 _count_failure_flag 置为 True,空闲期失败可累计。 3. **sim_inference.py**:达到 abnormal 后退出 health_check_loop,移除循环内 auto-reset。 4. **sim_inference.py**:stop_health_check() 不再重置 abnormal 状态。 5. **sim_inference.py**:shutdown 时停止 AI Cube event、join 采样线程、关闭 HTTP client。 6. **文档与示例**:对齐 engine_server.md、config_reference.md 中虚推说明;从 SGLang 示例配置移除 health_check_config。 7. **UT**:更新 tests/engine_server/core/test_sim_inference.py、test_mgmt_endpoint.py 覆盖上述行为。 ## **3. 资料变更** - docs/zh/developer_guide/components/engine_server.md:虚推启用条件、NPU 采样指标、异常判定与 vLLM 指标过滤说明对齐实现。 - docs/zh/user_guide/deployment/k8s/config_reference.md:虚推相关字段说明微调。 - examples/infer_engines/sglang/user_config.json、user_config_pd_hetero.json:移除 SGLang 不支持的 health_check_config。 ## **4. 接口变更** 不涉及跨代码仓或客户面可见的 HTTP/API 契约变更。行为修正:GET /status 在 abnormal 后语义更稳定;SGLang 运行时强制关闭虚推(即使配置 enable_virtual_inference: true)。 ## **5. 测试结果** - bash tests/run_tests.sh:全部通过(6 warnings,与基线一致)。 - 聚焦:tests/engine_server/core/test_sim_inference.py、tests/engine_server/core/test_mgmt_endpoint.py 通过。 ## **6. CheckList** [x] 代码注释完备 [x] 正确记录维测日志 [x] 是否有UT用例 [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!456 | 19 天前 | |
[bugfix] 快照恢复后下发的master_dp_ip不一致,增加快照checkpoint后可解锁设备能力,补充接口文档 Co-authored-by: lbr711<liuboru1@huawei.com> # message auto-generated for no-merge-commit merge: !294 merge add_snapshot_api into master [bugfix] 快照恢复后下发的master_dp_ip不一致,增加快照checkpoint后可解锁设备能力,补充接口文档 Created-by: lbr711 Commit-by: lbr711 Merged-by: towncharlie Description: ## **1. 合入背景** 1. 在开启容器快照功能后,设备会处于lock状态等待容器checkpoint. 在checkpoint结束后,设备仍处于lock状态需要unlock,否则当前冷启动服务不可用 2. 增加device_unlock接口 3. 在外界checkpoint结束后,可通过挂载文件通知的形式,让snapshot_sentinel自动调用unlock 4. 修复快照场景下,master_dp_ip不对 5. 补充接口资料 ## **2. 修改内容** ## **3. 资料变更** 不涉及 ## **4. 接口变更** 新增device_unlock ## **5. 测试结果** > 需体现<ins>**测试场景,测试方法以及测试结果**</ins>。\ > 测试用例设计时需考虑硬件、部署方式、功能、性能、精度、显存等维度。 ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [ ] 代码注释完备 [ ] 正确记录维测日志 [ ] 是否有UT用例 [ ] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!294 | 1 个月前 | |
[feature] EngineServer支持原生命令拉起vLLM或SGLang Co-authored-by: zhoujing101<zhoujing101@huawei.com> Co-authored-by: gitcode-bot<noreply@gitcode.com> # message auto-generated for no-merge-commit merge: !399 merge EPD_2 into master [feature] EngineServer支持原生命令拉起vLLM或SGLang Created-by: zhoujing101 Commit-by: zhoujing101;gitcode-bot Merged-by: towncharlie Description: ## **1. 合入背景** [#234](https://gitcode.com/Ascend/MindIE-PyMotor/issues/234) 当前 EngineServer CLI 启动 vLLM/SGLang 时采用侵入式(in-process)方式,引擎以 Python 库的形式嵌入到 MindIE 进程中运行。这种方式耦合较紧,不利于独立调试和问题定位。 现新增**原生启动模式**:通过常量 NATIVE_LAUNCH_ENABLED 控制,当设置为 True 时,引擎通过原生命令(vllm serve ... / python3 -m sglang.launch_server ...)以子进程方式启动,拉起参数与侵入式模式保持一致。同时保留管理端口(MgmtEndpoint)的健康检查和指标采集能力。 ## **2. 修改内容** ### 2.1 接口层:IConfig 新增 get_cli_args 方法 **涉及文件:** motor/engine_server/core/config.py 在 IConfig 抽象接口中新增方法 get_cli_args() -> list[str],返回适用于原生 CLI 启动的参数列表。 ### 2.2 vLLM 引擎:实现 get_cli_args **涉及文件:** motor/engine_server/core/vllm/vllm_config.py 通过 _get_param_list() 获取 vLLM CLI 参数列表,供原生 vllm serve 命令使用。 ### 2.3 SGLang 引擎:实现 get_cli_args **涉及文件:** motor/engine_server/core/sglang/sglang_config.py 通过 _get_param_list() 获取 SGLang CLI 参数列表,供原生 python3 -m sglang.launch_server 命令使用。 ### 2.4 CLI 主入口:新增原生启动逻辑 **涉及文件:** motor/engine_server/cli/main.py | 变更项 | 说明 | |--------|------| | 新增常量 NATIVE_LAUNCH_ENABLED | 布尔常量,False 时走侵入式路径(向后兼容),设为 True 启用原生启动 | | 新增函数 _build_native_launch_cmd | 根据 engine_type 构建原生命令:vllm serve <args> / python3 -m sglang.launch_server <args> | | 新增函数 _run_native | 通过 subprocess.Popen 启动子进程,注册 SIGTERM/SIGINT 信号转发给子进程,退出时恢复旧信号处理器 | | 新增函数 _run_native_mode | 封装原生启动完整生命周期:MgmtEndpoint + 子进程 + 清理 | | 新增函数 _log_safe_cmd | 使用 shlex.quote() 安全格式化命令用于日志输出 | | 修改 main() | 判断 NATIVE_LAUNCH_ENABLED,原生模式下通过 _run_native_mode 统一管理各组件生命周期 | **信号处理安全增强:** - 注册信号前保存旧处理器,process.wait() 退出后在 finally 块中恢复,避免影响上层调用者 **原生启动流程:** main() ├─ 解析配置 (ConfigFactory.parse) ├─ _run_native_mode(endpoint_config, config) │ ├─ 创建 MgmtEndpoint 并 run() (管理端口在守护线程中运行) │ ├─ _run_native(config) │ │ ├─ 构建原生命令: vllm serve ... │ │ ├─ subprocess.Popen 启动子进程 │ │ ├─ 保存旧信号处理器,注册 SIGTERM/SIGINT → 转发给子进程 │ │ ├─ process.wait() 阻塞等待 │ │ └─ 恢复旧信号处理器 │ └─ finally: mgmt_endpoint.shutdown()清理 └─ return ### 2.5 测试前置:conftest **新增文件:** tests/engine_server/cli/conftest.py 仅安装 vllm 模块 fakes(其他测试不会导入 vllm),避免全局 sys.modules 污染。 ### 2.6 功能测试用例 **新增文件:** tests/engine_server/cli/test_main_native_launch.py 共 12 个测试用例,覆盖命令构建、原生路由、子进程启动三部分。路由测试通过 patch.object 直接修改 NATIVE_LAUNCH_ENABLED 常量进行测试。 ### 2.7 启用方式 | 方式 | 行为 | |------|------| | NATIVE_LAUNCH_ENABLED = False(默认) | 侵入式 in-process 启动(向后兼容) | | NATIVE_LAUNCH_ENABLED = True | 原生 CLI 子进程启动,同时运行管理端口 | ### 2.8 安全加固 | 措施 | 说明 | |------|------| | engine_type whitelist | 仅允许 vllm / sglang 作为引擎类型 | | subprocess.Popen list 模式 | 无 shell=True,参数以字面量传递,不被 shell 解释 | | _log_safe_cmd() | 日志中使用 shlex.quote() 转义含空格的参数,防止日志注入 | | 信号处理器 save/restore | signal.signal() 保存旧处理器,finally 块恢复,避免干扰上层调用方 | ## **3. 资料变更** 不涉及。 ## **4. 接口变更** 不涉及。 ## **5. 测试结果** **12/12 passed** · Python 3.11.15 · pytest 9.0.2 | 测试类 | 用例数 | 覆盖内容 | 结果 | |--------|--------|----------|------| | TestBuildNativeLaunchCmd | 6 | _build_native_launch_cmd: vLLM/SGLang 命令结构、空参数、不支持引擎 | ✅ | | TestMainNativeLaunchRouting | 3 | main() 路由:NATIVE_LAUNCH_ENABLED=True → 原生、False → 侵入式 | ✅ | | TestRunNative | 3 | _run_native: Popen 调用参数、信号注册与恢复、wait 阻塞 | ✅ | ## **6. CheckList** > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] [x] 代码注释完备 [x] 正确记录维测日志 [x] 是否有UT用例 [x] 若涉及多线程场景,考虑了并发场景,不存在死锁问题 See merge request: Ascend/MindIE-PyMotor!399 | 28 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 20 天前 | ||
| 23 天前 | ||
| 28 天前 | ||
| 16 天前 | ||
| 4 个月前 | ||
| 28 天前 | ||
| 4 个月前 | ||
| 3 个月前 | ||
| 17 天前 | ||
| 20 天前 | ||
| 28 天前 | ||
| 23 天前 | ||
| 19 天前 | ||
| 1 个月前 | ||
| 28 天前 |