如何在 SGLang 中支持新模型#

在 SGLang 中支持新模型,你只需要在 SGLang 模型目录 下添加一个文件。你可以参考现有模型的实现,为新模型创建新的文件。对于大多数模型,你应该能够找到一个类似的模型作为起点(例如,从 Llama 开始)。

测试正确性#

交互式调试#

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

  • 通过 python3 scripts/playground/reference_hf.py --model [新模型] 获取参考输出

  • 通过 python3 -m sglang.bench_latency --correct --model [新模型] 获取 SGLang 输出

将模型添加到测试套件#

为了确保新模型在未来得到良好的维护,最好将其添加到测试套件中。你可以将其添加到 test_generation_models.py 中的 ALL_OTHER_MODELS 列表中,并运行以下命令进行测试。

例如,如果模型是 Qwen/Qwen2-1.5B

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

将模型从 vLLM 移植到 SGLang#

另一个有价值的资源是 vLLM 模型目录。vLLM 涵盖了大量的模型,SGLang 重用了 vLLM 的接口和一些层来实现这些模型。这种相似性使得将许多模型从 vLLM 移植到 SGLang 变得容易。

要将模型从 vLLM 移植到 SGLang,你可以比较这两个文件:SGLang Llama 实现vLLM Llama 实现。这个比较将帮助你理解如何将模型实现从 vLLM 转换为 SGLang。主要区别是将 Attention 替换为 RadixAttention。其他部分几乎相同。具体来说,

  • 用 SGLang 的 RadixAttention 替换 vllm 的 Attention。请注意,你需要将 layer_id 传递给 RadixAttention

  • 用 SGLang 的 LogitsProcessor 替换 vllm 的 LogitsProcessor

  • 用 SGLang 层替换其他 vLLM 层(例如,RMSNormSiluAndMul)。

  • 删除 Sample

  • 更改 forward() 函数,并添加 input_metadata

  • 在最后添加 EntryClass