如何支持新模型#

本文档解释了如何在 SGLang 中添加对新语言模型和多模态大型语言模型 (MLLM) 的支持。它还涵盖了如何测试新模型和注册外部实现。

如何支持新的语言模型#

要在 SGLang 中支持新模型,您只需在 SGLang 模型目录下添加一个文件。您可以学习现有的模型实现,并为您的模型创建一个新文件。对于大多数模型,您应该能找到一个类似的模型作为起点(例如,从 Llama 开始)。另请参阅如何将 vLLM 模型移植到 SGLang

如何支持新的多模态大型语言模型#

要在 SGLang 中支持新的多模态大型语言模型 (MLLM),除了标准的 LLM 支持外,还需要以下几个关键组件

  1. 将您的新模型注册为多模态:扩展 model_config.py 中的 is_multimodal_model (位于 此处),使其为您的模型返回 True

  2. 注册新的聊天模板 参见 conversation.py

  3. 多模态数据处理器:定义一个新的继承自 BaseMultimodalProcessorProcessor 类,并将此处理器注册为您模型的专用处理器。更多详情请参见 multimodal_processor.py

  4. 处理多模态 Token:为您的新模型实现一个 pad_input_ids 函数。在此函数中,应(如有必要)扩展 Prompt 中的多模态 token,并使用多模态数据哈希进行填充,以便 SGLang 可以使用 RadixAttention 识别不同的多模态数据。

  5. 适配 Vision Attention:将 ViT 的多头 Attention 适配到 SGLang 的 VisionAttention

您可以参考 Qwen2VL 或其他 MLLM 实现。这些模型展示了如何正确处理多模态和文本输入。

您应该在本地针对 Hugging Face 模型测试新的 MLLM。请参阅 mmmu 基准测试示例。

测试正确性#

交互式调试#

对于交互式调试,请比较 Hugging Face/Transformers 和 SGLang 的输出。以下两个命令应该给出相同的文本输出和非常相似的预填充 logits

  • 获取参考输出

    python3 scripts/playground/reference_hf.py --model-path [new model] --model-type {text,mllm}
    
  • 获取 SGLang 输出

    python3 -m sglang.bench_one_batch --correct --model [new model]
    

将模型添加到测试套件#

为确保新模型得到良好维护,请将其添加到测试套件中,方法是在 test_generation_models.py 文件中的 ALL_OTHER_MODELS 列表中包含它,在本地机器上测试新模型,并在您的 PR 中报告其在示范性基准测试(如 GSM8K, MMLU, MMMU, MMMU-Pro 等)上的结果。

这是在本地机器上测试新模型的命令

ONLY_RUN=Qwen/Qwen2-1.5B python3 -m unittest test_generation_models.TestGenerationModels.test_others

将 vLLM 模型移植到 SGLang#

vLLM 模型目录是一个有价值的资源,因为它包含了许多模型。SGLang 重用了 vLLM 的接口和一些层,这使得将模型从 vLLM 移植到 SGLang 更加容易。

如何将模型从 vLLM 移植到 SGLang

  • 比较以下两个文件以获取指导

  • 主要区别包括

    • 将 vLLM 的 Attention 替换为 RadixAttention(确保将 layer_id 传递给 RadixAttention)。

    • 将 vLLM 的 LogitsProcessor 替换为 SGLang 的 LogitsProcessor

    • 将 ViT 的多头 Attention 替换为 SGLang 的 VisionAttention

    • 将其他 vLLM 层(如 RMSNorm, SiluAndMul)替换为 SGLang 层。

    • 移除 Sample

    • 修改 forward() 函数 并添加一个 forward_batch() 方法。

    • 在末尾添加 EntryClass

    • 确保新的实现只使用 SGLang 组件,并且不依赖任何 vLLM 组件。

注册外部模型实现#

除了上述方法之外,您可以在启动服务器之前使用 ModelRegistry 注册您的新模型。这允许您在不修改源代码的情况下集成您的模型。

例如

from sglang.srt.models.registry import ModelRegistry
from sglang.srt.entrypoints.http_server import launch_server

# For a single model, add it to the registry:
ModelRegistry.models[model_name] = model_class

# For multiple models, you can imitate the import_model_classes() function:
from functools import lru_cache

@lru_cache()
def import_new_model_classes():
    model_arch_name_to_cls = {}
    # Populate model_arch_name_to_cls with your new model classes.
    ...
    return model_arch_name_to_cls

ModelRegistry.models.update(import_new_model_classes())

# Launch the server with your server arguments:
launch_server(server_args)

遵循这些指南,您可以在 SGLang 中添加对新语言模型和多模态大型语言模型的支持,并确保它们经过彻底测试并轻松集成到系统中。