如何支持新模型#
本文档解释了如何在 SGLang 中添加对新语言模型和多模态大型语言模型 (MLLM) 的支持。它还涵盖了如何测试新模型和注册外部实现。
如何支持新的语言模型#
要在 SGLang 中支持新模型,您只需在 SGLang 模型目录下添加一个文件。您可以学习现有的模型实现,并为您的模型创建一个新文件。对于大多数模型,您应该能找到一个类似的模型作为起点(例如,从 Llama 开始)。另请参阅如何将 vLLM 模型移植到 SGLang
如何支持新的多模态大型语言模型#
要在 SGLang 中支持新的多模态大型语言模型 (MLLM),除了标准的 LLM 支持外,还需要以下几个关键组件
将您的新模型注册为多模态:扩展
model_config.py
中的is_multimodal_model
(位于 此处),使其为您的模型返回True
。注册新的聊天模板 参见 conversation.py
多模态数据处理器:定义一个新的继承自
BaseMultimodalProcessor
的Processor
类,并将此处理器注册为您模型的专用处理器。更多详情请参见 multimodal_processor.py。处理多模态 Token:为您的新模型实现一个
pad_input_ids
函数。在此函数中,应(如有必要)扩展 Prompt 中的多模态 token,并使用多模态数据哈希进行填充,以便 SGLang 可以使用RadixAttention
识别不同的多模态数据。适配 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 中添加对新语言模型和多模态大型语言模型的支持,并确保它们经过彻底测试并轻松集成到系统中。