插件系统¶
社区经常要求能够通过自定义功能扩展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",
)
如需了解更多关于向您的包添加入口点的信息,请查阅官方文档。
每个插件包含三个部分:
- 插件组: 入口点组的名称。vLLM使用入口点组
vllm.general_plugins来注册通用插件。这是setup.py文件中entry_points的键。对于vLLM的通用插件,请始终使用vllm.general_plugins。 - 插件名称: 插件的名称。这是
entry_points字典中对应的值。在上面的示例中,插件名称为register_dummy_model。可以通过VLLM_PLUGINS环境变量按插件名称进行过滤。若仅加载特定插件,请将VLLM_PLUGINS设置为该插件名称。 - 插件值: 在插件系统中注册的函数的完全限定名称。在上面的示例中,插件值为
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开发过程中发生变化。