启用多模态输入#
本文件将引导你完成扩展 vLLM 模型的步骤,使其能够接受 多模态 输入。
参见
添加新模型
1. 更新基础 vLLM 模型#
假设你已经根据 这些步骤 在 vLLM 中实现了模型。请按照以下步骤进一步更新模型:
实现
SupportsMultiModal
接口。+ from vllm.model_executor.models.interfaces import SupportsMultiModal - class YourModelForImage2Seq(nn.Module): + class YourModelForImage2Seq(nn.Module, SupportsMultiModal):
备注
模型类不必命名为
*ForCausalLM
。查看 HuggingFace Transformers 文档 获取一些示例。如果你还没有这样做,请在
forward()
中为每个与多模态输入相对应的输入张量保留一个关键字参数,如下例所示:def forward( self, input_ids: torch.Tensor, positions: torch.Tensor, kv_caches: List[torch.Tensor], attn_metadata: AttentionMetadata, + pixel_values: torch.Tensor, ) -> SamplerOutput:
2. 注册输入映射器#
对于模型接受的每种模态类型,使用 MULTIMODAL_REGISTRY.register_input_mapper
装饰模型类。此装饰器接受一个函数,该函数将多模态输入映射到你之前在 forward()
中定义的关键字参数。
from vllm.model_executor.models.interfaces import SupportsMultiModal
+ from vllm.multimodal import MULTIMODAL_REGISTRY
+ @MULTIMODAL_REGISTRY.register_image_input_mapper()
class YourModelForImage2Seq(nn.Module, SupportsMultiModal):
核心 vLLM 库中为每种模态提供了一个默认映射器。如果你没有提供自己的函数,将使用此输入映射器。
参见
输入处理管道
3. 注册多模态令牌的最大数量#
对于模型接受的每种模态类型,计算每个数据实例的可能最大令牌数,并通过 INPUT_REGISTRY.register_dummy_data
注册它。
from vllm.inputs import INPUT_REGISTRY
from vllm.model_executor.models.interfaces import SupportsMultiModal
from vllm.multimodal import MULTIMODAL_REGISTRY
@MULTIMODAL_REGISTRY.register_image_input_mapper()
+ @MULTIMODAL_REGISTRY.register_max_image_tokens(<your_calculation>)
@INPUT_REGISTRY.register_dummy_data(<your_dummy_data_factory>)
class YourModelForImage2Seq(nn.Module, SupportsMultiModal):
以下是一些示例:
图像输入(静态特征大小):LLaVA-1.5 模型
图像输入(动态特征大小):LLaVA-NeXT 模型
参见
输入处理管道
4. (可选) 注册虚拟数据#
在启动时,虚拟数据被传递给 vLLM 模型以分配内存。默认情况下,这仅包含文本输入,可能不适用于多模态模型。在这种情况下,你可以通过 INPUT_REGISTRY.register_dummy_data
注册工厂方法来定义自己的虚拟数据。
from vllm.inputs import INPUT_REGISTRY
from vllm.model_executor.models.interfaces import SupportsMultiModal
from vllm.multimodal import MULTIMODAL_REGISTRY
@MULTIMODAL_REGISTRY.register_image_input_mapper()
@MULTIMODAL_REGISTRY.register_max_image_tokens(<your_calculation>)
+ @INPUT_REGISTRY.register_dummy_data(<your_dummy_data_factory>)
class YourModelForImage2Seq(nn.Module, SupportsMultiModal):
备注
虚拟数据应该具有上一步中描述的最大可能的多模态令牌数量。
以下是一些示例:
图像输入(静态特征大小):LLaVA-1.5 模型
图像输入(动态特征大小):LLaVA-NeXT 模型
参见
输入处理管道
5. (可选) 注册输入处理器#
有时,需要在将输入传递给模型执行器之前,在 LLMEngine
级别处理输入。这通常是由于与 HuggingFace Transformers 中的实现不同,多模态嵌入的重塑和/或扩展需要在模型的 forward()
调用之外进行。你可以通过 INPUT_REGISTRY.register_input_processor
注册输入处理器。
from vllm.inputs import INPUT_REGISTRY
from vllm.model_executor.models.interfaces import SupportsMultiModal
from vllm.multimodal import MULTIMODAL_REGISTRY
@MULTIMODAL_REGISTRY.register_image_input_mapper()
@MULTIMODAL_REGISTRY.register_max_image_tokens(<your_calculation>)
@INPUT_REGISTRY.register_dummy_data(<your_dummy_data_factory>)
+ @INPUT_REGISTRY.register_input_processor(<your_input_processor>)
class YourModelForImage2Seq(nn.Module, SupportsMultiModal):
输入处理器的常见用例是插入占位符令牌以利用 vLLM 框架进行注意力掩码生成。以下是一些示例:
插入静态数量的图像令牌:LLaVA-1.5 模型
插入动态数量的图像令牌:LLaVA-NeXT 模型
参见
输入处理管道