94057c3d3e
PR Test (NPU) / check-changes (push) Has been cancelled
PR Test (NPU) / pr-gate (push) Has been cancelled
PR Test (NPU) / set-image-config (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-4-npu-a3 (push) Has been cancelled
PR Test (NPU) / stage-b-test-16-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-1-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-2-npu-a3 (push) Has been cancelled
PR Test (Arm64) / pr-gate (push) Has been cancelled
PR Test (Arm64) / check-changes (push) Has been cancelled
PR Test (Arm64) / build-test (push) Has been cancelled
PR Test (sgl-router) / gate (push) Has been cancelled
PR Test (sgl-router) / tier-1 — lint (push) Has been cancelled
PR Test (sgl-router) / tier-2 — build + test (push) Has been cancelled
PR Test (sgl-router) / tier-3 — docker (placeholder) (push) Has been cancelled
PR Test (sgl-router) / tier-3 — k8s integration (push) Has been cancelled
PR Test (sgl-router) / tier-3 — e2e (push) Has been cancelled
PR Test (sgl-router) / finish (push) Has been cancelled
PR Test (NPU) / single-node-poc (map[name:qwen3_6_27b_w8a8_1p_in64k_out1k_50ms runner:linux-aarch64-a3-2 test_case:test/registered/ascend/performance/qwen3_6_27b/test_npu_qwen3_6_27b_w8a8_1p_in64k_out1k_50ms.py test_type:perf]) (push) Has been cancelled
PR Test (NPU) / pr-test-npu-finish (push) Has been cancelled
PR Test (Xeon) / pr-gate (push) Has been cancelled
PR Test (Xeon) / check-changes (push) Has been cancelled
PR Test (Xeon) / build-test (, xeon-gnr, base-b-test-cpu) (push) Has been cancelled
PR Test (XPU) / check-changes (push) Has been cancelled
PR Test (XPU) / pr-gate (push) Has been cancelled
PR Test (XPU) / stage-a-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / wait-for-stage-a (push) Has been cancelled
PR Test (XPU) / stage-b-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / finish (push) Has been cancelled
CI Model Inventory / build-inventory (push) Has been cancelled
Lint / lint (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Compilation Check (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Manual Policy (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Request Processing (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Summary (push) Has been cancelled
PR Test (SMG) / build-wheel (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on windows (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (x86_64 - auto) (push) Has been cancelled
PR Test (SMG) / python-unit-tests (push) Has been cancelled
PR Test (SMG) / unit-tests (push) Has been cancelled
PR Test (SMG) / benchmarks (push) Has been cancelled
PR Test (SMG) / chat-completions (push) Has been cancelled
PR Test (SMG) / chat-completions-4gpu (push) Has been cancelled
PR Test (SMG) / e2e (push) Has been cancelled
PR Test (SMG) / docker-build-test (push) Has been cancelled
PR Test (SMG) / k8s-integration (push) Has been cancelled
PR Test (SMG) / finish (push) Has been cancelled
PR Test (SMG) / summarize-benchmarks (push) Has been cancelled
Release SGLang Model Gateway Docker Image / publish (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Build SDist (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Upload to PyPI (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (aarch64, 12.9, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (x86_64, 12.9, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu129 (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (aarch64, 13.0, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (x86_64, 13.0, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu130 (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 700) (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 720) (push) Has been cancelled
Release SGLang Kernels / release-rocm700 (push) Has been cancelled
Release SGLang Kernels / release-rocm720 (push) Has been cancelled
Release SGLang Kernels / build-musa43 (43, 3.10) (push) Has been cancelled
Release SGLang Kernels / release-musa43 (push) Has been cancelled
266 lines
8.0 KiB
Python
266 lines
8.0 KiB
Python
"""
|
|
Usage:
|
|
|
|
python3 -m sglang.launch_server --model-path lmms-lab/llava-onevision-qwen2-72b-ov --port=30000 --tp-size=8
|
|
|
|
python3 llava_onevision_server.py
|
|
"""
|
|
|
|
import io
|
|
import os
|
|
import sys
|
|
import time
|
|
|
|
import numpy as np
|
|
import openai
|
|
import pybase64
|
|
import requests
|
|
from PIL import Image
|
|
|
|
from sglang.srt.utils.video_decoder import VideoDecoderWrapper
|
|
|
|
# pip install httpx==0.23.3
|
|
# pip install torchcodec
|
|
# pip install protobuf==3.20.0
|
|
|
|
|
|
def download_video(url, cache_dir):
|
|
file_path = os.path.join(cache_dir, "jobs.mp4")
|
|
os.makedirs(cache_dir, exist_ok=True)
|
|
|
|
response = requests.get(url)
|
|
response.raise_for_status()
|
|
|
|
with open(file_path, "wb") as f:
|
|
f.write(response.content)
|
|
|
|
print(f"File downloaded and saved to: {file_path}")
|
|
return file_path
|
|
|
|
|
|
def create_openai_client(base_url):
|
|
return openai.Client(api_key="EMPTY", base_url=base_url)
|
|
|
|
|
|
def image_stream_request_test(client):
|
|
print("----------------------Image Stream Request Test----------------------")
|
|
stream_request = client.chat.completions.create(
|
|
model="default",
|
|
messages=[
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{
|
|
"type": "image_url",
|
|
"image_url": {
|
|
"url": "https://raw.githubusercontent.com/sgl-project/sglang/main/assets/logo.png"
|
|
},
|
|
},
|
|
{
|
|
"type": "text",
|
|
"text": "Please describe this image. Please list the benchmarks and the models.",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
temperature=0.7,
|
|
max_tokens=1024,
|
|
stream=True,
|
|
)
|
|
stream_response = ""
|
|
|
|
for chunk in stream_request:
|
|
if chunk.choices[0].delta.content is not None:
|
|
content = chunk.choices[0].delta.content
|
|
stream_response += content
|
|
sys.stdout.write(content)
|
|
sys.stdout.flush()
|
|
|
|
print("-" * 30)
|
|
|
|
|
|
def multi_image_stream_request_test(client):
|
|
print(
|
|
"----------------------Multi-Images Stream Request Test----------------------"
|
|
)
|
|
stream_request = client.chat.completions.create(
|
|
model="default",
|
|
messages=[
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{
|
|
"type": "image_url",
|
|
"image_url": {
|
|
"url": "https://raw.githubusercontent.com/sgl-project/sglang/main/assets/logo.png"
|
|
},
|
|
"modalities": "multi-images",
|
|
},
|
|
{
|
|
"type": "image_url",
|
|
"image_url": {
|
|
"url": "https://raw.githubusercontent.com/sgl-project/sglang/main/examples/assets/example_image.png"
|
|
},
|
|
"modalities": "multi-images",
|
|
},
|
|
{
|
|
"type": "text",
|
|
"text": "I have shown you two images. Please describe the two images to me.",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
temperature=0.7,
|
|
max_tokens=1024,
|
|
stream=True,
|
|
)
|
|
stream_response = ""
|
|
|
|
for chunk in stream_request:
|
|
if chunk.choices[0].delta.content is not None:
|
|
content = chunk.choices[0].delta.content
|
|
stream_response += content
|
|
sys.stdout.write(content)
|
|
sys.stdout.flush()
|
|
|
|
print("-" * 30)
|
|
|
|
|
|
def video_stream_request_test(client, video_path):
|
|
print("------------------------Video Stream Request Test----------------------")
|
|
messages = prepare_video_messages(video_path)
|
|
|
|
video_request = client.chat.completions.create(
|
|
model="default",
|
|
messages=messages,
|
|
temperature=0,
|
|
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("-" * 30)
|
|
|
|
|
|
def image_speed_test(client):
|
|
print("----------------------Image Speed Test----------------------")
|
|
start_time = time.perf_counter()
|
|
request = client.chat.completions.create(
|
|
model="default",
|
|
messages=[
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{
|
|
"type": "image_url",
|
|
"image_url": {
|
|
"url": "https://raw.githubusercontent.com/sgl-project/sglang/main/assets/logo.png"
|
|
},
|
|
},
|
|
{
|
|
"type": "text",
|
|
"text": "Please describe this image. Please list the benchmarks and the models.",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
temperature=0,
|
|
max_tokens=1024,
|
|
)
|
|
end_time = time.perf_counter()
|
|
response = request.choices[0].message.content
|
|
print(response)
|
|
print("-" * 30)
|
|
print_speed_test_results(request, start_time, end_time)
|
|
|
|
|
|
def video_speed_test(client, video_path):
|
|
print("------------------------Video Speed Test------------------------")
|
|
messages = prepare_video_messages(video_path)
|
|
|
|
start_time = time.perf_counter()
|
|
video_request = client.chat.completions.create(
|
|
model="default",
|
|
messages=messages,
|
|
temperature=0,
|
|
max_tokens=1024,
|
|
)
|
|
end_time = time.perf_counter()
|
|
video_response = video_request.choices[0].message.content
|
|
print(video_response)
|
|
print("-" * 30)
|
|
print_speed_test_results(video_request, start_time, end_time)
|
|
|
|
|
|
def prepare_video_messages(video_path):
|
|
max_frames_num = 32
|
|
decoder = VideoDecoderWrapper(video_path)
|
|
total_frame_num = len(decoder)
|
|
uniform_sampled_frames = np.linspace(
|
|
0, total_frame_num - 1, max_frames_num, dtype=int
|
|
)
|
|
frame_idx = uniform_sampled_frames.tolist()
|
|
frames = decoder.get_frames_at(frame_idx)
|
|
|
|
base64_frames = []
|
|
for frame in frames:
|
|
pil_img = Image.fromarray(frame)
|
|
buff = io.BytesIO()
|
|
pil_img.save(buff, format="JPEG")
|
|
base64_str = pybase64.b64encode(buff.getvalue()).decode("utf-8")
|
|
base64_frames.append(base64_str)
|
|
|
|
messages = [{"role": "user", "content": []}]
|
|
|
|
for base64_frame in base64_frames:
|
|
frame_format = {
|
|
"type": "image_url",
|
|
"image_url": {"url": f"data:image/jpeg;base64,{base64_frame}"},
|
|
"modalities": "video",
|
|
}
|
|
messages[0]["content"].append(frame_format)
|
|
|
|
prompt = {"type": "text", "text": "Please describe the video in detail."}
|
|
messages[0]["content"].append(prompt)
|
|
|
|
return messages
|
|
|
|
|
|
def print_speed_test_results(request, start_time, end_time):
|
|
total_tokens = request.usage.total_tokens
|
|
completion_tokens = request.usage.completion_tokens
|
|
prompt_tokens = request.usage.prompt_tokens
|
|
|
|
print(f"Total tokens: {total_tokens}")
|
|
print(f"Completion tokens: {completion_tokens}")
|
|
print(f"Prompt tokens: {prompt_tokens}")
|
|
print(f"Time taken: {end_time - start_time} seconds")
|
|
print(f"Token per second: {total_tokens / (end_time - start_time)}")
|
|
print(f"Completion token per second: {completion_tokens / (end_time - start_time)}")
|
|
print(f"Prompt token per second: {prompt_tokens / (end_time - start_time)}")
|
|
|
|
|
|
def main():
|
|
url = "https://raw.githubusercontent.com/EvolvingLMMs-Lab/sglang/dev/onevision_local/assets/jobs.mp4"
|
|
cache_dir = os.path.expanduser("~/.cache")
|
|
video_path = download_video(url, cache_dir)
|
|
|
|
client = create_openai_client("http://127.0.0.1:30000/v1")
|
|
|
|
image_stream_request_test(client)
|
|
multi_image_stream_request_test(client)
|
|
video_stream_request_test(client, video_path)
|
|
image_speed_test(client)
|
|
video_speed_test(client, video_path)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|