启用多模态输入#

本文档将引导您完成扩展 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):

以下是一些示例:

参见

输入处理管道

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):

备注

虚拟数据应具有上一步所述的最大可能数量的多模态标记。

以下是一些示例:

参见

输入处理管道

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 框架进行注意力掩码生成。以下是一些示例:

参见

输入处理管道