vLLM Ascend 中的补丁#
vLLM Ascend 是 vLLM 的平台插件。由于 vLLM 和 vLLM Ascend 的发布周期不同以及硬件限制,我们需要对 vLLM 的部分代码进行补丁,以使其与 vLLM Ascend 兼容。
在 vLLM Ascend 代码中,我们提供了一个补丁模块 vllm_ascend/patch 来适应 vLLM 的变化。
原则#
我们应该记住,补丁并不是使 vLLM Ascend 兼容的最佳方法。它只是一个临时的解决方案。最佳方法是将更改贡献给 vLLM,使其一开始就与 vLLM Ascend 兼容。在 vLLM Ascend 中,我们为补丁策略制定了基本原则:
少即是多。请不要打补丁,除非这是目前唯一可行的方法。
一旦添加了补丁,就必须描述将来移除该补丁的计划。
随时欢迎清理补丁代码。
工作原理#
在 vllm_ascend/patch 中,您可以看到如下代码结构:
vllm_ascend
├── patch
│ ├── platform
│ │ ├── patch_xxx.py
│ ├── worker
│ │ ├── patch_yyy.py
└───────────
platform: 此目录中的补丁代码用于修补 vLLM 主进程中的代码。在 vLLM 初始化时,它会非常早地被
vllm_ascend/platform::NPUPlatform::pre_register_and_update调用。对于在线模式,vLLM 进程在解析命令行参数时,会调用
vllm/vllm/engine/arg_utils.py::AsyncEngineArgs.add_cli_args中的平台补丁。对于离线模式,vLLM 进程在解析输入参数时,会调用
vllm/vllm/engine/arg_utils.py::EngineArgs.create_engine_config中的平台补丁。
worker: 此目录中的补丁代码用于修补 vLLM 工作进程中的代码。在 vLLM 工作进程初始化时,它会由
vllm_ascend/worker/worker::NPUWorker::__init__调用。对于在线模式和离线模式,vLLM 引擎核心进程在初始化工作进程时,会调用
vllm/vllm/worker/worker_base.py::WorkerWrapperBase.init_worker中的工作进程补丁。
如何编写补丁#
在编写补丁之前,请遵循上述原则,尽量少地修改代码。如果必要,我们可以在 platform 和 worker 文件夹中选择一个来打补丁。下面是一个修补 vLLM 中 distributed 模块的示例。
确定要修补的 vLLM 版本。例如,经过分析,我们希望同时修补 vLLM 的
0.10.0和main分支。确定要修补的进程。例如,这里
distributed属于 vLLM 主进程,因此我们应该修补 platform。在正确的文件夹中创建补丁文件。文件应命名为
patch_{module_name}.py。此处示例为vllm_ascend/patch/platform/patch_distributed.py。在新的文件中编写您的补丁代码。示例如下:
import vllm def patch_destroy_model_parallel(): # your patch code ... vllm.distributed.parallel_state.destroy_model_parallel = patch_destroy_model_parallel
在
__init__.py中导入补丁文件。在此示例中,将import vllm_ascend.patch.platform.patch_distributed添加到vllm_ascend/patch/platform/__init__.py中。在
vllm_ascend/patch/__init__.py中添加补丁的描述。描述格式如下:# ** File: <The patch file name> ** # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # 1. `<The target patch module in vLLM>` # Why: # <Describe the reason why we need to patch> # How: # <Describe the way to patch> # Related PR (if no, explain why): # <Add a link to the related PR in vLLM. If there is no related PR, explain why> # Future Plan: # <Describe the future plan to remove the patch>
添加单元测试和端到端测试。vLLM Ascend 中任何新增的代码都应包含单元测试和端到端测试。您可以在 测试指南 中找到更多详细信息。
限制#
在 V1 引擎中,vLLM 启动三种进程:主进程、EngineCore 进程和 Worker 进程。目前 vLLM Ascend 默认只能修补主进程和 Worker 进程中的代码。如果您想修补在 EngineCore 进程中运行的代码,则应在设置过程中完全修补 EngineCore 进程。请在
vllm.v1.engine.core中查找完整代码。请完全覆盖EngineCoreProc和DPEngineCoreProc。如果您运行的是修改过的 vLLM 代码,vLLM 的版本可能会自动更改。例如,如果您运行的是基于 v0.9.n 修改的 vLLM,vLLM 的版本可能会更改为 v0.9.nxxx。在这种情况下,vLLM Ascend 中 v0.9.n 的补丁将无法按预期工作,因为 vLLM Ascend 无法区分您正在使用的 vLLM 版本。在这种情况下,您可以设置环境变量
VLLM_VERSION来指定您正在使用的 vLLM 版本,然后 v0.10.0 的补丁应该会起作用。