chore: vendor sglang v0.5.10 snapshot
This commit is contained in:
12
third_party/sglang/docs/supported_models/extending/index.rst
vendored
Normal file
12
third_party/sglang/docs/supported_models/extending/index.rst
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
Extending SGLang
|
||||
================
|
||||
|
||||
Adding new models and alternative backends.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
support_new_models.md
|
||||
transformers_fallback.md
|
||||
modelscope.md
|
||||
mindspore_models.md
|
||||
151
third_party/sglang/docs/supported_models/extending/mindspore_models.md
vendored
Normal file
151
third_party/sglang/docs/supported_models/extending/mindspore_models.md
vendored
Normal file
@@ -0,0 +1,151 @@
|
||||
# MindSpore Models
|
||||
|
||||
## Introduction
|
||||
|
||||
MindSpore is a high-performance AI framework optimized for Ascend NPUs. This doc guides users to run MindSpore models in SGLang.
|
||||
|
||||
## Requirements
|
||||
|
||||
MindSpore currently only supports Ascend NPU devices. Users need to first install Ascend CANN 8.5.
|
||||
The CANN software packages can be downloaded from the [Ascend Official Website](https://www.hiascend.com).
|
||||
|
||||
## Supported Models
|
||||
|
||||
Currently, the following models are supported:
|
||||
|
||||
- **Qwen3**: Dense and MoE models
|
||||
- **DeepSeek V3/R1**
|
||||
- *More models coming soon...*
|
||||
|
||||
## Installation
|
||||
|
||||
> **Note**: Currently, MindSpore models are provided by an independent package `sgl-mindspore`. Support for MindSpore is built upon current SGLang support for Ascend NPU platform. Please first [install SGLang for Ascend NPU](../../platforms/ascend/ascend_npu.md) and then install `sgl-mindspore`:
|
||||
|
||||
```shell
|
||||
git clone https://github.com/mindspore-lab/sgl-mindspore.git
|
||||
cd sgl-mindspore
|
||||
pip install -e .
|
||||
```
|
||||
|
||||
|
||||
## Run Model
|
||||
|
||||
Current SGLang-MindSpore supports Qwen3 and DeepSeek V3/R1 models. This doc uses Qwen3-8B as an example.
|
||||
|
||||
### Offline inference
|
||||
|
||||
Use the following script for offline inference:
|
||||
|
||||
```python
|
||||
import sglang as sgl
|
||||
|
||||
# Initialize the engine with MindSpore backend
|
||||
llm = sgl.Engine(
|
||||
model_path="/path/to/your/model", # Local model path
|
||||
device="npu", # Use NPU device
|
||||
model_impl="mindspore", # MindSpore implementation
|
||||
attention_backend="ascend", # Attention backend
|
||||
tp_size=1, # Tensor parallelism size
|
||||
dp_size=1 # Data parallelism size
|
||||
)
|
||||
|
||||
# Generate text
|
||||
prompts = [
|
||||
"Hello, my name is",
|
||||
"The capital of France is",
|
||||
"The future of AI is"
|
||||
]
|
||||
|
||||
sampling_params = {"temperature": 0, "top_p": 0.9}
|
||||
outputs = llm.generate(prompts, sampling_params)
|
||||
|
||||
for prompt, output in zip(prompts, outputs):
|
||||
print(f"Prompt: {prompt}")
|
||||
print(f"Generated: {output['text']}")
|
||||
print("---")
|
||||
```
|
||||
|
||||
### Start server
|
||||
|
||||
Launch a server with MindSpore backend:
|
||||
|
||||
```bash
|
||||
# Basic server startup
|
||||
python3 -m sglang.launch_server \
|
||||
--model-path /path/to/your/model \
|
||||
--host 0.0.0.0 \
|
||||
--device npu \
|
||||
--model-impl mindspore \
|
||||
--attention-backend ascend \
|
||||
--tp-size 1 \
|
||||
--dp-size 1
|
||||
```
|
||||
|
||||
For distributed server with multiple nodes:
|
||||
|
||||
```bash
|
||||
# Multi-node distributed server
|
||||
python3 -m sglang.launch_server \
|
||||
--model-path /path/to/your/model \
|
||||
--host 0.0.0.0 \
|
||||
--device npu \
|
||||
--model-impl mindspore \
|
||||
--attention-backend ascend \
|
||||
--dist-init-addr 127.0.0.1:29500 \
|
||||
--nnodes 2 \
|
||||
--node-rank 0 \
|
||||
--tp-size 4 \
|
||||
--dp-size 2
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
#### Debug Mode
|
||||
|
||||
Enable sglang debug logging by log-level argument.
|
||||
|
||||
```bash
|
||||
python3 -m sglang.launch_server \
|
||||
--model-path /path/to/your/model \
|
||||
--host 0.0.0.0 \
|
||||
--device npu \
|
||||
--model-impl mindspore \
|
||||
--attention-backend ascend \
|
||||
--log-level DEBUG
|
||||
```
|
||||
|
||||
Enable mindspore info and debug logging by setting environments.
|
||||
|
||||
```bash
|
||||
export GLOG_v=1 # INFO
|
||||
export GLOG_v=0 # DEBUG
|
||||
```
|
||||
|
||||
#### Explicitly select devices
|
||||
|
||||
Use the following environment variable to explicitly select the devices to use.
|
||||
|
||||
```shell
|
||||
export ASCEND_RT_VISIBLE_DEVICES=4,5,6,7 # to set device
|
||||
```
|
||||
|
||||
#### Some communication environment issues
|
||||
|
||||
In case of some environment with special communication environment, users need set some environment variables.
|
||||
|
||||
```shell
|
||||
export MS_ENABLE_LCCL=off # current not support LCCL communication mode in SGLang-MindSpore
|
||||
```
|
||||
|
||||
#### Some dependencies of protobuf
|
||||
|
||||
In case of some environment with special protobuf version, users need set some environment variables to avoid binary version mismatch.
|
||||
|
||||
```shell
|
||||
export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python # to avoid protobuf binary version mismatch
|
||||
```
|
||||
|
||||
## Support
|
||||
For MindSpore-specific issues:
|
||||
|
||||
- Refer to the [MindSpore documentation](https://www.mindspore.cn/)
|
||||
28
third_party/sglang/docs/supported_models/extending/modelscope.md
vendored
Normal file
28
third_party/sglang/docs/supported_models/extending/modelscope.md
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
# Use Models From ModelScope
|
||||
|
||||
To use a model from [ModelScope](https://www.modelscope.cn), set the environment variable `SGLANG_USE_MODELSCOPE`.
|
||||
|
||||
```bash
|
||||
export SGLANG_USE_MODELSCOPE=true
|
||||
```
|
||||
|
||||
We take [Qwen2-7B-Instruct](https://www.modelscope.cn/models/qwen/qwen2-7b-instruct) as an example.
|
||||
|
||||
Launch the Server:
|
||||
```bash
|
||||
python -m sglang.launch_server --model-path qwen/Qwen2-7B-Instruct --port 30000
|
||||
```
|
||||
|
||||
Or start it by docker:
|
||||
|
||||
```bash
|
||||
docker run --gpus all \
|
||||
-p 30000:30000 \
|
||||
-v ~/.cache/modelscope:/root/.cache/modelscope \
|
||||
--env "SGLANG_USE_MODELSCOPE=true" \
|
||||
--ipc=host \
|
||||
lmsysorg/sglang:latest \
|
||||
python3 -m sglang.launch_server --model-path Qwen/Qwen2.5-7B-Instruct --host 0.0.0.0 --port 30000
|
||||
```
|
||||
|
||||
Note that modelscope uses a different cache directory than huggingface. You may need to set it manually to avoid running out of disk space.
|
||||
520
third_party/sglang/docs/supported_models/extending/support_new_models.md
vendored
Normal file
520
third_party/sglang/docs/supported_models/extending/support_new_models.md
vendored
Normal file
@@ -0,0 +1,520 @@
|
||||
# How to Support New Models
|
||||
|
||||
This document explains how to add support for new language models and multimodal large language models (MLLMs) in
|
||||
SGLang. It also covers how to test new models and register external implementations.
|
||||
|
||||
## How to Support a New Language Model
|
||||
|
||||
To support a new model in SGLang, you only need to add a single file under
|
||||
the [SGLang Models Directory](https://github.com/sgl-project/sglang/tree/main/python/sglang/srt/models). You can learn
|
||||
from existing model implementations and create a new file for your model. For most models, you should be able to find a
|
||||
similar model to start with (e.g., starting from Llama). Also refer how
|
||||
to [port a Model from vLLM to SGLang](#port-a-model-from-vllm-to-sglang)
|
||||
|
||||
## How to Support a New Multimodal Large Language Model
|
||||
|
||||
To support a new multimodal large language model (MLLM) in SGLang, there are several key components in addition to the
|
||||
standard LLM support:
|
||||
|
||||
1. **Register your new model as multimodal**:
|
||||
Extend `is_multimodal_model`
|
||||
in [model_config.py](https://github.com/sgl-project/sglang/blob/0ab3f437aba729b348a683ab32b35b214456efc7/python/sglang/srt/configs/model_config.py#L561)
|
||||
to return `True` for your model.
|
||||
|
||||
2. **Register a new chat-template**:
|
||||
Only when your default chat-template is unable to accept images as input: Register a new chat template in [conversation.py](https://github.com/sgl-project/sglang/blob/main/python/sglang/srt/parser/conversation.py) and the corresponding matching function.
|
||||
|
||||
3. **Multimodal Data Processor**:
|
||||
Define a new `Processor` class that inherits from `BaseMultimodalProcessor` and register this processor as your
|
||||
model’s dedicated processor.
|
||||
See [multimodal_processor.py](https://github.com/sgl-project/sglang/tree/main/python/sglang/srt/multimodal/processors)
|
||||
for more details.
|
||||
|
||||
4. **Handle Multimodal Tokens**:
|
||||
Implement a `pad_input_ids` function for your new model. In this function, multimodal tokens in the prompt should be
|
||||
expanded (if necessary) and padded with multimodal-data-hashes so that SGLang can recognize different multimodal data
|
||||
with `RadixAttention`.
|
||||
|
||||
5. **Handle Image Feature Extraction**:
|
||||
Implement a `get_image_feature` function for your new model, which extracts image features from raw image data and converts them into the embeddings used by the language model.
|
||||
|
||||
6. **Adapt to Vision Attention**:
|
||||
Adapt the multi-headed `Attention` of ViT with SGLang’s `VisionAttention`.
|
||||
|
||||
You can refer to [Qwen2VL](https://github.com/sgl-project/sglang/blob/main/python/sglang/srt/models/qwen2_vl.py) or
|
||||
other mllm implementations. These models demonstrate how to correctly handle both multimodal and textual inputs.
|
||||
|
||||
## Testing and Debugging
|
||||
|
||||
Please note all your testing and benchmarking results in PR description.
|
||||
|
||||
### Interactive Debugging
|
||||
|
||||
For interactive debugging, compare the outputs of Hugging Face/Transformers and SGLang. The following two commands
|
||||
should give the same text output and very similar prefill logits:
|
||||
|
||||
- Get the reference output:
|
||||
```bash
|
||||
python3 scripts/playground/reference_hf.py --model-path [new model] --model-type {text,vlm}
|
||||
```
|
||||
- Get the SGLang output:
|
||||
```bash
|
||||
python3 -m sglang.bench_one_batch --correct --model [new model]
|
||||
```
|
||||
|
||||
### Add the Model to the Test Suite
|
||||
|
||||
To ensure the new model is well maintained, add it to the test suite by including it in the `ALL_OTHER_MODELS` list in
|
||||
the [test_generation_models.py](https://github.com/sgl-project/sglang/blob/main/test/registered/models/test_generation_models.py)
|
||||
file, test the new model on your local machine and report the results on demonstrative benchmarks (GSM8K, MMLU, MMMU,
|
||||
MMMU-Pro, etc.) in your PR. \\
|
||||
For VLMs, also include a test in `test_vision_openai_server_{x}.py` (e.g. [test_vision_openai_server_a.py](https://github.com/sgl-project/sglang/blob/main/test/registered/vlm/test_vision_openai_server_a.py)).
|
||||
|
||||
This is an example command to run to test a new model on your local machine:
|
||||
|
||||
```bash
|
||||
ONLY_RUN=Qwen/Qwen2-1.5B python3 -m unittest test_generation_models.TestGenerationModels.test_others
|
||||
```
|
||||
|
||||
### Benchmark
|
||||
|
||||
- **(Required) MMMU**: follow MMMU benchmark [README.md](https://github.com/sgl-project/sglang/blob/main/benchmark/mmmu/README.md) to get SGLang vs. HF Transformer accuracy comparison. The accuracy score from SGLang run should not be much lower than that from HF Transformer run. Similarly, follow https://docs.sglang.io/developer_guide/benchmark_and_profiling.html to get performance comparison: TTFT and throughput must meet or exceed baselines (e.g., HF Transformer).
|
||||
- **(Optional) Other evals**: If you ran other evals, please note the results in PR description.
|
||||
|
||||
## Port a Model from vLLM to SGLang
|
||||
|
||||
The [vLLM Models Directory](https://github.com/vllm-project/vllm/tree/main/vllm/model_executor/models) is a valuable
|
||||
resource, as vLLM covers many models. SGLang reuses vLLM’s interface and some layers, making it easier to port models
|
||||
from vLLM to SGLang.
|
||||
|
||||
To port a model from vLLM to SGLang:
|
||||
|
||||
- Compare these two files for guidance:
|
||||
- [SGLang Llama Implementation](https://github.com/sgl-project/sglang/blob/main/python/sglang/srt/models/llama.py)
|
||||
- [vLLM Llama Implementation](https://github.com/vllm-project/vllm/blob/main/vllm/model_executor/models/llama.py)
|
||||
- The major differences include:
|
||||
- **Replace vLLM’s `Attention` with `RadixAttention`** (ensure you pass `layer_id` to `RadixAttention`).
|
||||
- **Replace vLLM’s `LogitsProcessor` with SGLang’s `LogitsProcessor`.**
|
||||
- **Replace the multi-headed `Attention` of ViT with SGLang’s `VisionAttention`.**
|
||||
- **Replace other vLLM layers** (such as `RMSNorm`, `SiluAndMul`) with SGLang layers.
|
||||
- **Remove `Sample`.**
|
||||
- **Change the `forward()` functions** and add a `forward_batch()` method.
|
||||
- **Add `EntryClass`** at the end.
|
||||
- **Ensure that the new implementation uses only SGLang components** and does not rely on any vLLM components.
|
||||
|
||||
Note: make sure you add your new model to the supported models list in the supported models documentation.
|
||||
|
||||
## Registering an External Model Implementation
|
||||
|
||||
In addition to the methods above, you can register your new model with the `ModelRegistry` before launching the server.
|
||||
This allows you to integrate your model without modifying the source code.
|
||||
|
||||
For example:
|
||||
|
||||
```python
|
||||
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)
|
||||
```
|
||||
|
||||
## Example: Implementing and Serving a Llama Wrapper Model
|
||||
|
||||
Below is an introductory, step-by-step walkthrough on how to implement a new model end-to-end in SGLang and then run it via the [Offline Engine](https://github.com/sgl-project/sglang/blob/main/docs/basic_usage/offline_engine_api.ipynb).
|
||||
|
||||
### Implementing Our Model
|
||||
|
||||
To keep things simple, this new model will be a simple wrapper around [Llama 3.1-8B-Instruct](https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct), and our goal will be just to bias the output logits for each `forward` call by taking the square root of each individual logit.
|
||||
|
||||
Let's start by defining our model in a file called `llama_wrapper.py`.
|
||||
The first step is to import the necessary libraries from SRT, which is SGLang's internal backend.
|
||||
|
||||
```python
|
||||
# In the file `llama_wrapper.py`
|
||||
|
||||
import torch
|
||||
from transformers import LlamaConfig
|
||||
from typing import Optional
|
||||
from sglang.srt.layers.logits_processor import LogitsProcessorOutput
|
||||
from sglang.srt.layers.quantization.base_config import QuantizationConfig
|
||||
from sglang.srt.model_executor.forward_batch_info import ForwardBatch, PPProxyTensors
|
||||
|
||||
from sglang.srt.models.llama import LlamaForCausalLM
|
||||
```
|
||||
|
||||
Next, we declare a new `class` for our model and have it inherit from `LlamaForCausalLM`, which allows our model to access `LlamaForCausalLM`'s predefined modules and layers, such as `LlamaAttention` and `LlamaMLP`.
|
||||
Note that almost all model implementations take in `config` and `quant_config` as arguments for their `__init__` method; `config` and `quant_config` are passed in via [`model_loader/loader.py`](https://github.com/sgl-project/sglang/blob/bf72b80122fd888bf619d17b96fa3e323ab809fc/python/sglang/srt/model_loader/loader.py#L219).
|
||||
Because we have inherited from `LlamaForCausalLM`, we can pass our parameters directly to its constructor, which will set the member variables for us.
|
||||
|
||||
```python
|
||||
class LlamaWrapper(LlamaForCausalLM):
|
||||
def __init__(
|
||||
self,
|
||||
config: LlamaConfig,
|
||||
quant_config: Optional[QuantizationConfig] = None,
|
||||
prefix: str = "",
|
||||
) -> None:
|
||||
super().__init__(config=config, quant_config=quant_config, prefix=prefix)
|
||||
```
|
||||
|
||||
Now, we want to define the `forward` method, which is what will be called at inference time.
|
||||
Note that the signature for `forward` is essentially the same for any model; you can take a look at the other models defined in the [`models` directory](https://github.com/sgl-project/sglang/blob/main/python/sglang/srt/models/) for references.
|
||||
To see where exactly `forward` is called in the SGLang runtime's internals, take a look at [`forward_decode`](https://github.com/sgl-project/sglang/blob/bf72b80122fd888bf619d17b96fa3e323ab809fc/python/sglang/srt/model_executor/model_runner.py#L1705) and [`forward_extend`](https://github.com/sgl-project/sglang/blob/bf72b80122fd888bf619d17b96fa3e323ab809fc/python/sglang/srt/model_executor/model_runner.py#L1724) in the [`ModelRunner` class](https://github.com/sgl-project/sglang/blob/main/python/sglang/srt/model_executor/model_runner.py).
|
||||
|
||||
```python
|
||||
@torch.no_grad()
|
||||
def forward(
|
||||
self,
|
||||
input_ids: torch.Tensor,
|
||||
positions: torch.Tensor,
|
||||
forward_batch: ForwardBatch,
|
||||
pp_proxy_tensors: Optional[PPProxyTensors] = None,
|
||||
input_embeds: Optional[torch.Tensor] = None,
|
||||
get_embedding: bool = False,
|
||||
) -> LogitsProcessorOutput:
|
||||
```
|
||||
|
||||
We now call the `__call__` method for `self.model` (which is a member variable that `LlamaForCausalLM` defines in its `__init__` method), which eventually calls `LlamaForCausalLM`'s `forward` method.
|
||||
After that, we feed the `hidden_states` into our model's `LogitsProcessor` (again defined in `LlamaForCausalLM`).
|
||||
|
||||
```python
|
||||
hidden_states = self.model(
|
||||
input_ids,
|
||||
positions,
|
||||
forward_batch,
|
||||
input_embeds,
|
||||
pp_proxy_tensors=pp_proxy_tensors,
|
||||
)
|
||||
|
||||
res: LogitsProcessorOutput = self.logits_processor(
|
||||
input_ids,
|
||||
hidden_states,
|
||||
self.lm_head,
|
||||
forward_batch,
|
||||
)
|
||||
```
|
||||
|
||||
After receiving the logits for the next token, we can finally perform our biasing step.
|
||||
|
||||
```python
|
||||
orig_logits = res.next_token_logits
|
||||
res.next_token_logits = torch.where(
|
||||
orig_logits > 0,
|
||||
orig_logits.sqrt(),
|
||||
orig_logits
|
||||
)
|
||||
|
||||
return res
|
||||
```
|
||||
|
||||
Now, our `LlamaWrapper` model is created and ready to be served!
|
||||
|
||||
### Serving Our Model Via SGLang's Offline Engine
|
||||
|
||||
The next step of this walkthrough involves hosting our new model offline, so that it can be served locally and without an HTTP server.
|
||||
|
||||
First, create a new file called `run.py`.
|
||||
Now, we must ensure that SGLang's `ModelRegistry` can find our model.
|
||||
To do this, we first download the model's configuration and weights from Huggingface.
|
||||
|
||||
```python
|
||||
# In the file `run.py`
|
||||
|
||||
import asyncio
|
||||
from functools import lru_cache
|
||||
from huggingface_hub import snapshot_download
|
||||
from llama_wrapper import LlamaWrapper # Make sure to import our new model!
|
||||
import sglang as sgl
|
||||
from sglang.srt.models.registry import ModelRegistry
|
||||
|
||||
# Make sure to request access to this model on Huggingface, then export your
|
||||
# `HF_TOKEN` to download the model snapshot
|
||||
llama_dir = snapshot_download(
|
||||
repo_id="meta-llama/Llama-3.1-8B-Instruct",
|
||||
local_dir="./llama_ckpt",
|
||||
)
|
||||
```
|
||||
|
||||
Now that we have our model on disk, we want to point it to `LlamaWrapper` by changing the `architectures` field in `./llama_ckpt/config.json` to be `LlamaWrapper`.
|
||||
That way, when we pass in the path of our model checkpoint to SGLang, it will know that we want to use "LlamaWrapper" instead of "LlamaForCausalLM" as our model.
|
||||
|
||||
```python
|
||||
{
|
||||
"architectures": [
|
||||
# "LlamaForCausalLM"
|
||||
"LlamaWrapper"
|
||||
],
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
However, if we don't link our `LlamaWrapper` class to the "LlamaWrapper" registry keyword, then SGLang won't be able to find our model.
|
||||
Thus, to register our `LlamaWrapper`, we want to follow the steps in the above section titled "Registering an External Model Implementation".
|
||||
|
||||
```python
|
||||
@lru_cache()
|
||||
def import_new_model_classes():
|
||||
model_arch_name_to_cls = {"LlamaWrapper": LlamaWrapper}
|
||||
return model_arch_name_to_cls
|
||||
|
||||
ModelRegistry.models.update(import_new_model_classes())
|
||||
```
|
||||
|
||||
Lastly, when we create our `Engine`, we just pass in the path to the local model directory.
|
||||
Then, our `LlamaWrapper` is ready to be served; for this walkthrough, we will use SGLang `Engine`'s non-streaming asynchronous generation endpoint.
|
||||
|
||||
```python
|
||||
def main():
|
||||
llm = sgl.Engine(model_path="./llama_ckpt")
|
||||
sampling_params = {"temperature": 0.2, "top_k": 5}
|
||||
prompts = [
|
||||
"Write a short, neutral self-introduction for a fictional character. Hello, my name is",
|
||||
"Provide a concise factual statement about France’s capital city. The capital of France is",
|
||||
"Explain possible future trends in artificial intelligence. The future of AI is",
|
||||
]
|
||||
|
||||
asyncio.run(run_llm(llm, sampling_params, prompts))
|
||||
|
||||
llm.shutdown()
|
||||
|
||||
async def run_llm(
|
||||
llm,
|
||||
sampling_params,
|
||||
prompts,
|
||||
) -> None:
|
||||
outputs = await llm.async_generate(prompts, sampling_params)
|
||||
|
||||
for prompt, output in zip(prompts, outputs):
|
||||
print(f"\nPrompt: {prompt}")
|
||||
print(f"Generated text: {output['text']}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
|
||||
Now, when we call `python run.py`, we will get the outputs of our newly created model!
|
||||
|
||||
## Serving External Models via the Standard CLI
|
||||
|
||||
The previous sections show how to register a model programmatically via `ModelRegistry` and serve it through the Offline Engine. Similar to vLLM model plugin, there is an alternative that lets you keep using the standard `python -m sglang.launch_server` CLI without modifying any SGLang source code: you can register your model using the `SGLANG_EXTERNAL_MODEL_PACKAGE` environment variable.
|
||||
|
||||
### The `EntryClass` Variable
|
||||
|
||||
When SGLang scans a model package, it looks for the variable `EntryClass` at the module level of your Python file. The [model registry](https://github.com/sgl-project/sglang/blob/main/python/sglang/srt/models/registry.py) imports your file, checks for `EntryClass`, and registers the class assigned to it. If you are using a model based on HuggingFace, the name of this class needs to match the `"architectures"` field in your model's `config.json`.
|
||||
|
||||
For example, if you are implementing a Llama wrapper, add this line at the end of your model file:
|
||||
|
||||
```python
|
||||
# This is what "Add EntryClass at the end" means
|
||||
EntryClass = LlamaWrapper
|
||||
```
|
||||
|
||||
### Example: Text-Only Model
|
||||
|
||||
Using the same Llama wrapper from the previous section, here is how to package and serve it via the CLI.
|
||||
|
||||
1. Create your project
|
||||
|
||||
```
|
||||
sglang_custom_project/
|
||||
|----setup.py
|
||||
|----custom_llm/
|
||||
|----__init__.py
|
||||
|----llama_wrapper.py
|
||||
```
|
||||
|
||||
Write the `setup.py`:
|
||||
|
||||
```python
|
||||
# sglang_custom_project/setup.py
|
||||
|
||||
from setuptools import setup, find_packages
|
||||
setup(
|
||||
name="sglang-custom-plugins",
|
||||
version="0.1",
|
||||
packages=find_packages(),
|
||||
)
|
||||
```
|
||||
|
||||
2. Write your model code
|
||||
|
||||
Inside `llama_wrapper.py`, write your model and include `EntryClass`:
|
||||
|
||||
```python
|
||||
# sglang_custom_project/custom_llm/llama_wrapper.py
|
||||
|
||||
import torch
|
||||
from typing import Optional
|
||||
from sglang.srt.layers.logits_processor import LogitsProcessorOutput
|
||||
from sglang.srt.layers.quantization.base_config import QuantizationConfig
|
||||
from sglang.srt.model_executor.forward_batch_info import ForwardBatch, PPProxyTensors
|
||||
from sglang.srt.models.llama import LlamaForCausalLM
|
||||
|
||||
class LlamaWrapper(LlamaForCausalLM):
|
||||
def __init__(self, config, quant_config: Optional[QuantizationConfig] = None,
|
||||
prefix: str = "") -> None:
|
||||
super().__init__(config=config, quant_config=quant_config, prefix=prefix)
|
||||
@torch.no_grad()
|
||||
def forward(self, input_ids, positions, forward_batch,
|
||||
pp_proxy_tensors=None, input_embeds=None, get_embedding=False):
|
||||
hidden_states = self.model(
|
||||
input_ids, positions, forward_batch, input_embeds,
|
||||
pp_proxy_tensors=pp_proxy_tensors,
|
||||
)
|
||||
res: LogitsProcessorOutput = self.logits_processor(
|
||||
input_ids, hidden_states, self.lm_head, forward_batch,
|
||||
)
|
||||
|
||||
orig = res.next_token_logits
|
||||
res.next_token_logits = torch.where(orig > 0, orig.sqrt(), orig)
|
||||
return res
|
||||
|
||||
# Don't forget to add EntryClass
|
||||
EntryClass = LlamaWrapper
|
||||
```
|
||||
|
||||
3. Install your package
|
||||
|
||||
Run this inside your `sglang_custom_project` directory to install your code into the active Python environment:
|
||||
|
||||
```bash
|
||||
pip install -e .
|
||||
```
|
||||
|
||||
4. Update your `config.json`
|
||||
|
||||
Update the `config.json` under your HuggingFace model checkpoint directory so the `architectures` field matches your class name:
|
||||
|
||||
```json
|
||||
{
|
||||
"architectures": ["LlamaWrapper"],
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
5. Launch the server
|
||||
|
||||
Set the environment variable before running the CLI:
|
||||
|
||||
```bash
|
||||
export SGLANG_EXTERNAL_MODEL_PACKAGE=custom_llm
|
||||
python -m sglang.launch_server \
|
||||
--model-path /path/to/Llama-3.1-8B-Instruct \
|
||||
--port 8000
|
||||
```
|
||||
|
||||
The `SGLANG_EXTERNAL_MODEL_PACKAGE` should be the parent folder name containing your model-related code. In this example, it should be `custom_llm`.
|
||||
|
||||
### Example: Multimodal Model
|
||||
|
||||
If you are working with multimodal models, setting `SGLANG_EXTERNAL_MODEL_PACKAGE` alone is not enough. SGLang also needs to recognize your architecture as multimodal to enable the image/video processing pipelines, and it needs a custom processor.
|
||||
|
||||
You can handle this by setting two additional environment variables:
|
||||
|
||||
- `SGLANG_EXTERNAL_MM_MODEL_ARCH`: Adds your architecture name to SGLang's internal list of multimodal models.
|
||||
- `SGLANG_EXTERNAL_MM_PROCESSOR_PACKAGE`: Tells SGLang where to find your custom processor class.
|
||||
|
||||
For example, let's build a custom model based on Qwen2-VL-Instruct that takes the square root of the logits.
|
||||
|
||||
Create the project:
|
||||
|
||||
```
|
||||
sglang_custom_project_vl/
|
||||
|----setup.py
|
||||
|----custom_vlm/
|
||||
|----__init__.py
|
||||
|----qwenvl_wrapper.py
|
||||
```
|
||||
|
||||
Write `setup.py`:
|
||||
|
||||
```python
|
||||
# sglang_custom_project_vl/setup.py
|
||||
|
||||
from setuptools import setup, find_packages
|
||||
setup(
|
||||
name="sglang-custom-plugins-vl",
|
||||
version="0.1",
|
||||
packages=find_packages(),
|
||||
)
|
||||
```
|
||||
|
||||
Write the model in `qwenvl_wrapper.py`:
|
||||
|
||||
```python
|
||||
# sglang_custom_project_vl/custom_vlm/qwenvl_wrapper.py
|
||||
import torch
|
||||
from sglang.srt.models.qwen2_vl import Qwen2VLForConditionalGeneration
|
||||
from sglang.srt.multimodal.processors.qwen_vl import QwenVLImageProcessor
|
||||
|
||||
class CustomQwen2VL(Qwen2VLForConditionalGeneration):
|
||||
def forward(self, input_ids, positions, forward_batch,
|
||||
input_embeds=None, get_embedding=False):
|
||||
res = super().forward(
|
||||
input_ids, positions, forward_batch,
|
||||
input_embeds=input_embeds, get_embedding=get_embedding
|
||||
)
|
||||
if not get_embedding:
|
||||
orig = res.next_token_logits
|
||||
res.next_token_logits = torch.where(orig > 0, orig.sqrt(), orig)
|
||||
return res
|
||||
|
||||
class CustomQwen2VLProcessor(QwenVLImageProcessor):
|
||||
models = [CustomQwen2VL]
|
||||
|
||||
def __init__(self, hf_config, server_args, _processor, *args, **kwargs):
|
||||
super().__init__(hf_config, server_args, _processor, *args, **kwargs)
|
||||
|
||||
EntryClass = CustomQwen2VL
|
||||
```
|
||||
|
||||
**Note:** you don't need a separate `EntryClass` for the custom processor as long as you associate the processor with the specific model class.
|
||||
|
||||
Install the package, update `config.json`, and launch:
|
||||
|
||||
```bash
|
||||
pip install -e .
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"architectures": ["CustomQwen2VL"],
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
```bash
|
||||
export SGLANG_EXTERNAL_MODEL_PACKAGE=custom_vlm
|
||||
export SGLANG_EXTERNAL_MM_MODEL_ARCH=CustomQwen2VL
|
||||
export SGLANG_EXTERNAL_MM_PROCESSOR_PACKAGE=custom_vlm
|
||||
|
||||
python -m sglang.launch_server \
|
||||
--model-path /path/to/Qwen2-VL-2B-Instruct \
|
||||
--port 8000 \
|
||||
--enable-multimodal
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
Add to table of supported models in [generative_models.md](../text_generation/generative_models.md) or [multimodal_language_models.md](../text_generation/multimodal_language_models.md)
|
||||
|
||||
---
|
||||
|
||||
By following these guidelines, you can add support for new language models and multimodal large language models in
|
||||
SGLang and ensure they are thoroughly tested and easily integrated into the system.
|
||||
58
third_party/sglang/docs/supported_models/extending/transformers_fallback.md
vendored
Normal file
58
third_party/sglang/docs/supported_models/extending/transformers_fallback.md
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
# Transformers fallback in SGLang
|
||||
|
||||
`sglang` can fall back to using models that are available in `transformers`. This works for most decoder-style language models and support for vision-language models is coming soon!
|
||||
|
||||
## Example launch Command
|
||||
|
||||
By default, we will use sglang implementation if it is available. Otherwise, we will fall back to transformers one. However, you can switch the implementation by setting `--model-impl` to `transformers`.
|
||||
|
||||
```shell
|
||||
python3 -m sglang.launch_server \
|
||||
--model-path meta-llama/Llama-3.2-1B-Instruct \
|
||||
--host 0.0.0.0 \
|
||||
--port 30000 \
|
||||
--model-impl transformers
|
||||
```
|
||||
|
||||
## Supported features
|
||||
|
||||
### Quantization
|
||||
|
||||
Transformers fall back has supported most of available quantization in SGLang (except GGUF). See [Quantization page](../../advanced_features/quantization.md) for more information about supported quantization in SGLang.
|
||||
|
||||
### Remote code
|
||||
|
||||
This fallback also means that any model on the hub that can be used in `transformers` with `trust_remote_code=True` that correctly implements attention can be used in production!
|
||||
|
||||
A model just needs the following two things:
|
||||
|
||||
```python
|
||||
from transformers import PreTrainedModel
|
||||
from torch import nn
|
||||
|
||||
class MyAttention(nn.Module):
|
||||
|
||||
def forward(self, hidden_states, **kwargs): # <- kwargs are required
|
||||
|
||||
...
|
||||
attention_interface = ALL_ATTENTION_FUNCTIONS[self.config._attn_implementation]
|
||||
attn_output, attn_weights = attention_interface(
|
||||
self,
|
||||
query_states,
|
||||
key_states,
|
||||
value_states,
|
||||
**kwargs,
|
||||
)
|
||||
...
|
||||
|
||||
class MyModel(PreTrainedModel):
|
||||
_supports_attention_backend = True
|
||||
```
|
||||
|
||||
Here is what happens in the background:
|
||||
|
||||
1. The config is loaded
|
||||
2. `MyModel` python class is loaded from the `auto_map`, and we check that the model `_supports_attention_backend`.
|
||||
3. The `TransformersModel` backend is used. See `/srt/models/transformers`, which leverages `self.config._attn_implementation = "sglang"`, thus the need to use `ALL_ATTENTION_FUNCTIONS`.
|
||||
|
||||
That's it!
|
||||
13
third_party/sglang/docs/supported_models/index.rst
vendored
Normal file
13
third_party/sglang/docs/supported_models/index.rst
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
Supported Models
|
||||
================
|
||||
|
||||
SGLang supports a wide variety of model architectures for different use cases.
|
||||
Browse by category below to find models suited for your needs.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
text_generation/index
|
||||
retrieval_ranking/index
|
||||
specialized/index
|
||||
extending/index
|
||||
162
third_party/sglang/docs/supported_models/retrieval_ranking/classify_models.md
vendored
Normal file
162
third_party/sglang/docs/supported_models/retrieval_ranking/classify_models.md
vendored
Normal file
@@ -0,0 +1,162 @@
|
||||
# Classification API
|
||||
|
||||
This document describes the `/v1/classify` API endpoint implementation in SGLang, which is compatible with vLLM's classification API format.
|
||||
|
||||
## Overview
|
||||
|
||||
The classification API allows you to classify text inputs using classification models. This implementation follows the same format as vLLM's 0.7.0 classification API.
|
||||
|
||||
## API Endpoint
|
||||
|
||||
```
|
||||
POST /v1/classify
|
||||
```
|
||||
|
||||
## Request Format
|
||||
|
||||
```json
|
||||
{
|
||||
"model": "model_name",
|
||||
"input": "text to classify"
|
||||
}
|
||||
```
|
||||
|
||||
### Parameters
|
||||
|
||||
- `model` (string, required): The name of the classification model to use
|
||||
- `input` (string, required): The text to classify
|
||||
- `user` (string, optional): User identifier for tracking
|
||||
- `rid` (string, optional): Request ID for tracking
|
||||
- `priority` (integer, optional): Request priority
|
||||
|
||||
## Response Format
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "classify-9bf17f2847b046c7b2d5495f4b4f9682",
|
||||
"object": "list",
|
||||
"created": 1745383213,
|
||||
"model": "jason9693/Qwen2.5-1.5B-apeach",
|
||||
"data": [
|
||||
{
|
||||
"index": 0,
|
||||
"label": "Default",
|
||||
"probs": [0.565970778465271, 0.4340292513370514],
|
||||
"num_classes": 2
|
||||
}
|
||||
],
|
||||
"usage": {
|
||||
"prompt_tokens": 10,
|
||||
"total_tokens": 10,
|
||||
"completion_tokens": 0,
|
||||
"prompt_tokens_details": null
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Response Fields
|
||||
|
||||
- `id`: Unique identifier for the classification request
|
||||
- `object`: Always "list"
|
||||
- `created`: Unix timestamp when the request was created
|
||||
- `model`: The model used for classification
|
||||
- `data`: Array of classification results
|
||||
- `index`: Index of the result
|
||||
- `label`: Predicted class label
|
||||
- `probs`: Array of probabilities for each class
|
||||
- `num_classes`: Total number of classes
|
||||
- `usage`: Token usage information
|
||||
- `prompt_tokens`: Number of input tokens
|
||||
- `total_tokens`: Total number of tokens
|
||||
- `completion_tokens`: Number of completion tokens (always 0 for classification)
|
||||
- `prompt_tokens_details`: Additional token details (optional)
|
||||
|
||||
## Example Usage
|
||||
|
||||
### Using curl
|
||||
|
||||
```bash
|
||||
curl -v "http://127.0.0.1:8000/v1/classify" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"model": "jason9693/Qwen2.5-1.5B-apeach",
|
||||
"input": "Loved the new café—coffee was great."
|
||||
}'
|
||||
```
|
||||
|
||||
### Using Python
|
||||
|
||||
```python
|
||||
import requests
|
||||
import json
|
||||
|
||||
# Make classification request
|
||||
response = requests.post(
|
||||
"http://127.0.0.1:8000/v1/classify",
|
||||
headers={"Content-Type": "application/json"},
|
||||
json={
|
||||
"model": "jason9693/Qwen2.5-1.5B-apeach",
|
||||
"input": "Loved the new café—coffee was great."
|
||||
}
|
||||
)
|
||||
|
||||
# Parse response
|
||||
result = response.json()
|
||||
print(json.dumps(result, indent=2))
|
||||
```
|
||||
|
||||
## Supported Models
|
||||
|
||||
The classification API works with any classification model supported by SGLang, including:
|
||||
|
||||
### Classification Models (Multi-class)
|
||||
- `LlamaForSequenceClassification` - Multi-class classification
|
||||
- `Qwen2ForSequenceClassification` - Multi-class classification
|
||||
- `Qwen3ForSequenceClassification` - Multi-class classification
|
||||
- `BertForSequenceClassification` - Multi-class classification
|
||||
- `Gemma2ForSequenceClassification` - Multi-class classification
|
||||
|
||||
**Label Mapping**: The API automatically uses the `id2label` mapping from the model's `config.json` file to provide meaningful label names instead of generic class names. If `id2label` is not available, it falls back to `LABEL_0`, `LABEL_1`, etc., or `Class_0`, `Class_1` as a last resort.
|
||||
|
||||
### Reward Models (Single score)
|
||||
- `InternLM2ForRewardModel` - Single reward score
|
||||
- `Qwen2ForRewardModel` - Single reward score
|
||||
- `LlamaForSequenceClassificationWithNormal_Weights` - Special reward model
|
||||
|
||||
**Note**: The `/classify` endpoint in SGLang was originally designed for reward models but now supports all non-generative models. Our `/v1/classify` endpoint provides a standardized vLLM-compatible interface for classification tasks.
|
||||
|
||||
## Error Handling
|
||||
|
||||
The API returns appropriate HTTP status codes and error messages:
|
||||
|
||||
- `400 Bad Request`: Invalid request format or missing required fields
|
||||
- `500 Internal Server Error`: Server-side processing error
|
||||
|
||||
Error response format:
|
||||
```json
|
||||
{
|
||||
"error": "Error message",
|
||||
"type": "error_type",
|
||||
"code": 400
|
||||
}
|
||||
```
|
||||
|
||||
## Implementation Details
|
||||
|
||||
The classification API is implemented using:
|
||||
|
||||
1. **Rust Model Gateway**: Handles routing and request/response models in `sgl-model-gateway/src/protocols/spec.rs`
|
||||
2. **Python HTTP Server**: Implements the actual endpoint in `python/sglang/srt/entrypoints/http_server.py`
|
||||
3. **Classification Service**: Handles the classification logic in `python/sglang/srt/entrypoints/openai/serving_classify.py`
|
||||
|
||||
## Testing
|
||||
|
||||
Use the provided test script to verify the implementation:
|
||||
|
||||
```bash
|
||||
python test_classify_api.py
|
||||
```
|
||||
|
||||
## Compatibility
|
||||
|
||||
This implementation is compatible with vLLM's classification API format, allowing seamless migration from vLLM to SGLang for classification tasks.
|
||||
126
third_party/sglang/docs/supported_models/retrieval_ranking/embedding_models.md
vendored
Normal file
126
third_party/sglang/docs/supported_models/retrieval_ranking/embedding_models.md
vendored
Normal file
@@ -0,0 +1,126 @@
|
||||
# Embedding Models
|
||||
|
||||
SGLang provides robust support for embedding models by integrating efficient serving mechanisms with its flexible programming interface. This integration allows for streamlined handling of embedding tasks, facilitating faster and more accurate retrieval and semantic search operations. SGLang's architecture enables better resource utilization and reduced latency in embedding model deployment.
|
||||
|
||||
```{important}
|
||||
Embedding models are executed with `--is-embedding` flag and some may require `--trust-remote-code`
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Launch Server
|
||||
|
||||
```shell
|
||||
python3 -m sglang.launch_server \
|
||||
--model-path Qwen/Qwen3-Embedding-4B \
|
||||
--is-embedding \
|
||||
--host 0.0.0.0 \
|
||||
--port 30000
|
||||
```
|
||||
|
||||
### Client Request
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
url = "http://127.0.0.1:30000"
|
||||
|
||||
payload = {
|
||||
"model": "Qwen/Qwen3-Embedding-4B",
|
||||
"input": "What is the capital of France?",
|
||||
"encoding_format": "float"
|
||||
}
|
||||
|
||||
response = requests.post(url + "/v1/embeddings", json=payload).json()
|
||||
print("Embedding:", response["data"][0]["embedding"])
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Multimodal Embedding Example
|
||||
|
||||
For multimodal models like GME that support both text and images:
|
||||
|
||||
```shell
|
||||
python3 -m sglang.launch_server \
|
||||
--model-path Alibaba-NLP/gme-Qwen2-VL-2B-Instruct \
|
||||
--is-embedding \
|
||||
--chat-template gme-qwen2-vl \
|
||||
--host 0.0.0.0 \
|
||||
--port 30000
|
||||
```
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
url = "http://127.0.0.1:30000"
|
||||
|
||||
text_input = "Represent this image in embedding space."
|
||||
image_path = "https://huggingface.co/datasets/liuhaotian/llava-bench-in-the-wild/resolve/main/images/023.jpg"
|
||||
|
||||
payload = {
|
||||
"model": "gme-qwen2-vl",
|
||||
"input": [
|
||||
{
|
||||
"text": text_input
|
||||
},
|
||||
{
|
||||
"image": image_path
|
||||
}
|
||||
],
|
||||
}
|
||||
|
||||
response = requests.post(url + "/v1/embeddings", json=payload).json()
|
||||
|
||||
print("Embeddings:", [x.get("embedding") for x in response.get("data", [])])
|
||||
```
|
||||
|
||||
## Matryoshka Embedding Example
|
||||
|
||||
[Matryoshka Embeddings](https://sbert.net/examples/sentence_transformer/training/matryoshka/README.html#matryoshka-embeddings) or [Matryoshka Representation Learning (MRL)](https://arxiv.org/abs/2205.13147) is a technique used in training embedding models. It allows user to trade off between performance and cost.
|
||||
|
||||
### 1. Launch a Matryoshka‑capable model
|
||||
|
||||
If the model config already includes `matryoshka_dimensions` or `is_matryoshka` then no override is needed. Otherwise, you can use `--json-model-override-args` as below:
|
||||
|
||||
```shell
|
||||
python3 -m sglang.launch_server \
|
||||
--model-path Qwen/Qwen3-Embedding-0.6B \
|
||||
--is-embedding \
|
||||
--host 0.0.0.0 \
|
||||
--port 30000 \
|
||||
--json-model-override-args '{"matryoshka_dimensions": [128, 256, 512, 1024, 1536]}'
|
||||
```
|
||||
|
||||
1. Setting `"is_matryoshka": true` allows truncating to any dimension. Otherwise, the server will validate that the specified dimension in the request is one of `matryoshka_dimensions`.
|
||||
2. Omitting `dimensions` in a request returns the full vector.
|
||||
|
||||
### 2. Make requests with different output dimensions
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
url = "http://127.0.0.1:30000"
|
||||
|
||||
# Request a truncated (Matryoshka) embedding by specifying a supported dimension.
|
||||
payload = {
|
||||
"model": "Qwen/Qwen3-Embedding-0.6B",
|
||||
"input": "Explain diffusion models simply.",
|
||||
"dimensions": 512 # change to 128 / 1024 / omit for full size
|
||||
}
|
||||
|
||||
response = requests.post(url + "/v1/embeddings", json=payload).json()
|
||||
print("Embedding:", response["data"][0]["embedding"])
|
||||
```
|
||||
|
||||
|
||||
## Supported Models
|
||||
|
||||
| Model Family | Example Model | Chat Template | Description |
|
||||
| ------------------------------------------ | -------------------------------------- | ------------- | --------------------------------------------------------------------------- |
|
||||
| **E5 (Llama/Mistral based)** | `intfloat/e5-mistral-7b-instruct` | N/A | High-quality text embeddings based on Mistral/Llama architectures |
|
||||
| **GTE-Qwen2** | `Alibaba-NLP/gte-Qwen2-7B-instruct` | N/A | Alibaba's text embedding model with multilingual support |
|
||||
| **Qwen3-Embedding** | `Qwen/Qwen3-Embedding-4B` | N/A | Latest Qwen3-based text embedding model for semantic representation |
|
||||
| **BGE** | `BAAI/bge-large-en-v1.5` | N/A | BAAI's text embeddings (requires `attention-backend` triton/torch_native) |
|
||||
| **GME (Multimodal)** | `Alibaba-NLP/gme-Qwen2-VL-2B-Instruct`| `gme-qwen2-vl`| Multimodal embedding for text and image cross-modal tasks |
|
||||
| **CLIP** | `openai/clip-vit-large-patch14-336` | N/A | OpenAI's CLIP for image and text embeddings |
|
||||
11
third_party/sglang/docs/supported_models/retrieval_ranking/index.rst
vendored
Normal file
11
third_party/sglang/docs/supported_models/retrieval_ranking/index.rst
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
Retrieval & Ranking
|
||||
===================
|
||||
|
||||
Models for embeddings, reranking, and classification.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
embedding_models.md
|
||||
rerank_models.md
|
||||
classify_models.md
|
||||
314
third_party/sglang/docs/supported_models/retrieval_ranking/rerank_models.md
vendored
Normal file
314
third_party/sglang/docs/supported_models/retrieval_ranking/rerank_models.md
vendored
Normal file
@@ -0,0 +1,314 @@
|
||||
# Rerank Models
|
||||
|
||||
SGLang offers comprehensive support for rerank models by incorporating optimized serving frameworks with a flexible programming interface. This setup enables efficient processing of cross-encoder reranking tasks, improving the accuracy and relevance of search result ordering. SGLang’s design ensures high throughput and low latency during reranker model deployment, making it ideal for semantic-based result refinement in large-scale retrieval systems.
|
||||
|
||||
```{important}
|
||||
Rerank models in SGLang fall into two categories:
|
||||
|
||||
- **Cross-encoder rerank models**: run with `--is-embedding` (embedding runner).
|
||||
- **Decoder-only rerank models**: run **without** `--is-embedding` and use next-token logprob scoring (yes/no).
|
||||
- Text-only (e.g. Qwen3-Reranker)
|
||||
- Multimodal (e.g. Qwen3-VL-Reranker): also supports image/video content
|
||||
|
||||
Some models may require `--trust-remote-code`.
|
||||
```
|
||||
|
||||
## Supported rerank models
|
||||
|
||||
| Model Family (Rerank) | Example HuggingFace Identifier | Chat Template | Description |
|
||||
|------------------------------------------------|--------------------------------------|---------------|----------------------------------------------------------------------------------------------------------------------------------|
|
||||
| **BGE-Reranker (BgeRerankModel)** | `BAAI/bge-reranker-v2-m3` | N/A | Currently only support `attention-backend` `triton` and `torch_native`. High-performance cross-encoder reranker model from BAAI. Suitable for reranking search results based on semantic relevance. |
|
||||
| **Qwen3-Reranker (decoder-only yes/no)** | `Qwen/Qwen3-Reranker-8B` | `examples/chat_template/qwen3_reranker.jinja` | Decoder-only reranker using next-token logprob scoring for labels (yes/no). Launch **without** `--is-embedding`. |
|
||||
| **Qwen3-VL-Reranker (multimodal yes/no)** | `Qwen/Qwen3-VL-Reranker-2B` | `examples/chat_template/qwen3_vl_reranker.jinja` | Multimodal decoder-only reranker supporting text, images, and videos. Uses yes/no logprob scoring. Launch **without** `--is-embedding`. |
|
||||
|
||||
|
||||
## Cross-Encoder Rerank (embedding runner)
|
||||
|
||||
### Launch Command
|
||||
|
||||
```shell
|
||||
python3 -m sglang.launch_server \
|
||||
--model-path BAAI/bge-reranker-v2-m3 \
|
||||
--host 0.0.0.0 \
|
||||
--disable-radix-cache \
|
||||
--chunked-prefill-size -1 \
|
||||
--attention-backend triton \
|
||||
--is-embedding \
|
||||
--port 30000
|
||||
```
|
||||
|
||||
### Example Client Request
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
url = "http://127.0.0.1:30000/v1/rerank"
|
||||
|
||||
payload = {
|
||||
"model": "BAAI/bge-reranker-v2-m3",
|
||||
"query": "what is panda?",
|
||||
"documents": [
|
||||
"hi",
|
||||
"The giant panda (Ailuropoda melanoleuca), sometimes called a panda bear or simply panda, is a bear species endemic to China."
|
||||
],
|
||||
"top_n": 1,
|
||||
"return_documents": True
|
||||
}
|
||||
|
||||
response = requests.post(url, json=payload)
|
||||
response_json = response.json()
|
||||
|
||||
for item in response_json:
|
||||
if item.get("document"):
|
||||
print(f"Score: {item['score']:.2f} - Document: '{item['document']}'")
|
||||
else:
|
||||
print(f"Score: {item['score']:.2f} - Index: {item['index']}")
|
||||
```
|
||||
|
||||
**Request Parameters:**
|
||||
|
||||
- `query` (required): The query text to rank documents against
|
||||
- `documents` (required): List of documents to be ranked
|
||||
- `model` (required): Model to use for reranking
|
||||
- `top_n` (optional): Maximum number of documents to return. Defaults to returning all documents. If specified value is greater than the total number of documents, all documents will be returned.
|
||||
- `return_documents` (optional): Whether to return documents in the response. Defaults to `True`.
|
||||
|
||||
## Qwen3-Reranker (decoder-only yes/no rerank)
|
||||
|
||||
### Launch Command
|
||||
|
||||
```shell
|
||||
python3 -m sglang.launch_server \
|
||||
--model-path Qwen/Qwen3-Reranker-0.6B \
|
||||
--trust-remote-code \
|
||||
--disable-radix-cache \
|
||||
--host 0.0.0.0 \
|
||||
--port 8001 \
|
||||
--chat-template examples/chat_template/qwen3_reranker.jinja
|
||||
```
|
||||
|
||||
```{note}
|
||||
Qwen3-Reranker uses decoder-only logprob scoring (yes/no). Do NOT launch it with `--is-embedding`.
|
||||
```
|
||||
|
||||
### Example Client Request (supports optional instruct, top_n, and return_documents)
|
||||
|
||||
```shell
|
||||
curl -X POST http://127.0.0.1:8001/v1/rerank \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"model": "Qwen3-Reranker-0.6B",
|
||||
"query": "法国首都是哪里?",
|
||||
"documents": [
|
||||
"法国的首都是巴黎。",
|
||||
"德国的首都是柏林。",
|
||||
"香蕉是黄色的水果。"
|
||||
],
|
||||
"instruct": "Given a web search query, retrieve relevant passages that answer the query.",
|
||||
"top_n": 2,
|
||||
"return_documents": true
|
||||
}'
|
||||
```
|
||||
|
||||
**Request Parameters:**
|
||||
|
||||
- `query` (required): The query text to rank documents against
|
||||
- `documents` (required): List of documents to be ranked
|
||||
- `model` (required): Model to use for reranking
|
||||
- `instruct` (optional): Instruction text for the reranker
|
||||
- `top_n` (optional): Maximum number of documents to return. Defaults to returning all documents. If specified value is greater than the total number of documents, all documents will be returned.
|
||||
- `return_documents` (optional): Whether to return documents in the response. Defaults to `True`.
|
||||
|
||||
### Response Format
|
||||
|
||||
`/v1/rerank` returns a list of objects (sorted by descending score):
|
||||
|
||||
- `score`: float, higher means more relevant
|
||||
- `document`: the original document string (only included when `return_documents` is `true`)
|
||||
- `index`: the original index in the input `documents`
|
||||
- `meta_info`: optional debug/usage info (may be present for some models)
|
||||
|
||||
The number of returned results is controlled by the `top_n` parameter. If `top_n` is not specified or is greater than the total number of documents, all documents are returned.
|
||||
|
||||
Example (with `return_documents: true`):
|
||||
|
||||
```json
|
||||
[
|
||||
{"score": 0.99, "document": "法国的首都是巴黎。", "index": 0},
|
||||
{"score": 0.01, "document": "德国的首都是柏林。", "index": 1},
|
||||
{"score": 0.00, "document": "香蕉是黄色的水果。", "index": 2}
|
||||
]
|
||||
```
|
||||
|
||||
Example (with `return_documents: false`):
|
||||
|
||||
```json
|
||||
[
|
||||
{"score": 0.99, "index": 0},
|
||||
{"score": 0.01, "index": 1},
|
||||
{"score": 0.00, "index": 2}
|
||||
]
|
||||
```
|
||||
|
||||
Example (with `top_n: 2`):
|
||||
|
||||
```json
|
||||
[
|
||||
{"score": 0.99, "document": "法国的首都是巴黎。", "index": 0},
|
||||
{"score": 0.01, "document": "德国的首都是柏林。", "index": 1}
|
||||
]
|
||||
```
|
||||
|
||||
### Common Pitfalls
|
||||
|
||||
- **`--chat-template` is required.** Without `--chat-template examples/chat_template/qwen3_reranker.jinja`, the server does not recognize the model as a decoder-only reranker and returns a 400 error: `"This model does not appear to be an embedding model by default. Please add `--is-embedding`..."`. The fix is to add the chat template flag, NOT `--is-embedding`.
|
||||
- If you launch Qwen3-Reranker with `--is-embedding`, `/v1/rerank` cannot compute yes/no logprob scores. Relaunch **without** `--is-embedding`.
|
||||
- If you see a validation error like "score should be a valid number" and the backend returned a list, upgrade to a version that coerces `embedding[0]` into `score` for rerank responses.
|
||||
|
||||
## Qwen3-VL-Reranker (multimodal decoder-only rerank)
|
||||
|
||||
Qwen3-VL-Reranker extends the Qwen3-Reranker to support multimodal content, allowing reranking of documents containing text, images, and videos.
|
||||
|
||||
### Launch Command
|
||||
|
||||
```shell
|
||||
python3 -m sglang.launch_server \
|
||||
--model-path Qwen/Qwen3-VL-Reranker-2B \
|
||||
--trust-remote-code \
|
||||
--disable-radix-cache \
|
||||
--host 0.0.0.0 \
|
||||
--port 30000 \
|
||||
--chat-template examples/chat_template/qwen3_vl_reranker.jinja
|
||||
```
|
||||
|
||||
```{note}
|
||||
Qwen3-VL-Reranker uses decoder-only logprob scoring (yes/no) like Qwen3-Reranker. Do NOT launch it with `--is-embedding`.
|
||||
```
|
||||
|
||||
### Text-Only Reranking (backward compatible)
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
url = "http://127.0.0.1:30000/v1/rerank"
|
||||
|
||||
payload = {
|
||||
"model": "Qwen3-VL-Reranker-2B",
|
||||
"query": "What is machine learning?",
|
||||
"documents": [
|
||||
"Machine learning is a branch of artificial intelligence that enables computers to learn from data.",
|
||||
"The weather in Paris is usually mild with occasional rain.",
|
||||
"Deep learning is a subset of machine learning using neural networks with many layers.",
|
||||
],
|
||||
"instruct": "Retrieve passages that answer the question.",
|
||||
"return_documents": True
|
||||
}
|
||||
|
||||
response = requests.post(url, json=payload)
|
||||
results = response.json()
|
||||
|
||||
for item in results:
|
||||
print(f"Score: {item['score']:.4f} - {item['document'][:60]}...")
|
||||
```
|
||||
|
||||
### Image Reranking (text query, image/mixed documents)
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
url = "http://127.0.0.1:30000/v1/rerank"
|
||||
|
||||
payload = {
|
||||
"query": "A woman playing with her dog on a beach at sunset.",
|
||||
"documents": [
|
||||
# Document 1: Text description
|
||||
"A woman shares a joyful moment with her golden retriever on a sun-drenched beach at sunset.",
|
||||
# Document 2: Image URL
|
||||
[
|
||||
{
|
||||
"type": "image_url",
|
||||
"image_url": {
|
||||
"url": "https://example.com/beach_dog.jpeg"
|
||||
}
|
||||
}
|
||||
],
|
||||
# Document 3: Text + Image (mixed)
|
||||
[
|
||||
{"type": "text", "text": "A joyful scene at the beach:"},
|
||||
{
|
||||
"type": "image_url",
|
||||
"image_url": {
|
||||
"url": "https://example.com/beach_dog.jpeg"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
"instruct": "Retrieve images or text relevant to the user's query.",
|
||||
"return_documents": False
|
||||
}
|
||||
|
||||
response = requests.post(url, json=payload)
|
||||
results = response.json()
|
||||
|
||||
for item in results:
|
||||
print(f"Index: {item['index']}, Score: {item['score']:.4f}")
|
||||
```
|
||||
|
||||
### Multimodal Query Reranking (query with image)
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
url = "http://127.0.0.1:30000/v1/rerank"
|
||||
|
||||
payload = {
|
||||
# Query with text and image
|
||||
"query": [
|
||||
{"type": "text", "text": "Find similar images to this:"},
|
||||
{
|
||||
"type": "image_url",
|
||||
"image_url": {
|
||||
"url": "https://example.com/reference_image.jpeg"
|
||||
}
|
||||
}
|
||||
],
|
||||
"documents": [
|
||||
"A cat sleeping on a couch.",
|
||||
"A woman and her dog enjoying the sunset at the beach.",
|
||||
"A busy city street with cars and pedestrians.",
|
||||
[
|
||||
{
|
||||
"type": "image_url",
|
||||
"image_url": {
|
||||
"url": "https://example.com/similar_image.jpeg"
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
"instruct": "Find images or descriptions similar to the query image."
|
||||
}
|
||||
|
||||
response = requests.post(url, json=payload)
|
||||
results = response.json()
|
||||
|
||||
for item in results:
|
||||
print(f"Index: {item['index']}, Score: {item['score']:.4f}")
|
||||
```
|
||||
|
||||
### Request Parameters (Multimodal)
|
||||
|
||||
- `query` (required): Can be a string (text-only) or a list of content parts:
|
||||
- `{"type": "text", "text": "..."}` for text
|
||||
- `{"type": "image_url", "image_url": {"url": "..."}}` for images
|
||||
- `{"type": "video_url", "video_url": {"url": "..."}}` for videos
|
||||
- `documents` (required): List where each document can be a string or list of content parts (same format as query)
|
||||
- `instruct` (optional): Instruction text for the reranker
|
||||
- `top_n` (optional): Maximum number of documents to return
|
||||
- `return_documents` (optional): Whether to return documents in the response (default: `false`)
|
||||
|
||||
### Common Pitfalls
|
||||
|
||||
- Always use `--chat-template examples/chat_template/qwen3_vl_reranker.jinja` for Qwen3-VL-Reranker.
|
||||
- Do NOT launch with `--is-embedding`.
|
||||
- For best results, use `--disable-radix-cache` to avoid caching issues with multimodal content.
|
||||
- **Note**: Currently only `Qwen3-VL-Reranker-2B` is tested and supported. The 8B model may have different behavior and is not guaranteed to work with this template.
|
||||
9
third_party/sglang/docs/supported_models/specialized/index.rst
vendored
Normal file
9
third_party/sglang/docs/supported_models/specialized/index.rst
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
Specialized Models
|
||||
==================
|
||||
|
||||
Models for specialized tasks like reward modeling.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
reward_models.md
|
||||
28
third_party/sglang/docs/supported_models/specialized/reward_models.md
vendored
Normal file
28
third_party/sglang/docs/supported_models/specialized/reward_models.md
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
# Reward Models
|
||||
|
||||
These models output a scalar reward score or classification result, often used in reinforcement learning or content moderation tasks.
|
||||
|
||||
```{important}
|
||||
They are executed with `--is-embedding` and some may require `--trust-remote-code`.
|
||||
```
|
||||
|
||||
## Example launch Command
|
||||
|
||||
```shell
|
||||
python3 -m sglang.launch_server \
|
||||
--model-path Qwen/Qwen2.5-Math-RM-72B \ # example HF/local path
|
||||
--is-embedding \
|
||||
--host 0.0.0.0 \
|
||||
--tp-size=4 \ # set for tensor parallelism
|
||||
--port 30000 \
|
||||
```
|
||||
|
||||
## Supported models
|
||||
|
||||
| Model Family (Reward) | Example HuggingFace Identifier | Description |
|
||||
|---------------------------------------------------------------------------|-----------------------------------------------------|---------------------------------------------------------------------------------|
|
||||
| **Llama (3.1 Reward / `LlamaForSequenceClassification`)** | `Skywork/Skywork-Reward-Llama-3.1-8B-v0.2` | Reward model (preference classifier) based on Llama 3.1 (8B) for scoring and ranking responses for RLHF. |
|
||||
| **Gemma 2 (27B Reward / `Gemma2ForSequenceClassification`)** | `Skywork/Skywork-Reward-Gemma-2-27B-v0.2` | Derived from Gemma‑2 (27B), this model provides human preference scoring for RLHF and multilingual tasks. |
|
||||
| **InternLM 2 (Reward / `InternLM2ForRewardMode`)** | `internlm/internlm2-7b-reward` | InternLM 2 (7B)–based reward model used in alignment pipelines to guide outputs toward preferred behavior. |
|
||||
| **Qwen2.5 (Reward - Math / `Qwen2ForRewardModel`)** | `Qwen/Qwen2.5-Math-RM-72B` | A 72B math-specialized RLHF reward model from the Qwen2.5 series, tuned for evaluating and refining responses. |
|
||||
| **Qwen2.5 (Reward - Sequence / `Qwen2ForSequenceClassification`)** | `jason9693/Qwen2.5-1.5B-apeach` | A smaller Qwen2.5 variant used for sequence classification, offering an alternative RLHF scoring mechanism. |
|
||||
111
third_party/sglang/docs/supported_models/text_generation/diffusion_language_models.md
vendored
Normal file
111
third_party/sglang/docs/supported_models/text_generation/diffusion_language_models.md
vendored
Normal file
@@ -0,0 +1,111 @@
|
||||
# Diffusion Language Models
|
||||
|
||||
Diffusion language models have shown promise for non-autoregressive text generation with parallel decoding capabilities. Unlike auto-regressive language models, different diffusion language models require different decoding strategies.
|
||||
|
||||
## Example Launch Command
|
||||
|
||||
SGLang supports different DLLM algorithms such as `LowConfidence` and `JointThreshold`.
|
||||
|
||||
```shell
|
||||
python3 -m sglang.launch_server \
|
||||
--model-path inclusionAI/LLaDA2.0-mini \ # example HF/local path
|
||||
--dllm-algorithm LowConfidence \
|
||||
--dllm-algorithm-config ./config.yaml \ # Optional. Uses the algorithm's default if not set.
|
||||
--host 0.0.0.0 \
|
||||
--port 30000
|
||||
```
|
||||
|
||||
## Example Configuration File
|
||||
|
||||
Depending on the algorithm selected, the configuration parameters vary.
|
||||
|
||||
LowConfidence Config:
|
||||
|
||||
```yaml
|
||||
# Confidence threshold for accepting predicted tokens
|
||||
# - Higher values: More conservative, better quality but slower
|
||||
# - Lower values: More aggressive, faster but potentially lower quality
|
||||
# Range: 0.0 - 1.0
|
||||
threshold: 0.95
|
||||
|
||||
# Default: 32, for LLaDA2MoeModelLM
|
||||
block_size: 32
|
||||
```
|
||||
|
||||
JointThreshold Config:
|
||||
|
||||
```yaml
|
||||
# Decoding threshold for Mask-to-Token (M2T) phase
|
||||
# - Higher values: More conservative, better quality but slower
|
||||
# - Lower values: More aggressive, faster but potentially lower quality
|
||||
# Range: 0.0 - 1.0
|
||||
threshold: 0.5
|
||||
# Decoding threshold for Token-to-Token (T2T) phase
|
||||
# Range: 0.0 - 1.0
|
||||
# Setting to 0.0 allows full editing (recommended for most cases).
|
||||
edit_threshold: 0.0
|
||||
# Max extra T2T steps after all masks are removed. Prevents infinite loops.
|
||||
max_post_edit_steps: 16
|
||||
# 2-gram repetition penalty (default 0).
|
||||
# An empirical value of 3 is often sufficient to mitigate most repetitions.
|
||||
penalty_lambda: 0
|
||||
```
|
||||
|
||||
## Example Client Code Snippet
|
||||
|
||||
Just like other supported models, diffusion language models can be used via the REST API or Python client.
|
||||
|
||||
Python client example for making a generation request to the launched server:
|
||||
|
||||
```python
|
||||
import sglang as sgl
|
||||
|
||||
def main():
|
||||
llm = sgl.Engine(model_path="inclusionAI/LLaDA2.0-mini",
|
||||
dllm_algorithm="LowConfidence",
|
||||
max_running_requests=1,
|
||||
trust_remote_code=True)
|
||||
|
||||
prompts = [
|
||||
"<role>SYSTEM</role>detailed thinking off<|role_end|><role>HUMAN</role> Write a brief introduction of the great wall <|role_end|><role>ASSISTANT</role>"
|
||||
]
|
||||
|
||||
sampling_params = {
|
||||
"temperature": 0,
|
||||
"max_new_tokens": 1024,
|
||||
}
|
||||
|
||||
outputs = llm.generate(prompts, sampling_params)
|
||||
print(outputs)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
```
|
||||
|
||||
Curl example for making a generation request to the launched server:
|
||||
|
||||
```bash
|
||||
curl -X POST "http://127.0.0.1:30000/generate" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"text": [
|
||||
"<role>SYSTEM</role>detailed thinking off<|role_end|><role>HUMAN</role> Write the number from 1 to 128 <|role_end|><role>ASSISTANT</role>",
|
||||
"<role>SYSTEM</role>detailed thinking off<|role_end|><role>HUMAN</role> Write a brief introduction of the great wall <|role_end|><role>ASSISTANT</role>"
|
||||
],
|
||||
"stream": true,
|
||||
"sampling_params": {
|
||||
"temperature": 0,
|
||||
"max_new_tokens": 1024
|
||||
}
|
||||
}'
|
||||
```
|
||||
|
||||
## Supported Models
|
||||
|
||||
Below the supported models are summarized in a table.
|
||||
|
||||
| Model Family | Example Model | Description |
|
||||
| -------------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------- |
|
||||
| **LLaDA2.0 (mini, flash)** | `inclusionAI/LLaDA2.0-flash` | LLaDA2.0-flash is a diffusion language model featuring a 100B Mixture-of-Experts (MoE) architecture. |
|
||||
| **SDAR (JetLM)** | `JetLM/SDAR-8B-Chat` | SDAR series diffusion language model (Chat), dense architecture. |
|
||||
| **SDAR (JetLM)** | `JetLM/SDAR-30B-A3B-Chat` | SDAR series diffusion language model (Chat), MoE architecture. |
|
||||
76
third_party/sglang/docs/supported_models/text_generation/generative_models.md
vendored
Normal file
76
third_party/sglang/docs/supported_models/text_generation/generative_models.md
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
# Large Language Models
|
||||
|
||||
These models accept text input and produce text output (e.g., chat completions). They are primarily large language models (LLMs), some with mixture-of-experts (MoE) architectures for scaling.
|
||||
|
||||
## Example launch Command
|
||||
|
||||
```shell
|
||||
python3 -m sglang.launch_server \
|
||||
--model-path meta-llama/Llama-3.2-1B-Instruct \ # example HF/local path
|
||||
--host 0.0.0.0 \
|
||||
--port 30000 \
|
||||
```
|
||||
|
||||
## Supported models
|
||||
|
||||
Below the supported models are summarized in a table.
|
||||
|
||||
If you are unsure if a specific architecture is implemented, you can search for it via GitHub. For example, to search for `Qwen3ForCausalLM`, use the expression:
|
||||
|
||||
```
|
||||
repo:sgl-project/sglang path:/^python\/sglang\/srt\/models\// Qwen3ForCausalLM
|
||||
```
|
||||
|
||||
in the GitHub search bar.
|
||||
|
||||
| Model Family (Variants) | Example HuggingFace Identifier | Description |
|
||||
|-------------------------------------|--------------------------------------------------|----------------------------------------------------------------------------------------|
|
||||
| **DeepSeek** (v1, v2, v3/R1) | `deepseek-ai/DeepSeek-R1` | Series of advanced reasoning-optimized models (including a 671B MoE) trained with reinforcement learning; top performance on complex reasoning, math, and code tasks. [SGLang provides Deepseek v3/R1 model-specific optimizations](../../basic_usage/deepseek_v3.md) and [Reasoning Parser](../../advanced_features/separate_reasoning.ipynb)|
|
||||
| **Kimi K2** (Thinking, Instruct) | `moonshotai/Kimi-K2-Instruct` | Moonshot AI's 1 trillion parameter MoE model (32B active) with 128K–256K context; state-of-the-art agentic intelligence with stable long-horizon agency across 200–300 sequential tool calls. Features MLA attention and native INT4 quantization. [See Reasoning Parser docs](../../advanced_features/separate_reasoning.ipynb)|
|
||||
| **Kimi Linear** (48B-A3B) | `moonshotai/Kimi-Linear-48B-A3B-Instruct` | Moonshot AI's hybrid linear attention model (48B total, 3B active) with 1M token context; features Kimi Delta Attention (KDA) for up to 6× faster decoding and 75% KV cache reduction vs full attention. |
|
||||
| **GPT-OSS** | `openai/gpt-oss-20b`, `openai/gpt-oss-120b` | OpenAI’s latest GPT-OSS series for complex reasoning, agentic tasks, and versatile developer use cases.|
|
||||
| **Qwen** (3.5, 3, 3MoE, 3Next, 2.5, 2 series) | `Qwen/Qwen3.5-397B-A17B`, `Qwen/Qwen3-0.6B`, `Qwen/Qwen3-30B-A3B`, `Qwen/Qwen3-Next-80B-A3B-Instruct` | Alibaba’s latest Qwen3 series for complex reasoning, language understanding, and generation tasks; Support for MoE variants along with previous generation 2.5, 2, etc. [SGLang provides Qwen3 specific reasoning parser](../../advanced_features/separate_reasoning.ipynb)|
|
||||
| **Llama** (2, 3.x, 4 series) | `meta-llama/Llama-4-Scout-17B-16E-Instruct` | Meta's open LLM series, spanning 7B to 400B parameters (Llama 2, 3, and new Llama 4) with well-recognized performance. [SGLang provides Llama-4 model-specific optimizations](../../basic_usage/llama4.md) |
|
||||
| **Mistral** (Mixtral, NeMo, Small3) | `mistralai/Mistral-7B-Instruct-v0.2` | Open 7B LLM by Mistral AI with strong performance; extended into MoE (“Mixtral”) and NeMo Megatron variants for larger scale. |
|
||||
| **Gemma** (v1, v2, v3) | `google/gemma-3-1b-it` | Google’s family of efficient multilingual models (1B–27B); Gemma 3 offers a 128K context window, and its larger (4B+) variants support vision input. |
|
||||
| **Phi** (Phi-1.5, Phi-2, Phi-3, Phi-4, Phi-MoE series) | `microsoft/Phi-4-multimodal-instruct`, `microsoft/Phi-3.5-MoE-instruct` | Microsoft’s Phi family of small models (1.3B–5.6B); Phi-4-multimodal (5.6B) processes text, images, and speech, Phi-4-mini is a high-accuracy text model and Phi-3.5-MoE is a mixture-of-experts model. |
|
||||
| **MiniCPM** (v3, 4B) | `openbmb/MiniCPM3-4B` | OpenBMB’s series of compact LLMs for edge devices; MiniCPM 3 (4B) achieves GPT-3.5-level results in text tasks. |
|
||||
| **OLMo** (2, 3) | `allenai/OLMo-3-1125-32B`, `allenai/OLMo-3-32B-Think`, `allenai/OLMo-2-1124-7B-Instruct` | Allen AI’s series of Open Language Models designed to enable the science of language models. |
|
||||
| **OLMoE** (Open MoE) | `allenai/OLMoE-1B-7B-0924` | Allen AI’s open Mixture-of-Experts model (7B total, 1B active parameters) delivering state-of-the-art results with sparse expert activation. |
|
||||
| **MiniMax-M2** (M2, M2.1, M2.5) | `MiniMaxAI/MiniMax-M2.5`, `MiniMaxAI/MiniMax-M2.1`, `MiniMaxAI/MiniMax-M2` | MiniMax's SOTA LLM for coding & agentic workflows. |
|
||||
| **StableLM** (3B, 7B) | `stabilityai/stablelm-tuned-alpha-7b` | StabilityAI’s early open-source LLM (3B & 7B) for general text generation; a demonstration model with basic instruction-following ability. |
|
||||
| **Command-(R,A)** (Cohere) | `CohereLabs/c4ai-command-r-v01`, `CohereLabs/c4ai-command-r7b-12-2024`, `CohereLabs/c4ai-command-a-03-2025` | Cohere’s open conversational LLM (Command series) optimized for long context, retrieval-augmented generation, and tool use. |
|
||||
| **DBRX** (Databricks) | `databricks/dbrx-instruct` | Databricks’ 132B-parameter MoE model (36B active) trained on 12T tokens; competes with GPT-3.5 quality as a fully open foundation model. |
|
||||
| **Grok** (xAI) | `xai-org/grok-1` | xAI’s grok-1 model known for vast size(314B parameters) and high quality; integrated in SGLang for high-performance inference. |
|
||||
| **ChatGLM** (GLM-130B family) | `THUDM/chatglm2-6b` | Zhipu AI’s bilingual chat model (6B) excelling at Chinese-English dialogue; fine-tuned for conversational quality and alignment. |
|
||||
| **InternLM 2** (7B, 20B) | `internlm/internlm2-7b` | Next-gen InternLM (7B and 20B) from SenseTime, offering strong reasoning and ultra-long context support (up to 200K tokens). |
|
||||
| **ExaONE 3** (Korean-English) | `LGAI-EXAONE/EXAONE-3.5-7.8B-Instruct` | LG AI Research’s Korean-English model (7.8B) trained on 8T tokens; provides high-quality bilingual understanding and generation. |
|
||||
| **Baichuan 2** (7B, 13B) | `baichuan-inc/Baichuan2-13B-Chat` | BaichuanAI’s second-generation Chinese-English LLM (7B/13B) with improved performance and an open commercial license. |
|
||||
| **XVERSE** (MoE) | `xverse/XVERSE-MoE-A36B` | Yuanxiang’s open MoE LLM (XVERSE-MoE-A36B: 255B total, 36B active) supporting ~40 languages; delivers 100B+ dense-level performance via expert routing. |
|
||||
| **SmolLM** (135M–1.7B) | `HuggingFaceTB/SmolLM-1.7B` | Hugging Face’s ultra-small LLM series (135M–1.7B params) offering surprisingly strong results, enabling advanced AI on mobile/edge devices. |
|
||||
| **GLM-4** (Multilingual 9B) | `ZhipuAI/glm-4-9b-chat` | Zhipu’s GLM-4 series (up to 9B parameters) – open multilingual models with support for 1M-token context and even a 5.6B multimodal variant (Phi-4V). |
|
||||
| **MiMo** (7B series) | `XiaomiMiMo/MiMo-7B-RL` | Xiaomi's reasoning-optimized model series, leverages Multiple-Token Prediction for faster inference. |
|
||||
| **ERNIE-4.5** (4.5, 4.5MoE series) | `baidu/ERNIE-4.5-21B-A3B-PT` | Baidu's ERNIE-4.5 series which consists of MoE with 47B and 3B active parameters, with the largest model having 424B total parameters, as well as a 0.3B dense model. |
|
||||
| **Arcee AFM-4.5B** | `arcee-ai/AFM-4.5B-Base` | Arcee's foundational model series for real world reliability and edge deployments. |
|
||||
| **Persimmon** (8B) | `adept/persimmon-8b-chat` | Adept’s open 8B model with a 16K context window and fast inference; trained for broad usability and licensed under Apache 2.0. |
|
||||
| **Solar** (10.7B) | `upstage/SOLAR-10.7B-Instruct-v1.0` | Upstage's 10.7B parameter model, optimized for instruction-following tasks. This architecture incorporates a depth-up scaling methodology, enhancing model performance. |
|
||||
| **Tele FLM** (52B-1T) | `CofeAI/Tele-FLM` | BAAI & TeleAI's multilingual model, available in 52-billion and 1-trillion parameter variants. It is a decoder-only transformer trained on ~2T tokens |
|
||||
| **Ling** (16.8B–290B) | `inclusionAI/Ling-lite`, `inclusionAI/Ling-plus` | InclusionAI’s open MoE models. Ling-Lite has 16.8B total / 2.75B active parameters, and Ling-Plus has 290B total / 28.8B active parameters. They are designed for high performance on NLP and complex reasoning tasks. |
|
||||
| **Granite 3.0, 3.1** (IBM) | `ibm-granite/granite-3.1-8b-instruct` | IBM's open dense foundation models optimized for reasoning, code, and business AI use cases. Integrated with Red Hat and watsonx systems. |
|
||||
| **Granite 3.0 MoE** (IBM) | `ibm-granite/granite-3.0-3b-a800m-instruct` | IBM’s Mixture-of-Experts models offering strong performance with cost-efficiency. MoE expert routing designed for enterprise deployment at scale. |
|
||||
| **GPT-J** (6B) | `EleutherAI/gpt-j-6b` | EleutherAI's GPT-2-like causal language model (6B) trained on the [Pile](https://pile.eleuther.ai/) dataset. |
|
||||
| **Orion** (14B) | `OrionStarAI/Orion-14B-Base` | A series of open-source multilingual large language models by OrionStarAI, pretrained on a 2.5T token multilingual corpus including Chinese, English, Japanese, Korean, etc, and it exhibits superior performance in these languages. |
|
||||
| **Llama Nemotron Super** (v1, v1.5, NVIDIA) | `nvidia/Llama-3_3-Nemotron-Super-49B-v1`, `nvidia/Llama-3_3-Nemotron-Super-49B-v1_5` | The [NVIDIA Nemotron](https://www.nvidia.com/en-us/ai-data-science/foundation-models/nemotron/) family of multimodal models provides state-of-the-art reasoning models specifically designed for enterprise-ready AI agents. |
|
||||
| **Llama Nemotron Ultra** (v1, NVIDIA) | `nvidia/Llama-3_1-Nemotron-Ultra-253B-v1` | The [NVIDIA Nemotron](https://www.nvidia.com/en-us/ai-data-science/foundation-models/nemotron/) family of multimodal models provides state-of-the-art reasoning models specifically designed for enterprise-ready AI agents. |
|
||||
| **NVIDIA Nemotron Nano 2.0** | `nvidia/NVIDIA-Nemotron-Nano-9B-v2` | The [NVIDIA Nemotron](https://www.nvidia.com/en-us/ai-data-science/foundation-models/nemotron/) family of multimodal models provides state-of-the-art reasoning models specifically designed for enterprise-ready AI agents. `Nemotron-Nano-9B-v2` is a hybrid Mamba-Transformer language model designed to increase throughput for reasoning workloads while achieving state-of-the-art accuracy compared to similarly-sized models. |
|
||||
| **NVIDIA Nemotron 3 Super** (NVIDIA) | `nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4` | The [NVIDIA Nemotron](https://www.nvidia.com/en-us/ai-data-science/foundation-models/nemotron/) 3 Super is a 120B-parameter MoE model (12B active) delivering high-quality reasoning and generation for enterprise AI agents. |
|
||||
| **NVIDIA Nemotron 3 Nano** (NVIDIA) | `nvidia/NVIDIA-Nemotron-3-Nano-4B-BF16` | The [NVIDIA Nemotron](https://www.nvidia.com/en-us/ai-data-science/foundation-models/nemotron/) 3 Nano is a compact model designed for efficient edge and enterprise deployment with strong reasoning capabilities. |
|
||||
| **StarCoder2** (3B-15B) | `bigcode/starcoder2-7b` | StarCoder2 is a family of open large language models (LLMs) specialized for code generation and understanding. It is the successor to StarCoder, jointly developed by the BigCode project (a collaboration between Hugging Face, ServiceNow Research, and other contributors). |
|
||||
| **Jet-Nemotron** | `jet-ai/Jet-Nemotron-2B` | Jet-Nemotron is a new family of hybrid-architecture language models that surpass state-of-the-art open-source full-attention language models, while achieving significant efficiency gains. |
|
||||
| **Trinity** (Nano, Mini) | `arcee-ai/Trinity-Mini` | Arcee's foundational MoE Trinity family of models, open weights under Apache 2.0. |
|
||||
| **LFM2** (350M, 1.2B) | `LiquidAI/LFM2.5-1.2B-Instruct` | Liquid AI's hybrid attention + short convolution language model. |
|
||||
| **LFM2-MoE** (8B-A1B, 24B-A2B) | `LiquidAI/LFM2-8B-A1B` | Liquid AI's Mixture-of-Experts variant with sigmoid routing and top-k expert selection. |
|
||||
| **Falcon-H1** (0.5B–34B) | `tiiuae/Falcon-H1-34B-Instruct` | TII's hybrid Mamba-Transformer architecture combining attention and state-space models for efficient long-context inference. |
|
||||
| **Hunyuan-Large** (389B, MoE) | `tencent/Tencent-Hunyuan-Large` | Tencent's open-source MoE model with 389B total / 52B active parameters, featuring Cross-Layer Attention (CLA) for improved efficiency. |
|
||||
| **IBM Granite 4.0 (Hybrid, Dense)** | `ibm-granite/granite-4.0-h-micro`, `ibm-granite/granite-4.0-micro` | IBM Granite 4.0 micro models: hybrid Mamba–MoE (`h-micro`) and dense (`micro`) variants. Enterprise-focused reasoning models |
|
||||
| **Sarvam 2** (30B-A2B, 105B-A10B) | `sarvamai/sarvam-2` | Sarvam's Mixture-of-Experts models. The 105B variant uses MLA (Multi-head Latent Attention) and the 30B variant uses GQA, both with 128 routed experts. |
|
||||
11
third_party/sglang/docs/supported_models/text_generation/index.rst
vendored
Normal file
11
third_party/sglang/docs/supported_models/text_generation/index.rst
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
Text Generation
|
||||
===============
|
||||
|
||||
Models for generating text from text or multimodal inputs.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
generative_models.md
|
||||
multimodal_language_models.md
|
||||
diffusion_language_models.md
|
||||
137
third_party/sglang/docs/supported_models/text_generation/multimodal_language_models.md
vendored
Normal file
137
third_party/sglang/docs/supported_models/text_generation/multimodal_language_models.md
vendored
Normal file
@@ -0,0 +1,137 @@
|
||||
# Multimodal Language Models
|
||||
|
||||
These models accept multi-modal inputs (e.g., images and text) and generate text output. They augment language models with multimodal encoders.
|
||||
|
||||
## Example launch Command
|
||||
|
||||
```shell
|
||||
python3 -m sglang.launch_server \
|
||||
--model-path meta-llama/Llama-3.2-11B-Vision-Instruct \ # example HF/local path
|
||||
--host 0.0.0.0 \
|
||||
--port 30000 \
|
||||
```
|
||||
|
||||
> See the [OpenAI APIs section](https://docs.sglang.io/basic_usage/openai_api_vision.html) for how to send multimodal requests.
|
||||
|
||||
## Supported models
|
||||
|
||||
Below the supported models are summarized in a table.
|
||||
|
||||
If you are unsure if a specific architecture is implemented, you can search for it via GitHub. For example, to search for `Qwen2_5_VLForConditionalGeneration`, use the expression:
|
||||
|
||||
```
|
||||
repo:sgl-project/sglang path:/^python\/sglang\/srt\/models\// Qwen2_5_VLForConditionalGeneration
|
||||
```
|
||||
|
||||
in the GitHub search bar.
|
||||
|
||||
|
||||
| Model Family (Variants) | Example HuggingFace Identifier | Description | Notes |
|
||||
|----------------------------|--------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------|
|
||||
| **Qwen-VL** | `Qwen/Qwen3-VL-235B-A22B-Instruct` | Alibaba's vision-language extension of Qwen; for example, Qwen2.5-VL (7B and larger variants) can analyze and converse about image content. | |
|
||||
| **DeepSeek-VL2** | `deepseek-ai/deepseek-vl2` | Vision-language variant of DeepSeek (with a dedicated image processor), enabling advanced multimodal reasoning on image and text inputs. | |
|
||||
| **DeepSeek-OCR / OCR-2** | `deepseek-ai/DeepSeek-OCR-2` | OCR-focused DeepSeek models for document understanding and text extraction. | Use `--trust-remote-code`. |
|
||||
| **Janus-Pro** (1B, 7B) | `deepseek-ai/Janus-Pro-7B` | DeepSeek's open-source multimodal model capable of both image understanding and generation. Janus-Pro employs a decoupled architecture for separate visual encoding paths, enhancing performance in both tasks. | |
|
||||
| **MiniCPM-V / MiniCPM-o** | `openbmb/MiniCPM-V-2_6` | MiniCPM-V (2.6, ~8B) supports image inputs, and MiniCPM-o adds audio/video; these multimodal LLMs are optimized for end-side deployment on mobile/edge devices. | |
|
||||
| **Llama 3.2 Vision** (11B) | `meta-llama/Llama-3.2-11B-Vision-Instruct` | Vision-enabled variant of Llama 3 (11B) that accepts image inputs for visual question answering and other multimodal tasks. | |
|
||||
| **LLaVA** (v1.5 & v1.6) | *e.g.* `liuhaotian/llava-v1.5-13b` | Open vision-chat models that add an image encoder to LLaMA/Vicuna (e.g. LLaMA2 13B) for following multimodal instruction prompts. | |
|
||||
| **LLaVA-NeXT** (8B, 72B) | `lmms-lab/llava-next-72b` | Improved LLaVA models (with an 8B Llama3 version and a 72B version) offering enhanced visual instruction-following and accuracy on multimodal benchmarks. | |
|
||||
| **LLaVA-OneVision** | `lmms-lab/llava-onevision-qwen2-7b-ov` | Enhanced LLaVA variant integrating Qwen as the backbone; supports multiple images (and even video frames) as inputs via an OpenAI Vision API-compatible format. | |
|
||||
| **Gemma 3 (Multimodal)** | `google/gemma-3-4b-it` | Gemma 3's larger models (4B, 12B, 27B) accept images (each image encoded as 256 tokens) alongside text in a combined 128K-token context. | |
|
||||
| **Kimi-VL** (A3B) | `moonshotai/Kimi-VL-A3B-Instruct` | Kimi-VL is a multimodal model that can understand and generate text from images. | |
|
||||
| **Mistral-Small-3.1-24B** | `mistralai/Mistral-Small-3.1-24B-Instruct-2503` | Mistral 3.1 is a multimodal model that can generate text from text or images input. It also supports tool calling and structured output. | |
|
||||
| **Phi-4-multimodal-instruct** | `microsoft/Phi-4-multimodal-instruct` | Phi-4-multimodal-instruct is the multimodal variant of the Phi-4-mini model, enhanced with LoRA for improved multimodal capabilities. It supports text, vision and audio modalities in SGLang. | |
|
||||
| **MiMo-VL** (7B) | `XiaomiMiMo/MiMo-VL-7B-RL` | Xiaomi's compact yet powerful vision-language model featuring a native resolution ViT encoder for fine-grained visual details, an MLP projector for cross-modal alignment, and the MiMo-7B language model optimized for complex reasoning tasks. | |
|
||||
| **GLM-4.5V** (106B) / **GLM-4.1V**(9B) | `zai-org/GLM-4.5V` | GLM-4.5V and GLM-4.1V-Thinking: Towards Versatile Multimodal Reasoning with Scalable Reinforcement Learning | Use `--chat-template glm-4v` |
|
||||
| **GLM-OCR** | `zai-org/GLM-OCR` | GLM-OCR: A fast and accurate general OCR model | |
|
||||
| **DotsVLM** (General/OCR) | `rednote-hilab/dots.vlm1.inst` | RedNote's vision-language model built on a 1.2B vision encoder and DeepSeek V3 LLM, featuring NaViT vision encoder trained from scratch with dynamic resolution support and enhanced OCR capabilities through structured image data training. | |
|
||||
| **DotsVLM-OCR** | `rednote-hilab/dots.ocr` | Specialized OCR variant of DotsVLM optimized for optical character recognition tasks with enhanced text extraction and document understanding capabilities. | Don't use `--trust-remote-code` |
|
||||
| **NVILA** (8B, 15B, Lite-2B, Lite-8B, Lite-15B) | `Efficient-Large-Model/NVILA-8B` | `chatml` | NVILA explores the full stack efficiency of multi-modal design, achieving cheaper training, faster deployment and better performance. |
|
||||
| **NVIDIA Nemotron Nano 2.0 VL** | `nvidia/NVIDIA-Nemotron-Nano-12B-v2-VL-BF16` | NVIDIA Nemotron Nano v2 VL enables multi-image reasoning and video understanding, along with strong document intelligence, visual Q&A and summarization capabilities. It builds on Nemotron Nano V2, a hybrid Mamba-Transformer LLM, in order to achieve higher inference throughput in long document and video scenarios. | Use `--trust-remote-code`. You may need to adjust `--max-mamba-cache-size` [default is 512] to fit memory constraints. |
|
||||
| **Ernie4.5-VL** | `baidu/ERNIE-4.5-VL-28B-A3B-PT` | Baidu's vision-language models(28B,424B). Support image and video comprehension, and also support thinking. | |
|
||||
| **JetVLM** | | JetVLM is an vision-language model designed for high-performance multimodal understanding and generation tasks built upon Jet-Nemotron. | Coming soon |
|
||||
| **Step3-VL** (10B) | `stepfun-ai/Step3-VL-10B` | StepFun's lightweight open-source 10B parameter VLM for multimodal intelligence, excelling in visual perception, complex reasoning, and human alignment. | |
|
||||
| **Qwen3-Omni** | `Qwen/Qwen3-Omni-30B-A3B-Instruct` | Alibaba's omni-modal MoE model. Currently supports the **Thinker** component (multimodal understanding for text, images, audio, and video), while the **Talker** component (audio generation) is not yet supported. | |
|
||||
| **LFM2-VL** | `LiquidAI/LFM2.5-VL-1.6B` | Liquid AI's vision-language model combining a SigLip2 vision encoder (NaFlex variable-resolution) with the LFM2 hybrid attention + short convolution language model. Supports multi-image inputs. | |
|
||||
|
||||
## Video Input Support
|
||||
|
||||
SGLang supports video input for Vision-Language Models (VLMs), enabling temporal reasoning tasks such as video question answering, captioning, and holistic scene understanding. Video clips are decoded, key frames are sampled, and the resulting tensors are batched together with the text prompt, allowing multimodal inference to integrate visual and linguistic context.
|
||||
|
||||
| Model Family | Example Identifier | Video notes |
|
||||
|--------------|--------------------|-------------|
|
||||
| **Qwen-VL** (Qwen2-VL, Qwen2.5-VL, Qwen3-VL, Qwen3-Omni) | `Qwen/Qwen3-VL-235B-A22B-Instruct` | The processor gathers `video_data`, runs Qwen's frame sampler, and merges the resulting features with text tokens before inference. |
|
||||
| **GLM-4v** (4.5V, 4.1V, MOE) | `zai-org/GLM-4.5V` | Video clips are read with Decord, converted to tensors, and passed to the model alongside metadata for rotary-position handling. |
|
||||
| **NVILA** (Full & Lite) | `Efficient-Large-Model/NVILA-8B` | The runtime samples eight frames per clip and attaches them to the multimodal request when `video_data` is present. |
|
||||
| **LLaVA video variants** (LLaVA-NeXT-Video, LLaVA-OneVision) | `lmms-lab/LLaVA-NeXT-Video-7B` | The processor routes video prompts to the LlavaVid video-enabled architecture, and the provided example shows how to query it with `sgl.video(...)` clips. |
|
||||
| **NVIDIA Nemotron Nano 2.0 VL** | `nvidia/NVIDIA-Nemotron-Nano-12B-v2-VL-BF16` | The processor samples at 2 FPS, at a max of 128 frames, as per model training. The model uses [EVS](../../../python/sglang/srt/multimodal/evs/README.md), a pruning method that removes redundant tokens from video embeddings. By default `video_pruning_rate=0.7`. Change this by providing: `--json-model-override-args '{"video_pruning_rate": 0.0}'` to disable EVS, for example. |
|
||||
| **JetVLM** | | The runtime samples eight frames per clip and attaches them to the multimodal request when `video_data` is present. |
|
||||
|
||||
Use `sgl.video(path, num_frames)` when building prompts to attach clips from your SGLang programs.
|
||||
|
||||
Example OpenAI-compatible request that sends a video clip:
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
url = "http://localhost:30000/v1/chat/completions"
|
||||
|
||||
data = {
|
||||
"model": "Qwen/Qwen3-VL-30B-A3B-Instruct",
|
||||
"messages": [
|
||||
{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{"type": "text", "text": "What’s happening in this video?"},
|
||||
{
|
||||
"type": "video_url",
|
||||
"video_url": {
|
||||
"url": "https://github.com/sgl-project/sgl-test-files/raw/refs/heads/main/videos/jobs_presenting_ipod.mp4"
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
],
|
||||
"max_tokens": 300,
|
||||
}
|
||||
|
||||
response = requests.post(url, json=data)
|
||||
print(response.text)
|
||||
```
|
||||
|
||||
## Usage Notes
|
||||
|
||||
### Performance Optimization
|
||||
|
||||
For multimodal models, you can use the `--keep-mm-feature-on-device` flag to optimize for latency at the cost of increased GPU memory usage:
|
||||
|
||||
- **Default behavior**: Multimodal feature tensors are moved to CPU after processing to save GPU memory
|
||||
- **With `--keep-mm-feature-on-device`**: Feature tensors remain on GPU, reducing device-to-host copy overhead and improving latency, but consuming more GPU memory
|
||||
|
||||
Use this flag when you have sufficient GPU memory and want to minimize latency for multimodal inference.
|
||||
|
||||
### Multimodal Inputs Limitation
|
||||
|
||||
- **Use `--mm-process-config '{"image":{"max_pixels":1048576},"video":{"fps":3,"max_pixels":602112,"max_frames":60}}'`**: To set `image`, `video`, and `audio` input limits.
|
||||
|
||||
This can reduce GPU memory usage, improve inference speed, and help to avoid OOM, but may impact model performance, thus set a proper value based on your specific use case. Currently, only `qwen_vl` supports this config. Please refer to [qwen_vl processor](https://github.com/sgl-project/sglang/blob/main/python/sglang/srt/multimodal/processors/qwen_vl.py) for understanding the meaning of each parameter.
|
||||
|
||||
### Bidirectional Attention in Multimodal Model Serving
|
||||
**Note for serving the Gemma-3 multimodal model**:
|
||||
|
||||
As mentioned in [Welcome Gemma 3: Google's all new multimodal, multilingual, long context open LLM
|
||||
](https://huggingface.co/blog/gemma3#multimodality), Gemma-3 employs bidirectional attention between image tokens during the prefill phase. Currently, SGLang only supports bidirectional attention when using the Triton Attention Backend. Note, however, that SGLang's current bidirectional attention implementation is incompatible with both CUDA Graph and Chunked Prefill.
|
||||
|
||||
To enable bidirectional attention, you can use the `TritonAttnBackend` while disabling CUDA Graph and Chunked Prefill. Example launch command:
|
||||
```shell
|
||||
python -m sglang.launch_server \
|
||||
--model-path google/gemma-3-4b-it \
|
||||
--host 0.0.0.0 --port 30000 \
|
||||
--enable-multimodal \
|
||||
--dtype bfloat16 --triton-attention-reduce-in-fp32 \
|
||||
--attention-backend triton \ # Use Triton attention backend
|
||||
--disable-cuda-graph \ # Disable Cuda Graph
|
||||
--chunked-prefill-size -1 # Disable Chunked Prefill
|
||||
```
|
||||
|
||||
If higher serving performance is required and a certain degree of accuracy loss is acceptable, you may choose to use other attention backends, and you can also enable features like CUDA Graph and Chunked Prefill for better performance, but note that the model will fall back to using causal attention instead of bidirectional attention.
|
||||
Reference in New Issue
Block a user