介绍 vLLM 硬件插件:来自华为昇腾 NPU 的最佳实践

5 分钟阅读
vLLM 昇腾团队

自 2024 年 12 月以来,通过 vLLM 社区与 vLLM 昇腾团队的共同努力,我们完成了 硬件插件化 RFC。该提案允许以解耦的方式将硬件集成到 vLLM 中,从而实现对不同硬件平台的快速且模块化的支持。


为什么要引入 vLLM 硬件插件?

目前,vLLM 已经支持多种后端。然而,随着 vLLM 后端数量的持续增长,出现了一些挑战:

  • 代码复杂性增加:每个硬件后端都有自己的 Executor(执行器)、Worker(工作进程)、Runner(运行器)和 Attention(注意力机制)组件。这增加了 vLLM 代码库的复杂性,非通用的后端特定代码分散在整个项目中。
  • 维护成本高昂:维护后端的成本很高,不仅对后端开发者,对 vLLM 社区也是如此。社区贡献者资源的匮乏使得在没有后端维护者的情况下,高效添加新功能变得困难。
  • 缺乏可扩展性:虽然 vLLM 通过 ExecutorWorkerRunnerAttention 实现了后端,采用了结构良好的分层设计,但支持新硬件通常需要侵入式修改或打补丁,而不是动态注册。这使得添加新后端变得繁琐。

认识到需要一种灵活且模块化的硬件后端集成方法,我们提出了硬件插件作为一种可行的解决方案:

  • 代码库解耦:硬件后端插件代码保持独立,使得 vLLM 核心代码更简洁。
  • 降低维护负担:vLLM 开发者可以专注于通用功能,而不会被后端特定实现所带来的差异所干扰。
  • 更快的集成与更高的独立性:新后端可以快速集成,工作量更小,并且可以独立演进。

什么是 vLLM 硬件插件?

在介绍 vLLM 硬件插件之前,让我们先回顾一下两个前提 RFC:

基于这些 RFC,我们提出了 [RFC] 硬件可插拔,将 Platform 模块作为插件集成到 vLLM 中。此外,我们重构了 ExecutorWorkerModelRunnerAttentionBackendCommunicator,以更灵活地支持硬件插件。

目前,vLLM 社区已成功实现 RFC 中引入的 Platform 模块。该功能已通过 vllm-project/vllm-ascendvllm-project/vllm-spyre 项目得到验证。利用此插件机制,我们成功地将 vLLM 与昇腾 NPU 和 IBM Spyre 后端进行了集成。


如何通过 vLLM 硬件插件机制集成新的后端

本节将深入探讨从开发者和用户两个角度,通过硬件插件集成新后端的方法。

开发者视角

要使用硬件插件将新后端集成到 vLLM 中,请遵循以下步骤:

第一步:创建新项目并初始化平台

首先创建一个用于新后端的 Python 项目,并添加一个 platform.py 文件。然后,从 vllm.platforms 导入 Platform 类,并实现所需的属性和方法。

您可以参考 vLLM 昇腾项目中的 platform.py 获取示例。

第二步:实现自定义 Worker、Model Runner、Attention 后端和通信模块

根据新后端的具体要求,实现以下模块:

from vllm.worker.worker_base import WorkerBase
from vllm.worker.model_runner_base import ModelRunnerBase
from vllm.attention.backends.abstract import AttentionBackend
from vllm.distributed.device_communicators.base_communicator import CommunicatorBase

这些类中的每一个在 vLLM 中都有对应的基类。同样,您可以参考 vLLM 昇腾的实现 获取示例。

第三步:注册插件

使用 Python 的入口点(entrypoint)机制在 setup.py 中注册插件:

setup(
    entry_points={'vllm.platform_plugins': ["{your_platform_name} = {code_path}:{register_function}"]}
)
  • {your_platform_name}:新后端的名称(可以是任意名称)。
  • {code_path}:主 Python 模块的路径。
  • {register_function}:注册函数,它返回第一步中定义的 Platform 类的路径。

请参考 vLLM 昇腾中的 setup.py 获取实际示例。


用户视角

用户只需在运行前安装 vllm 和您的插件即可。以 vllm-ascend 为例:

pip install vllm vllm-ascend

启动时,您将观察到以下日志,这意味着后端插件运行正常。

INFO 02-06 15:49:01 __init__.py:30] Available plugins for group vllm.platform_plugins:
INFO 02-06 15:49:01 __init__.py:32] name=ascend, value=vllm_ascend:register

INFO 02-06 15:49:01 __init__.py:44] plugin ascend loaded.
INFO 02-06 15:49:01 __init__.py:181] Platform plugin ascend is activated

下一步是什么?

展望未来,我们将继续与 vLLM 社区的开发者合作,从以下方面进行加强:

  1. 持续增强 V1 Engine 和 VLM(视觉语言模型)。
  2. 扩展对更多模块和功能的插件支持,例如调度器、图模式和自定义算子。
  3. 提供更好的用户体验和更高的性能。
  4. 针对合适的硬件平台,维护并完善稳定的插件架构。

我们鼓励大家尝试这一新功能!如果您有任何疑问,请加入 vLLM Slack 并参与 #sig-extensible-hardware 频道进行讨论。🚀

致谢

如果没有许多 vLLM 贡献者的努力,这种灵活的硬件后端插件机制是不可能实现的。因此,我们衷心感谢 vLLM 的维护者们,包括 Kaichao You、Simon Mo、Cyrus Leung、Robert Shaw、Michael Goin 和 Jie Li 在相关重构、深入讨论和快速审查方面的工作;感谢 vLLM 昇腾团队的 Xiyuan Wang、Shanshan Shen、Chenguang Li 和 Mengqing Cao 在机制设计和实现方面的贡献;感谢 vLLM Spyre 团队的 Joe Runde 和 Yannick Schnider 在可插拔调度器设计和实现方面的贡献;以及其他贡献者,包括在可扩展量化方法设计和实现方面做出贡献的 yancong,以及在可扩展 SamplingParams 方面做出贡献的 Aviv Keshet。