跳至内容

插件系统

社区经常要求能够通过自定义功能扩展vLLM。为了实现这一点,vLLM包含了一个插件系统,允许用户在不修改vLLM代码库的情况下添加自定义功能。本文档解释了插件在vLLM中的工作原理以及如何为vLLM创建插件。

vLLM 中的插件工作原理

插件是用户注册的代码,由vLLM执行。鉴于vLLM的架构(参见架构概述),可能会涉及多个进程,特别是在使用分布式推理和各种并行技术时。为了成功启用插件,vLLM创建的每个进程都需要加载插件。这是通过vllm.plugins模块中的load_general_plugins函数完成的。该函数会在vLLM创建的每个进程开始工作前被调用。

vLLM如何发现插件

vLLM的插件系统采用标准的Python entry_points机制。该机制允许开发者在他们的Python包中注册函数以供其他包使用。以下是一个插件示例:

Code
# inside `setup.py` file
from setuptools import setup

setup(name='vllm_add_dummy_model',
    version='0.1',
    packages=['vllm_add_dummy_model'],
    entry_points={
        'vllm.general_plugins':
        ["register_dummy_model = vllm_add_dummy_model:register"]
    })

# inside `vllm_add_dummy_model.py` file
def register():
    from vllm import ModelRegistry

    if "MyLlava" not in ModelRegistry.get_supported_archs():
        ModelRegistry.register_model(
            "MyLlava",
            "vllm_add_dummy_model.my_llava:MyLlava",
        )

如需了解更多关于向您的包添加入口点的信息,请查阅官方文档

每个插件包含三个部分:

  1. 插件组: 入口点组的名称。vLLM使用入口点组vllm.general_plugins来注册通用插件。这是setup.py文件中entry_points的键。对于vLLM的通用插件,请始终使用vllm.general_plugins
  2. 插件名称: 插件的名称。这是entry_points字典中对应的值。在上面的示例中,插件名称为register_dummy_model。可以通过VLLM_PLUGINS环境变量按插件名称进行过滤。若仅加载特定插件,请将VLLM_PLUGINS设置为该插件名称。
  3. 插件值: 在插件系统中注册的函数的完全限定名称。在上面的示例中,插件值为vllm_add_dummy_model:register,它指向vllm_add_dummy_model模块中名为register的函数。

支持的插件类型

  • 通用插件 (组名为 vllm.general_plugins): 这些插件的主要用途是将自定义的、非内置模型注册到vLLM中。这是通过在插件函数中调用ModelRegistry.register_model来注册模型实现的。

  • 平台插件(组名为vllm.platform_plugins):这些插件的主要用途是将自定义的、非内置平台注册到vLLM中。当当前环境不支持该平台时,插件函数应返回None;当支持该平台时,则返回平台类的完全限定名称。

插件编写指南

  • 可重入性: 入口点指定的函数应具备可重入特性,这意味着它可以被多次调用而不会引发问题。这是必要的,因为在某些进程中该函数可能会被多次调用。

兼容性保证

vLLM保证文档化插件的接口,例如ModelRegistry.register_model,将始终可供插件注册模型使用。然而,插件开发者有责任确保其插件与他们所针对的vLLM版本兼容。例如,"vllm_add_dummy_model.my_llava:MyLlava"应与插件所针对的vLLM版本兼容。模型的接口可能会在vLLM开发过程中发生变化。

优云智算