From f6af3a6561b2528531bcb4815012b085280d4ec7 Mon Sep 17 00:00:00 2001 From: Lianmin Zheng Date: Sat, 24 Aug 2024 08:02:23 -0700 Subject: [PATCH] Cleanup readme, llava examples, usage examples and nccl init (#1194) --- README.md | 39 ++++---- docs/en/sampling_params.md | 9 +- .../quick_start/anthropic_example_chat.py | 0 .../quick_start/anthropic_example_complete.py | 0 .../quick_start/azure_openai_example_chat.py | 0 .../quick_start/gemini_example_chat.py | 0 .../quick_start/gemini_example_complete.py | 0 .../gemini_example_multimodal_chat.py | 0 .../quick_start/images/cat.jpeg | Bin .../quick_start/images/dog.jpeg | Bin .../quick_start/local_example_chat.py} | 2 +- .../quick_start/local_example_complete.py} | 2 +- .../quick_start/local_example_llava_next.py} | 23 ++++- .../quick_start/openai_example_chat.py | 0 .../quick_start/openai_example_complete.py | 0 .../quick_start/openrouter_example_chat.py | 0 .../quick_start/together_example_chat.py | 0 .../quick_start/together_example_complete.py | 0 .../usage/chinese_regex.py | 0 .../usage/choices_logprob.py | 0 .../usage/cot_decoding.py | 0 .../usage/json_decode.py | 0 .../usage/json_logprobs.py | 0 .../usage/llava_video/srt_example_llava_v.py | 5 +- .../usage/llava_video/srt_example_llava_v.sh | 0 .../usage/openai_chat_speculative.py | 0 .../usage/openai_parallel_sample.py | 0 .../usage/openai_speculative.py | 0 .../usage/parallel_sample.py | 0 .../trace_and_evaluate_rag_using_parea.ipynb | 0 .../usage/readme_examples.py | 0 .../usage/streaming.py | 0 .../usage/triton/Dockerfile | 0 .../usage/triton/README.md | 0 .../models/character_generation/1/model.py | 0 .../models/character_generation/config.pbtxt | 0 examples/quick_start/srt_example_yi_vl.py | 70 -------------- .../async_io.py => runtime/async_io_api.py} | 0 .../http_llama3_llava_test.py | 3 +- .../http_llava_onevision_test.py | 9 +- .../llava_onevision}/http_qwen_llava_test.py | 3 +- .../{usage => runtime}/openai_batch_chat.py | 0 .../openai_batch_complete.py | 0 examples/usage/llava/srt_llava_next_test.py | 90 ------------------ .../max-tokens-fixed-rag-trace.png | Bin 134888 -> 0 bytes python/sglang/bench_latency.py | 6 +- python/sglang/lang/chat_template.py | 4 +- python/sglang/launch_server_llavavid.py | 29 ------ python/sglang/srt/layers/decode_attention.py | 2 +- python/sglang/srt/layers/fused_moe/layer.py | 4 +- python/sglang/srt/layers/logits_processor.py | 4 +- python/sglang/srt/managers/schedule_batch.py | 2 +- .../sglang/srt/managers/tokenizer_manager.py | 3 + .../sglang/srt/model_executor/model_runner.py | 86 +++++++++++------ python/sglang/srt/models/gemma2.py | 12 ++- python/sglang/srt/models/grok.py | 17 +++- python/sglang/srt/server_args.py | 19 ++-- python/sglang/srt/utils.py | 6 +- python/sglang/test/runners.py | 22 ++--- scripts/{ => deprecated}/convert_yi_vl.py | 0 scripts/{ => deprecated}/convert_yi_vl.sh | 0 test/srt/models/test_embedding_models.py | 2 +- test/srt/models/test_generation_models.py | 2 +- test/srt/run_suite.py | 2 +- test/srt/test_vision_openai_server.py | 14 +-- 65 files changed, 174 insertions(+), 317 deletions(-) rename examples/{ => frontend_language}/quick_start/anthropic_example_chat.py (100%) rename examples/{ => frontend_language}/quick_start/anthropic_example_complete.py (100%) rename examples/{ => frontend_language}/quick_start/azure_openai_example_chat.py (100%) rename examples/{ => frontend_language}/quick_start/gemini_example_chat.py (100%) rename examples/{ => frontend_language}/quick_start/gemini_example_complete.py (100%) rename examples/{ => frontend_language}/quick_start/gemini_example_multimodal_chat.py (100%) rename examples/{ => frontend_language}/quick_start/images/cat.jpeg (100%) rename examples/{ => frontend_language}/quick_start/images/dog.jpeg (100%) rename examples/{quick_start/srt_example_chat.py => frontend_language/quick_start/local_example_chat.py} (98%) rename examples/{quick_start/srt_example_complete.py => frontend_language/quick_start/local_example_complete.py} (97%) rename examples/{quick_start/srt_example_llava.py => frontend_language/quick_start/local_example_llava_next.py} (69%) rename examples/{ => frontend_language}/quick_start/openai_example_chat.py (100%) rename examples/{ => frontend_language}/quick_start/openai_example_complete.py (100%) rename examples/{ => frontend_language}/quick_start/openrouter_example_chat.py (100%) rename examples/{ => frontend_language}/quick_start/together_example_chat.py (100%) rename examples/{ => frontend_language}/quick_start/together_example_complete.py (100%) rename examples/{ => frontend_language}/usage/chinese_regex.py (100%) rename examples/{ => frontend_language}/usage/choices_logprob.py (100%) rename examples/{ => frontend_language}/usage/cot_decoding.py (100%) rename examples/{ => frontend_language}/usage/json_decode.py (100%) rename examples/{ => frontend_language}/usage/json_logprobs.py (100%) rename examples/{ => frontend_language}/usage/llava_video/srt_example_llava_v.py (99%) rename examples/{ => frontend_language}/usage/llava_video/srt_example_llava_v.sh (100%) rename examples/{ => frontend_language}/usage/openai_chat_speculative.py (100%) rename examples/{ => frontend_language}/usage/openai_parallel_sample.py (100%) rename examples/{ => frontend_language}/usage/openai_speculative.py (100%) rename examples/{ => frontend_language}/usage/parallel_sample.py (100%) rename examples/{ => frontend_language}/usage/rag_using_parea/trace_and_evaluate_rag_using_parea.ipynb (100%) rename examples/{ => frontend_language}/usage/readme_examples.py (100%) rename examples/{ => frontend_language}/usage/streaming.py (100%) rename examples/{ => frontend_language}/usage/triton/Dockerfile (100%) rename examples/{ => frontend_language}/usage/triton/README.md (100%) rename examples/{ => frontend_language}/usage/triton/models/character_generation/1/model.py (100%) rename examples/{ => frontend_language}/usage/triton/models/character_generation/config.pbtxt (100%) delete mode 100644 examples/quick_start/srt_example_yi_vl.py rename examples/{usage/async_io.py => runtime/async_io_api.py} (100%) rename examples/{usage/llava => runtime/llava_onevision}/http_llama3_llava_test.py (94%) rename examples/{usage/llava => runtime/llava_onevision}/http_llava_onevision_test.py (96%) rename examples/{usage/llava => runtime/llava_onevision}/http_qwen_llava_test.py (95%) rename examples/{usage => runtime}/openai_batch_chat.py (100%) rename examples/{usage => runtime}/openai_batch_complete.py (100%) delete mode 100644 examples/usage/llava/srt_llava_next_test.py delete mode 100644 examples/usage/rag_using_parea/max-tokens-fixed-rag-trace.png delete mode 100644 python/sglang/launch_server_llavavid.py rename scripts/{ => deprecated}/convert_yi_vl.py (100%) rename scripts/{ => deprecated}/convert_yi_vl.sh (100%) diff --git a/README.md b/README.md index c118d6a1a..04dd913ba 100644 --- a/README.md +++ b/README.md @@ -22,12 +22,13 @@ The core features include: ## News - [2024/07] 🔥 Faster Llama3 Serving with SGLang Runtime (vs. TensorRT-LLM, vLLM) ([blog](https://lmsys.org/blog/2024-07-25-sglang-llama3/)). -- [2024/04] SGLang is used by the official **LLaVA-NeXT (video)** release ([blog](https://llava-vl.github.io/blog/2024-04-30-llava-next-video/)). +- [2024/08] 🔥 LLaVA-OneVision with single-image, multi-image and video are supported ([blog](https://llava-vl.github.io/blog/2024-08-05-llava-onevision/)). - [2024/02] SGLang enables **3x faster JSON decoding** with compressed finite state machine ([blog](https://lmsys.org/blog/2024-02-05-compressed-fsm/)).
More +- [2024/04] SGLang is used by the official **LLaVA-NeXT (video)** release ([blog](https://llava-vl.github.io/blog/2024-04-30-llava-next-video/)). - [2024/01] SGLang provides up to **5x faster inference** with RadixAttention ([blog](https://lmsys.org/blog/2024-01-17-sglang/)). - [2024/01] SGLang powers the serving of the official **LLaVA v1.6** release demo ([usage](https://github.com/haotian-liu/LLaVA?tab=readme-ov-file#demo)). @@ -227,19 +228,14 @@ python -m sglang.launch_server --model-path meta-llama/Meta-Llama-3-8B-Instruct - Gemma / Gemma 2 - Qwen / Qwen 2 / Qwen 2 MoE - DeepSeek / DeepSeek 2 -- LLaVA 1.5 / 1.6 - - `python -m sglang.launch_server --model-path liuhaotian/llava-v1.5-7b --tokenizer-path llava-hf/llava-1.5-7b-hf --chat-template vicuna_v1.1 --port 30000` - - `python -m sglang.launch_server --model-path liuhaotian/llava-v1.6-vicuna-7b --tokenizer-path llava-hf/llava-1.5-7b-hf --chat-template vicuna_v1.1 --port 30000` - - `python -m sglang.launch_server --model-path liuhaotian/llava-v1.6-34b --tokenizer-path liuhaotian/llava-v1.6-34b-tokenizer --port 30000` - - `python -m sglang.launch_server --model-path lmms-lab/llama3-llava-next-8b --port=30000 --host=127.0.0.1 --tp-size=1 --chat-template=llava_llama_3` - - `python -m sglang.launch_server --model-path lmms-lab/llava-next-72b --port=30000 --host="127.0.0.1" --tp-size=8 --chat-template=chatml-llava` -- LLaVA-NeXT-Video - - see [examples/usage/llava_video](examples/usage/llava_video) -- [LLaVA-OneVision](https://arxiv.org/abs/2408.03326) - - `python3 -m sglang.launch_server --model-path lmms-lab/llava-onevision-qwen2-72b-ov --port=30000 --host=127.0.0.1 --tp-size=8 --chat-template=chatml-llava --chunked-prefill-size=16384` - - see [test/srt/test_llava_onevision_openai_server.py](test/srt/test_llava_onevision_openai_server.py) +- [LLaVA-OneVision](https://llava-vl.github.io/blog/2024-08-05-llava-onevision/) + - `python3 -m sglang.launch_server --model-path lmms-lab/llava-onevision-qwen2-72b-ov --port=30000 --tp-size=8 --chat-template=chatml-llava --chunked-prefill-size=16384` + - Query the server with the [OpenAI Vision API](https://platform.openai.com/docs/guides/vision). See examples at [test/srt/test_vision_openai_server.py](test/srt/test_vision_openai_server.py) +- LLaVA 1.5 / 1.6 / NeXT + - `python -m sglang.launch_server --model-path lmms-lab/llama3-llava-next-8b --port=30000 --tp-size=1 --chat-template=llava_llama_3` + - `python -m sglang.launch_server --model-path lmms-lab/llava-next-72b --port=30000 --tp-size=8 --chat-template=chatml-llava` + - Query the server with the [OpenAI Vision API](https://platform.openai.com/docs/guides/vision). See examples at [test/srt/test_vision_openai_server.py](test/srt/test_vision_openai_server.py) - Yi-VL - - see [srt_example_yi_vl.py](examples/quick_start/srt_example_yi_vl.py). - StableLM - Command-R - DBRX @@ -250,6 +246,8 @@ python -m sglang.launch_server --model-path meta-llama/Meta-Llama-3-8B-Instruct Instructions for supporting a new model are [here](https://github.com/sgl-project/sglang/blob/main/docs/en/model_support.md). #### Use Models From ModelScope +
+ To use model from [ModelScope](https://www.modelscope.cn), setting environment variable SGLANG_USE_MODELSCOPE. ``` export SGLANG_USE_MODELSCOPE=true @@ -258,21 +256,20 @@ Launch [Qwen2-7B-Instruct](https://www.modelscope.cn/models/qwen/qwen2-7b-instru ``` SGLANG_USE_MODELSCOPE=true python -m sglang.launch_server --model-path qwen/Qwen2-7B-Instruct --port 30000 ``` +
#### Run Llama 3.1 405B ```bash -## Run 405B (fp8) on a single node +# Run 405B (fp8) on a single node python -m sglang.launch_server --model-path meta-llama/Meta-Llama-3.1-405B-Instruct-FP8 --tp 8 -## Run 405B (fp16) on two nodes -# replace the `172.16.4.52:20000` with your own first node ip address and port, disable CUDA Graph temporarily +# Run 405B (fp16) on two nodes +## on the first node, replace the `172.16.4.52:20000` with your own first node ip address and port +GLOO_SOCKET_IFNAME=eth0 python3 -m sglang.launch_server --model-path meta-llama/Meta-Llama-3.1-405B-Instruct --tp 16 --nccl-init-addr 172.16.4.52:20000 --nnodes 2 --node-rank 0 --disable-cuda-graph -# on the first node -GLOO_SOCKET_IFNAME=eth0 python3 -m sglang.launch_server --model-path meta-llama/Meta-Llama-3.1-405B-Instruct --tp 16 --nccl-init-addr 172.16.4.52:20000 --nnodes 2 --node-rank 0 --disable-cuda-graph --mem-frac 0.75 - -# on the second -GLOO_SOCKET_IFNAME=eth0 python3 -m sglang.launch_server --model-path meta-llama/Meta-Llama-3.1-405B-Instruct --tp 16 --nccl-init-addr 172.16.4.52:20000 --nnodes 2 --node-rank 1 --disable-cuda-graph --mem-frac 0.75 +## on the first node, replace the `172.16.4.52:20000` with your own first node ip address and port +GLOO_SOCKET_IFNAME=eth0 python3 -m sglang.launch_server --model-path meta-llama/Meta-Llama-3.1-405B-Instruct --tp 16 --nccl-init-addr 172.16.4.52:20000 --nnodes 2 --node-rank 1 --disable-cuda-graph ``` ### Benchmark Performance diff --git a/docs/en/sampling_params.md b/docs/en/sampling_params.md index 7d866e692..54b03bf32 100644 --- a/docs/en/sampling_params.md +++ b/docs/en/sampling_params.md @@ -1,5 +1,8 @@ # Sampling Parameters in SGLang Runtime This doc describes the sampling parameters of the SGLang Runtime. +It is the low-level endpoint of the runtime. +If you want a high-level endpoint that can automatically handle chat templates, consider using the [OpenAI Compatible API +](https://github.com/sgl-project/sglang?tab=readme-ov-file#openai-compatible-api). The `/generate` endpoint accepts the following arguments in the JSON format. @@ -140,7 +143,7 @@ print("") Launch a server ``` -python3 -m sglang.launch_server --model-path liuhaotian/llava-v1.6-vicuna-7b --tokenizer-path llava-hf/llava-1.5-7b-hf --chat-template vicuna_v1.1 --port 30000 +python3 -m sglang.launch_server --model-path lmms-lab/llava-onevision-qwen2-7b-ov --chat-template chatml-llava ``` Download an image @@ -155,7 +158,9 @@ import requests response = requests.post( "http://localhost:30000/generate", json={ - "text": "A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions. USER: \nDescribe this picture ASSISTANT:", + "text": "<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n" + "<|im_start|>user\n\nDescribe this image in a very short sentence.<|im_end|>\n" + "<|im_start|>assistant\n", "image_data": "example_image.png", "sampling_params": { "temperature": 0, diff --git a/examples/quick_start/anthropic_example_chat.py b/examples/frontend_language/quick_start/anthropic_example_chat.py similarity index 100% rename from examples/quick_start/anthropic_example_chat.py rename to examples/frontend_language/quick_start/anthropic_example_chat.py diff --git a/examples/quick_start/anthropic_example_complete.py b/examples/frontend_language/quick_start/anthropic_example_complete.py similarity index 100% rename from examples/quick_start/anthropic_example_complete.py rename to examples/frontend_language/quick_start/anthropic_example_complete.py diff --git a/examples/quick_start/azure_openai_example_chat.py b/examples/frontend_language/quick_start/azure_openai_example_chat.py similarity index 100% rename from examples/quick_start/azure_openai_example_chat.py rename to examples/frontend_language/quick_start/azure_openai_example_chat.py diff --git a/examples/quick_start/gemini_example_chat.py b/examples/frontend_language/quick_start/gemini_example_chat.py similarity index 100% rename from examples/quick_start/gemini_example_chat.py rename to examples/frontend_language/quick_start/gemini_example_chat.py diff --git a/examples/quick_start/gemini_example_complete.py b/examples/frontend_language/quick_start/gemini_example_complete.py similarity index 100% rename from examples/quick_start/gemini_example_complete.py rename to examples/frontend_language/quick_start/gemini_example_complete.py diff --git a/examples/quick_start/gemini_example_multimodal_chat.py b/examples/frontend_language/quick_start/gemini_example_multimodal_chat.py similarity index 100% rename from examples/quick_start/gemini_example_multimodal_chat.py rename to examples/frontend_language/quick_start/gemini_example_multimodal_chat.py diff --git a/examples/quick_start/images/cat.jpeg b/examples/frontend_language/quick_start/images/cat.jpeg similarity index 100% rename from examples/quick_start/images/cat.jpeg rename to examples/frontend_language/quick_start/images/cat.jpeg diff --git a/examples/quick_start/images/dog.jpeg b/examples/frontend_language/quick_start/images/dog.jpeg similarity index 100% rename from examples/quick_start/images/dog.jpeg rename to examples/frontend_language/quick_start/images/dog.jpeg diff --git a/examples/quick_start/srt_example_chat.py b/examples/frontend_language/quick_start/local_example_chat.py similarity index 98% rename from examples/quick_start/srt_example_chat.py rename to examples/frontend_language/quick_start/local_example_chat.py index b1e1658a2..e1e4b62cc 100644 --- a/examples/quick_start/srt_example_chat.py +++ b/examples/frontend_language/quick_start/local_example_chat.py @@ -1,6 +1,6 @@ """ Usage: -python3 srt_example_chat.py +python3 local_example_chat.py """ import sglang as sgl diff --git a/examples/quick_start/srt_example_complete.py b/examples/frontend_language/quick_start/local_example_complete.py similarity index 97% rename from examples/quick_start/srt_example_complete.py rename to examples/frontend_language/quick_start/local_example_complete.py index 056245979..00a451cf6 100644 --- a/examples/quick_start/srt_example_complete.py +++ b/examples/frontend_language/quick_start/local_example_complete.py @@ -1,6 +1,6 @@ """ Usage: -python3 srt_example_complete.py +python3 local_example_complete.py """ import sglang as sgl diff --git a/examples/quick_start/srt_example_llava.py b/examples/frontend_language/quick_start/local_example_llava_next.py similarity index 69% rename from examples/quick_start/srt_example_llava.py rename to examples/frontend_language/quick_start/local_example_llava_next.py index 5d8f75239..823dc7b0e 100644 --- a/examples/quick_start/srt_example_llava.py +++ b/examples/frontend_language/quick_start/local_example_llava_next.py @@ -1,8 +1,14 @@ """ -Usage: python3 srt_example_llava.py +Usage: python3 local_example_llava_next.py """ +from PIL import ImageFile + import sglang as sgl +from sglang.lang.chat_template import get_chat_template +from sglang.srt.utils import load_image + +ImageFile.LOAD_TRUNCATED_IMAGES = True # Allow loading of truncated images @sgl.function @@ -44,10 +50,17 @@ def batch(): if __name__ == "__main__": - runtime = sgl.Runtime( - model_path="liuhaotian/llava-v1.6-vicuna-7b", - tokenizer_path="llava-hf/llava-1.5-7b-hf", - ) + import multiprocessing as mp + + mp.set_start_method("spawn", force=True) + + runtime = sgl.Runtime(model_path="lmms-lab/llama3-llava-next-8b") + runtime.endpoint.chat_template = get_chat_template("llama-3-instruct") + + # Or you can use the 72B model + # runtime = sgl.Runtime(model_path="lmms-lab/llava-next-72b", tp_size=8) + # runtime.endpoint.chat_template = get_chat_template("chatml-llava") + sgl.set_default_backend(runtime) print(f"chat template: {runtime.endpoint.chat_template.name}") diff --git a/examples/quick_start/openai_example_chat.py b/examples/frontend_language/quick_start/openai_example_chat.py similarity index 100% rename from examples/quick_start/openai_example_chat.py rename to examples/frontend_language/quick_start/openai_example_chat.py diff --git a/examples/quick_start/openai_example_complete.py b/examples/frontend_language/quick_start/openai_example_complete.py similarity index 100% rename from examples/quick_start/openai_example_complete.py rename to examples/frontend_language/quick_start/openai_example_complete.py diff --git a/examples/quick_start/openrouter_example_chat.py b/examples/frontend_language/quick_start/openrouter_example_chat.py similarity index 100% rename from examples/quick_start/openrouter_example_chat.py rename to examples/frontend_language/quick_start/openrouter_example_chat.py diff --git a/examples/quick_start/together_example_chat.py b/examples/frontend_language/quick_start/together_example_chat.py similarity index 100% rename from examples/quick_start/together_example_chat.py rename to examples/frontend_language/quick_start/together_example_chat.py diff --git a/examples/quick_start/together_example_complete.py b/examples/frontend_language/quick_start/together_example_complete.py similarity index 100% rename from examples/quick_start/together_example_complete.py rename to examples/frontend_language/quick_start/together_example_complete.py diff --git a/examples/usage/chinese_regex.py b/examples/frontend_language/usage/chinese_regex.py similarity index 100% rename from examples/usage/chinese_regex.py rename to examples/frontend_language/usage/chinese_regex.py diff --git a/examples/usage/choices_logprob.py b/examples/frontend_language/usage/choices_logprob.py similarity index 100% rename from examples/usage/choices_logprob.py rename to examples/frontend_language/usage/choices_logprob.py diff --git a/examples/usage/cot_decoding.py b/examples/frontend_language/usage/cot_decoding.py similarity index 100% rename from examples/usage/cot_decoding.py rename to examples/frontend_language/usage/cot_decoding.py diff --git a/examples/usage/json_decode.py b/examples/frontend_language/usage/json_decode.py similarity index 100% rename from examples/usage/json_decode.py rename to examples/frontend_language/usage/json_decode.py diff --git a/examples/usage/json_logprobs.py b/examples/frontend_language/usage/json_logprobs.py similarity index 100% rename from examples/usage/json_logprobs.py rename to examples/frontend_language/usage/json_logprobs.py diff --git a/examples/usage/llava_video/srt_example_llava_v.py b/examples/frontend_language/usage/llava_video/srt_example_llava_v.py similarity index 99% rename from examples/usage/llava_video/srt_example_llava_v.py rename to examples/frontend_language/usage/llava_video/srt_example_llava_v.py index 7421dfcdf..085bcea5a 100644 --- a/examples/usage/llava_video/srt_example_llava_v.py +++ b/examples/frontend_language/usage/llava_video/srt_example_llava_v.py @@ -1,7 +1,8 @@ """ Usage: pip install opencv-python-headless -python3 srt_example_llava.py + +python3 srt_example_llava_v.py """ import argparse @@ -9,6 +10,8 @@ import csv import os import time +import requests + import sglang as sgl diff --git a/examples/usage/llava_video/srt_example_llava_v.sh b/examples/frontend_language/usage/llava_video/srt_example_llava_v.sh similarity index 100% rename from examples/usage/llava_video/srt_example_llava_v.sh rename to examples/frontend_language/usage/llava_video/srt_example_llava_v.sh diff --git a/examples/usage/openai_chat_speculative.py b/examples/frontend_language/usage/openai_chat_speculative.py similarity index 100% rename from examples/usage/openai_chat_speculative.py rename to examples/frontend_language/usage/openai_chat_speculative.py diff --git a/examples/usage/openai_parallel_sample.py b/examples/frontend_language/usage/openai_parallel_sample.py similarity index 100% rename from examples/usage/openai_parallel_sample.py rename to examples/frontend_language/usage/openai_parallel_sample.py diff --git a/examples/usage/openai_speculative.py b/examples/frontend_language/usage/openai_speculative.py similarity index 100% rename from examples/usage/openai_speculative.py rename to examples/frontend_language/usage/openai_speculative.py diff --git a/examples/usage/parallel_sample.py b/examples/frontend_language/usage/parallel_sample.py similarity index 100% rename from examples/usage/parallel_sample.py rename to examples/frontend_language/usage/parallel_sample.py diff --git a/examples/usage/rag_using_parea/trace_and_evaluate_rag_using_parea.ipynb b/examples/frontend_language/usage/rag_using_parea/trace_and_evaluate_rag_using_parea.ipynb similarity index 100% rename from examples/usage/rag_using_parea/trace_and_evaluate_rag_using_parea.ipynb rename to examples/frontend_language/usage/rag_using_parea/trace_and_evaluate_rag_using_parea.ipynb diff --git a/examples/usage/readme_examples.py b/examples/frontend_language/usage/readme_examples.py similarity index 100% rename from examples/usage/readme_examples.py rename to examples/frontend_language/usage/readme_examples.py diff --git a/examples/usage/streaming.py b/examples/frontend_language/usage/streaming.py similarity index 100% rename from examples/usage/streaming.py rename to examples/frontend_language/usage/streaming.py diff --git a/examples/usage/triton/Dockerfile b/examples/frontend_language/usage/triton/Dockerfile similarity index 100% rename from examples/usage/triton/Dockerfile rename to examples/frontend_language/usage/triton/Dockerfile diff --git a/examples/usage/triton/README.md b/examples/frontend_language/usage/triton/README.md similarity index 100% rename from examples/usage/triton/README.md rename to examples/frontend_language/usage/triton/README.md diff --git a/examples/usage/triton/models/character_generation/1/model.py b/examples/frontend_language/usage/triton/models/character_generation/1/model.py similarity index 100% rename from examples/usage/triton/models/character_generation/1/model.py rename to examples/frontend_language/usage/triton/models/character_generation/1/model.py diff --git a/examples/usage/triton/models/character_generation/config.pbtxt b/examples/frontend_language/usage/triton/models/character_generation/config.pbtxt similarity index 100% rename from examples/usage/triton/models/character_generation/config.pbtxt rename to examples/frontend_language/usage/triton/models/character_generation/config.pbtxt diff --git a/examples/quick_start/srt_example_yi_vl.py b/examples/quick_start/srt_example_yi_vl.py deleted file mode 100644 index 66c7d5712..000000000 --- a/examples/quick_start/srt_example_yi_vl.py +++ /dev/null @@ -1,70 +0,0 @@ -""" -Usage: python3 srt_example_yi_vl.py - -Requirements: transformers==4.38 -""" - -import sglang as sgl - - -@sgl.function -def image_qa(s, image_path, question): - s += sgl.user(sgl.image(image_path) + question) - s += sgl.assistant(sgl.gen("answer")) - - -def single(): - state = image_qa.run( - image_path="images/cat.jpeg", - question="What is this?", - max_new_tokens=64, - stop="###", - ) - print(state["answer"], "\n") - - -def stream(): - state = image_qa.run( - image_path="images/cat.jpeg", - question="What is this?", - max_new_tokens=64, - stream=True, - stop="###", - ) - - for out in state.text_iter("answer"): - print(out, end="", flush=True) - print() - - -def batch(): - states = image_qa.run_batch( - [ - {"image_path": "images/cat.jpeg", "question": "What is this?"}, - {"image_path": "images/dog.jpeg", "question": "What is this?"}, - ], - max_new_tokens=64, - stop="###", - ) - for s in states: - print(s["answer"], "\n") - - -if __name__ == "__main__": - runtime = sgl.Runtime(model_path="BabyChou/Yi-VL-6B") - # runtime = sgl.Runtime(model_path="BabyChou/Yi-VL-34B") - sgl.set_default_backend(runtime) - - # Run a single request - print("\n========== single ==========\n") - single() - - # Stream output - print("\n========== stream ==========\n") - stream() - - # Run a batch of requests - print("\n========== batch ==========\n") - batch() - - runtime.shutdown() diff --git a/examples/usage/async_io.py b/examples/runtime/async_io_api.py similarity index 100% rename from examples/usage/async_io.py rename to examples/runtime/async_io_api.py diff --git a/examples/usage/llava/http_llama3_llava_test.py b/examples/runtime/llava_onevision/http_llama3_llava_test.py similarity index 94% rename from examples/usage/llava/http_llama3_llava_test.py rename to examples/runtime/llava_onevision/http_llama3_llava_test.py index 813a26af5..a019e214d 100644 --- a/examples/usage/llava/http_llama3_llava_test.py +++ b/examples/runtime/llava_onevision/http_llama3_llava_test.py @@ -4,7 +4,7 @@ Usage: # Installing latest sglang. # Endpoint Service CLI: -# python -m sglang.launch_server --model-path lmms-lab/llama3-llava-next-8b --tokenizer-path lmms-lab/llama3-llava-next-8b-tokenizer --port=30000 --host="127.0.0.1" --tp-size=4 +python -m sglang.launch_server --model-path lmms-lab/llama3-llava-next-8b --port=30000 python3 http_llama3_llava_test.py @@ -16,7 +16,6 @@ import argparse import asyncio import copy import json -import time import aiohttp import requests diff --git a/examples/usage/llava/http_llava_onevision_test.py b/examples/runtime/llava_onevision/http_llava_onevision_test.py similarity index 96% rename from examples/usage/llava/http_llava_onevision_test.py rename to examples/runtime/llava_onevision/http_llava_onevision_test.py index c32d52981..40dc27ec2 100644 --- a/examples/usage/llava/http_llava_onevision_test.py +++ b/examples/runtime/llava_onevision/http_llava_onevision_test.py @@ -1,3 +1,11 @@ +""" +Usage: + +python3 -m sglang.launch_server --model-path lmms-lab/llava-onevision-qwen2-72b-ov --port=30000 --tp-size=8 --chat-template=chatml-llava --chunked-prefill-size=16384 + +python3 http_llava_onevision_test.py +""" + import base64 import io import os @@ -74,7 +82,6 @@ def video_stream_request_test(client, video_path): print("------------------------Video Stream Request Test----------------------") messages = prepare_video_messages(video_path) - start_time = time.time() video_request = client.chat.completions.create( model="default", messages=messages, diff --git a/examples/usage/llava/http_qwen_llava_test.py b/examples/runtime/llava_onevision/http_qwen_llava_test.py similarity index 95% rename from examples/usage/llava/http_qwen_llava_test.py rename to examples/runtime/llava_onevision/http_qwen_llava_test.py index 1c29658c6..dca56e7a3 100644 --- a/examples/usage/llava/http_qwen_llava_test.py +++ b/examples/runtime/llava_onevision/http_qwen_llava_test.py @@ -4,7 +4,7 @@ Usage: # Installing latest sglang. # Endpoint Service CLI: -# python -m sglang.launch_server --model-path lmms-lab/llava-next-72b --tokenizer-path lmms-lab/llavanext-qwen-tokenizer --port=30000 --host="127.0.0.1" --tp-size=4 +python -m sglang.launch_server --model-path lmms-lab/llava-next-72b --port=30000 --tp-size=8 python3 http_qwen_llava_test.py @@ -16,7 +16,6 @@ import argparse import asyncio import copy import json -import time import aiohttp import requests diff --git a/examples/usage/openai_batch_chat.py b/examples/runtime/openai_batch_chat.py similarity index 100% rename from examples/usage/openai_batch_chat.py rename to examples/runtime/openai_batch_chat.py diff --git a/examples/usage/openai_batch_complete.py b/examples/runtime/openai_batch_complete.py similarity index 100% rename from examples/usage/openai_batch_complete.py rename to examples/runtime/openai_batch_complete.py diff --git a/examples/usage/llava/srt_llava_next_test.py b/examples/usage/llava/srt_llava_next_test.py deleted file mode 100644 index 0f9621648..000000000 --- a/examples/usage/llava/srt_llava_next_test.py +++ /dev/null @@ -1,90 +0,0 @@ -""" -Usage: python3 srt_example_llava.py -""" - -from PIL import ImageFile - -import sglang as sgl -from sglang.lang.chat_template import get_chat_template -from sglang.srt.utils import load_image - -ImageFile.LOAD_TRUNCATED_IMAGES = True # Allow loading of truncated images - - -@sgl.function -def image_qa(s, image, question): - s += sgl.user(sgl.image(image) + question) - s += sgl.assistant(sgl.gen("answer")) - - -def single(): - image_url = "https://farm4.staticflickr.com/3175/2653711032_804ff86d81_z.jpg" - pil_image, _ = load_image(image_url) - state = image_qa.run(image=pil_image, question="What is this?", max_new_tokens=512) - print(state["answer"], "\n") - - -def stream(): - image_url = "https://farm4.staticflickr.com/3175/2653711032_804ff86d81_z.jpg" - pil_image, _ = load_image(image_url) - state = image_qa.run( - image=pil_image, - question="Please generate short caption for this image.", - max_new_tokens=512, - temperature=0, - stream=True, - ) - - for out in state.text_iter("answer"): - print(out, end="", flush=True) - print() - - -def batch(): - image_url = "https://farm4.staticflickr.com/3175/2653711032_804ff86d81_z.jpg" - pil_image, _ = load_image(image_url) - states = image_qa.run_batch( - [ - {"image": pil_image, "question": "What is this?"}, - {"image": pil_image, "question": "What is this?"}, - ], - max_new_tokens=512, - ) - for s in states: - print(s["answer"], "\n") - - -if __name__ == "__main__": - import multiprocessing as mp - - mp.set_start_method("spawn", force=True) - runtime = sgl.Runtime( - model_path="lmms-lab/llama3-llava-next-8b", - tokenizer_path="lmms-lab/llama3-llava-next-8b-tokenizer", - ) - runtime.endpoint.chat_template = get_chat_template("llama-3-instruct") - # runtime = sgl.Runtime( - # model_path="lmms-lab/llava-next-72b", - # tokenizer_path="lmms-lab/llavanext-qwen-tokenizer", - # ) - # runtime.endpoint.chat_template = get_chat_template("chatml-llava") - sgl.set_default_backend(runtime) - print(f"chat template: {runtime.endpoint.chat_template.name}") - - # Or you can use API models - # sgl.set_default_backend(sgl.OpenAI("gpt-4-vision-preview")) - # sgl.set_default_backend(sgl.VertexAI("gemini-pro-vision")) - - # Run a single request - print("\n========== single ==========\n") - single() - - # Stream output - print("\n========== stream ==========\n") - stream() - - # Run a batch of requests - print("\n========== batch ==========\n") - batch() - - runtime.shutdown() diff --git a/examples/usage/rag_using_parea/max-tokens-fixed-rag-trace.png b/examples/usage/rag_using_parea/max-tokens-fixed-rag-trace.png deleted file mode 100644 index 2ea09fdc60209c707655451a589f2a904b6eb25b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134888 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 1 ) self.tp_group = get_tp_group() + # Currently, there is a bug with mulit-node tensor parallelsim + padded cuda graph, + # so we disable padding in cuda graph. + if not all(in_the_same_node_as(self.tp_group.cpu_group, source_rank=0)): + self.server_args.disable_cuda_graph_padding = True + logger.info( + "Setting disable_cuda_graph_padding to True because of multi-node tensor parallelism." + ) + + # Check memory for tensor parallelism if self.tp_size > 1: - total_local_gpu_memory = get_available_gpu_memory(self.gpu_id) - if total_local_gpu_memory < total_gpu_memory * 0.9: + local_gpu_memory = get_available_gpu_memory(self.gpu_id) + if min_per_gpu_memory < local_gpu_memory * 0.9: raise ValueError( "The memory capacity is unbalanced. Some GPUs may be occupied by other processes." ) - # Load the model and create memory pool - self.load_model() - self.init_memory_pool( - total_gpu_memory, - server_args.max_num_reqs, - server_args.max_total_tokens, - ) - self.init_cublas() - self.init_flashinfer() - - if self.is_generation: - # FIXME Currently, cuda graph only capture decode steps, which only exists in causal models - # Capture cuda graphs - self.init_cuda_graphs() + return min_per_gpu_memory def load_model(self): logger.info( @@ -150,7 +157,7 @@ class ModelRunner: ) if torch.cuda.get_device_capability()[0] < 8: logger.info( - "Compute capability below sm80 use float16 due to lack of bfloat16 support." + "Compute capability below sm80. Use float16 due to lack of bfloat16 support." ) self.server_args.dtype = "float16" @@ -168,8 +175,9 @@ class ModelRunner: skip_tokenizer_init=True, ) + # A temporary hack to fix the num_heads for meta-llama/Meta-Llama-3.1-405B-FP8 checkpoints + # Drop this after Sept, 2024. if is_llama3_405b_fp8_head_16(self.model_config) and self.tp_size <= 8: - # A temporary hack to fix the num_heads for meta-llama/Meta-Llama-3.1-405B-FP8 checkpoints self.model_config.hf_config.num_key_value_heads = 8 self.vllm_model_config.hf_config.num_key_value_heads = 8 monkey_patch_vllm_qvk_linear_loader() @@ -191,8 +199,8 @@ class ModelRunner: cache_config=None, ) self.sliding_window_size = ( - self.model.get_window_size() - if hasattr(self.model, "get_window_size") + self.model.get_attention_sliding_window_size() + if hasattr(self.model, "get_attention_sliding_window_size") else None ) self.is_generation = is_generation_model( @@ -206,7 +214,8 @@ class ModelRunner: f"avail mem={get_available_gpu_memory(self.gpu_id):.2f} GB" ) - def update_weights(self, model_path, load_format): + def update_weights(self, model_path: str, load_format: str): + """Update weights in-place.""" from vllm.model_executor.model_loader.loader import ( DefaultModelLoader, device_loading_context, @@ -222,6 +231,7 @@ class ModelRunner: target_device = torch.device(self.device_config.device) try: + # TODO: Use a better method to check this vllm_model_config = VllmModelConfig( model=model_path, quantization=self.server_args.quantization, @@ -291,7 +301,7 @@ class ModelRunner: logger.info(f"[gpu={self.gpu_id}] Update weights end.") return True, "Succeeded to update model weights" - def profile_max_num_token(self, total_gpu_memory): + def profile_max_num_token(self, total_gpu_memory: int): available_gpu_memory = get_available_gpu_memory( self.gpu_id, distributed=self.tp_size > 1 ) @@ -319,7 +329,10 @@ class ModelRunner: return max_num_token def init_memory_pool( - self, total_gpu_memory, max_num_reqs=None, max_total_tokens=None + self, + total_gpu_memory: int, + max_num_reqs: int = None, + max_total_tokens: int = None, ): self.max_total_num_tokens = self.profile_max_num_token(total_gpu_memory) if max_total_tokens is not None: @@ -388,6 +401,7 @@ class ModelRunner: return c def init_flashinfer(self): + """Init flashinfer attention kernel wrappers.""" if self.server_args.disable_flashinfer: assert ( self.sliding_window_size is None @@ -448,6 +462,11 @@ class ModelRunner: ) def init_cuda_graphs(self): + """Capture cuda graphs.""" + if not self.is_generation: + # TODO: Currently, cuda graph only captures decode steps, which only exists for generation models + return + from sglang.srt.model_executor.cuda_graph_runner import CudaGraphRunner if self.server_args.disable_cuda_graph or self.server_args.disable_flashinfer: @@ -457,7 +476,12 @@ class ModelRunner: logger.info( f"[gpu={self.gpu_id}] Capture cuda graph begin. This can take up to several minutes." ) - batch_size_list = [1, 2, 4] + [i * 8 for i in range(1, 17)] + + if self.server_args.disable_cuda_graph_padding: + batch_size_list = list(range(1, 32)) + [64, 128] + else: + batch_size_list = [1, 2, 4] + [i * 8 for i in range(1, 21)] + self.cuda_graph_runner = CudaGraphRunner( self, max_batch_size_to_capture=max(batch_size_list), diff --git a/python/sglang/srt/models/gemma2.py b/python/sglang/srt/models/gemma2.py index 37d926c34..c6dbc7e55 100644 --- a/python/sglang/srt/models/gemma2.py +++ b/python/sglang/srt/models/gemma2.py @@ -46,7 +46,7 @@ from sglang.srt.model_executor.forward_batch_info import InputMetadata # Aligned with HF's implementation, using sliding window inclusive with the last token # SGLang assumes exclusive -def get_window_size(config): +def get_attention_sliding_window_size(config): return config.sliding_window - 1 @@ -213,7 +213,11 @@ class Gemma2Attention(nn.Module): self.scaling, num_kv_heads=self.num_kv_heads, layer_id=layer_idx, - sliding_window_size=get_window_size(config) if use_sliding_window else None, + sliding_window_size=( + get_attention_sliding_window_size(config) + if use_sliding_window + else None + ), logit_cap=self.config.attn_logit_softcapping, ) @@ -406,8 +410,8 @@ class Gemma2ForCausalLM(nn.Module): input_ids, hidden_states, self.model.embed_tokens.weight, input_metadata ) - def get_window_size(self): - return get_window_size(self.config) + def get_attention_sliding_window_size(self): + return get_attention_sliding_window_size(self.config) def load_weights(self, weights: Iterable[Tuple[str, torch.Tensor]]): stacked_params_mapping = [ diff --git a/python/sglang/srt/models/grok.py b/python/sglang/srt/models/grok.py index 75b086fd6..4a0a08bf8 100644 --- a/python/sglang/srt/models/grok.py +++ b/python/sglang/srt/models/grok.py @@ -295,12 +295,14 @@ class Grok1ModelForCausalLM(nn.Module): self.config = config self.quant_config = quant_config self.model = Grok1Model(config, quant_config=quant_config) - # self.lm_head = ParallelLMHead(config.vocab_size, config.hidden_size) - self.lm_head = ReplicatedLinear(config.hidden_size, config.vocab_size) - self.logits_processor = LogitsProcessor(config, skip_all_gather=True) + self.lm_head = ParallelLMHead(config.vocab_size, config.hidden_size) + self.logits_processor = LogitsProcessor(config) # Monkey patch _prepare_weights to load pre-sharded weights setattr(DefaultModelLoader, "_prepare_weights", _prepare_presharded_weights) + + self.use_presharded_weights = True + warnings.filterwarnings("ignore", category=FutureWarning) def forward( @@ -356,6 +358,13 @@ class Grok1ModelForCausalLM(nn.Module): continue name = name.replace(weight_name, param_name) + if self.use_presharded_weights: + extra_kwargs = { + "use_presharded_weights": self.use_presharded_weights + } + else: + extra_kwargs = {} + param = params_dict[name] weight_loader = param.weight_loader weight_loader( @@ -364,7 +373,7 @@ class Grok1ModelForCausalLM(nn.Module): weight_name, shard_id=shard_id, expert_id=expert_id, - pre_sharded=get_tensor_model_parallel_world_size() > 1, + **extra_kwargs, ) break else: diff --git a/python/sglang/srt/server_args.py b/python/sglang/srt/server_args.py index 33451d645..870169c6d 100644 --- a/python/sglang/srt/server_args.py +++ b/python/sglang/srt/server_args.py @@ -81,13 +81,12 @@ class ServerArgs: disable_cuda_graph: bool = False disable_cuda_graph_padding: bool = False disable_disk_cache: bool = False + disable_custom_all_reduce: bool = False enable_mixed_chunk: bool = False enable_torch_compile: bool = False enable_p2p_check: bool = False enable_mla: bool = False - attention_reduce_in_fp32: bool = False - efficient_weight_load: bool = False - disable_custom_all_reduce: bool = False + triton_attention_reduce_in_fp32: bool = False # Distributed args nccl_init_addr: Optional[str] = None @@ -404,6 +403,12 @@ class ServerArgs: action="store_true", help="Disable disk cache to avoid possible crashes related to file system or high concurrency.", ) + parser.add_argument( + "--disable-custom-all-reduce", + action="store_true", + default=False, + help="Disable the custom all-reduce kernel and fall back to NCCL.", + ) parser.add_argument( "--enable-mixed-chunk", action="store_true", @@ -425,7 +430,7 @@ class ServerArgs: help="Enable Multi-head Latent Attention (MLA) for DeepSeek-V2.", ) parser.add_argument( - "--attention-reduce-in-fp32", + "--triton-attention-reduce-in-fp32", action="store_true", help="Cast the intermidiate attention results to fp32 to avoid possible crashes related to fp16." "This only affects Triton attention kernels.", @@ -435,12 +440,6 @@ class ServerArgs: action="store_true", help="Turn on memory efficient weight loading with quantization (quantize per layer during loading).", ) - parser.add_argument( - "--disable-custom-all-reduce", - action="store_true", - default=False, - help="Disable the custom all-reduce kernel and fall back to NCCL.", - ) @classmethod def from_cli_args(cls, args: argparse.Namespace): diff --git a/python/sglang/srt/utils.py b/python/sglang/srt/utils.py index a15ea1630..93c54782a 100644 --- a/python/sglang/srt/utils.py +++ b/python/sglang/srt/utils.py @@ -347,7 +347,7 @@ def suppress_other_loggers(): logging.WARN ) logging.getLogger("vllm.selector").setLevel(logging.WARN) - logging.getLogger("vllm.utils").setLevel(logging.WARN) + logging.getLogger("vllm.utils").setLevel(logging.ERROR) def assert_pkg_version(pkg: str, min_version: str, message: str): @@ -451,10 +451,6 @@ def monkey_patch_vllm_dummy_weight_loader(): quant_method = getattr(module, "quant_method", None) if quant_method is not None: quant_method.process_weights_after_loading(module) - # FIXME: Remove this after Mixtral is updated - # to use quant_method. - if hasattr(module, "process_weights_after_loading"): - module.process_weights_after_loading() # NOTE(woosuk): For accurate performance evaluation, we assign # random values to the weights. diff --git a/python/sglang/test/runners.py b/python/sglang/test/runners.py index 9386d7f7a..e519c9282 100644 --- a/python/sglang/test/runners.py +++ b/python/sglang/test/runners.py @@ -24,7 +24,6 @@ import torch.nn.functional as F from transformers import AutoModelForCausalLM, AutoTokenizer from sglang.srt.server import Runtime -from sglang.srt.utils import is_generation_model DEFAULT_PROMPTS = [ # the output of gemma-2-2b from SRT is unstable on the commented prompt @@ -63,8 +62,8 @@ class HFRunner: def __init__( self, model_path, - torch_dtype=torch.float16, - is_generation_model=None, + torch_dtype, + is_generation_model, ): self.in_queue = multiprocessing.Queue() self.out_queue = multiprocessing.Queue() @@ -90,11 +89,8 @@ class HFRunner: trust_remote_code=True, ) - self.is_generation_model = ( - is_generation_model(model_path) - if is_generation_model is None - else is_generation_model - ) + self.is_generation_model = is_generation_model + if self.is_generation_model: self.model = AutoModelForCausalLM.from_pretrained( model_path, @@ -176,16 +172,12 @@ class SRTRunner: def __init__( self, model_path, + torch_dtype, + is_generation_model, tp_size=1, - torch_dtype=torch.float16, - is_generation_model=None, port=5157, ): - self.is_generation_model = ( - is_generation_model(model_path) - if is_generation_model is None - else is_generation_model - ) + self.is_generation_model = is_generation_model self.runtime = Runtime( model_path=model_path, tp_size=tp_size, diff --git a/scripts/convert_yi_vl.py b/scripts/deprecated/convert_yi_vl.py similarity index 100% rename from scripts/convert_yi_vl.py rename to scripts/deprecated/convert_yi_vl.py diff --git a/scripts/convert_yi_vl.sh b/scripts/deprecated/convert_yi_vl.sh similarity index 100% rename from scripts/convert_yi_vl.sh rename to scripts/deprecated/convert_yi_vl.sh diff --git a/test/srt/models/test_embedding_models.py b/test/srt/models/test_embedding_models.py index 67e47d90d..44fed2ad0 100644 --- a/test/srt/models/test_embedding_models.py +++ b/test/srt/models/test_embedding_models.py @@ -59,7 +59,7 @@ class TestEmbeddingModels(unittest.TestCase): tolerance = 1e-2 assert torch.all( abs(similarities - 1) < tolerance - ), f"embeddings not all close" + ), "embeddings are not all close" def test_prefill_logits(self): for model, tp_size in MODELS: diff --git a/test/srt/models/test_generation_models.py b/test/srt/models/test_generation_models.py index bb56ebdad..ba64907ea 100644 --- a/test/srt/models/test_generation_models.py +++ b/test/srt/models/test_generation_models.py @@ -59,7 +59,7 @@ class TestGenerationModels(unittest.TestCase): tolerance = 3e-2 assert torch.all( abs(hf_logprobs - srt_logprobs) < tolerance - ), f"prefill logprobs not all close" + ), "prefill logprobs are not all close" print(hf_outputs.output_strs) print(srt_outputs.output_strs) diff --git a/test/srt/run_suite.py b/test/srt/run_suite.py index 4d3f7de30..8a887912a 100644 --- a/test/srt/run_suite.py +++ b/test/srt/run_suite.py @@ -14,7 +14,7 @@ suites = { "test_torch_compile.py", "test_triton_attn_backend.py", "test_vision_openai_server.py", - "test_large_max_new_tokens.py", + "test_update_weights.py", "models/test_generation_models.py", "models/test_embedding_models.py", "sampling/penaltylib", diff --git a/test/srt/test_vision_openai_server.py b/test/srt/test_vision_openai_server.py index 3e858dfa7..0a477a92a 100644 --- a/test/srt/test_vision_openai_server.py +++ b/test/srt/test_vision_openai_server.py @@ -2,8 +2,6 @@ import base64 import io import json import os -import sys -import time import unittest import numpy as np @@ -12,12 +10,10 @@ import requests from decord import VideoReader, cpu from PIL import Image -from sglang.srt.hf_transformers_utils import get_tokenizer from sglang.srt.utils import kill_child_process from sglang.test.test_utils import DEFAULT_URL_FOR_UNIT_TEST, popen_launch_server -# python3 -m sglang.launch_server --model-path lmms-lab/llava-onevision-qwen2-72b-ov --tokenizer-path lmms-lab/llavanext-qwen-siglip-tokenizer --port=30000 --host=127.0.0.1 --tp-size=8 --chat-template=chatml-llava --chunked-prefill-size=16384 class TestOpenAIVisionServer(unittest.TestCase): @classmethod def setUpClass(cls): @@ -32,11 +28,9 @@ class TestOpenAIVisionServer(unittest.TestCase): other_args=[ "--chat-template", "chatml-llava", - "--tokenizer-path", - "lmms-lab/llavanext-qwen-siglip-tokenizer", "--chunked-prefill-size", "16384", - "--log-requests", + # "--log-requests", ], ) cls.base_url += "/v1" @@ -132,7 +126,6 @@ class TestOpenAIVisionServer(unittest.TestCase): messages = self.prepare_video_messages(file_path) - start_time = time.time() video_request = client.chat.completions.create( model="default", messages=messages, @@ -140,15 +133,14 @@ class TestOpenAIVisionServer(unittest.TestCase): max_tokens=1024, stream=True, ) + print("-" * 30) video_response = "" - for chunk in video_request: if chunk.choices[0].delta.content is not None: content = chunk.choices[0].delta.content video_response += content - sys.stdout.write(content) - sys.stdout.flush() + print(content, end="", flush=True) print("-" * 30) # Add assertions to validate the video response