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
160 lines
4.9 KiB
Python
160 lines
4.9 KiB
Python
"""
|
|
SGLang Embeddings Benchmark Script
|
|
|
|
This script benchmarks SGLang's /v1/embeddings API performance using HTTP requests.
|
|
|
|
Features:
|
|
- HTTP-only implementation
|
|
- Uses /v1/embeddings API endpoint directly
|
|
- Configurable RPS, duration, and batch sizes
|
|
- Progress tracking and detailed metrics
|
|
- Poisson and constant request distributions
|
|
|
|
Usage:
|
|
- Update configuration variables at the top of the file
|
|
- Ensure SGLang server is running on the configured HTTP_URL
|
|
- Run: python bench_embeddings.py
|
|
"""
|
|
|
|
import asyncio
|
|
import logging
|
|
from typing import Optional
|
|
|
|
from transformers import AutoTokenizer
|
|
from util import (
|
|
BenchmarkConfig,
|
|
generate_text_with_token_count,
|
|
run_benchmark_main,
|
|
run_generic_benchmark,
|
|
)
|
|
|
|
# Configure logging
|
|
logging.basicConfig(
|
|
level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
###############################################################################
|
|
# CONFIG
|
|
###############################################################################
|
|
# Create benchmark configuration
|
|
config = BenchmarkConfig()
|
|
config.rps_values = [500]
|
|
config.duration_secs_values = [60]
|
|
config.num_unique_requests = 100
|
|
config.distribution = "POISSON"
|
|
config.profile = False
|
|
config.freeze_gc = True # Enable GC freeze functionality
|
|
# Profiler output directory - by default uses present working directory (pwd)
|
|
# Uncomment and customize the line below to override the default location:
|
|
# config.profiler_dir = "/sglang-oss-trace"
|
|
|
|
# HTTP Configuration
|
|
HTTP_URL = "http://localhost:30000/v1/embeddings"
|
|
|
|
# Embeddings API Config
|
|
EMBEDDINGS_MODEL_PATH = "Qwen/Qwen3-Embedding-0.6B"
|
|
BATCH_SIZE = [1] # Number of items per request (batch size)
|
|
|
|
# Configurable input token length
|
|
EMBEDDINGS_INPUT_TOKENS = 500 # Default token length
|
|
MATRYOSHKA_DIMENSIONS: Optional[int] = (
|
|
None # Set to None to disable matryoshka embeddings
|
|
)
|
|
|
|
# Load tokenizer once for embeddings text generation
|
|
print("Loading tokenizer for embeddings input generation...")
|
|
embeddings_tokenizer = AutoTokenizer.from_pretrained(EMBEDDINGS_MODEL_PATH)
|
|
|
|
# Generate input text with the specified token length using pre-loaded tokenizer
|
|
EMBEDDINGS_INPUT_TEXT = generate_text_with_token_count(
|
|
EMBEDDINGS_MODEL_PATH,
|
|
EMBEDDINGS_INPUT_TOKENS,
|
|
config.special_replicated_token,
|
|
tokenizer=embeddings_tokenizer,
|
|
)
|
|
|
|
|
|
###############################################################################
|
|
# REQUEST GENERATION (in parallel)
|
|
###############################################################################
|
|
def build_embeddings_request(index: int, item_count: int) -> tuple:
|
|
"""Build a single embeddings request."""
|
|
try:
|
|
# For embeddings, input can be a string or list of strings
|
|
if item_count == 1:
|
|
input_data = EMBEDDINGS_INPUT_TEXT
|
|
else:
|
|
input_data = [EMBEDDINGS_INPUT_TEXT for _ in range(item_count)]
|
|
req = {
|
|
"input": input_data,
|
|
"model": EMBEDDINGS_MODEL_PATH,
|
|
"dimensions": MATRYOSHKA_DIMENSIONS,
|
|
}
|
|
return (index, req)
|
|
except Exception as e:
|
|
logger.error(f"Error building request {index}: {e}")
|
|
return (index, None)
|
|
|
|
|
|
def validate_embeddings_response(response_data: dict) -> bool:
|
|
"""Validate embeddings API response."""
|
|
return (
|
|
"data" in response_data
|
|
and len(response_data["data"][0]["embedding"]) == MATRYOSHKA_DIMENSIONS
|
|
if MATRYOSHKA_DIMENSIONS
|
|
else True
|
|
)
|
|
|
|
|
|
def build_warmup_embeddings_request() -> dict:
|
|
"""Build a warmup request for the embeddings API."""
|
|
return {
|
|
"input": EMBEDDINGS_INPUT_TEXT,
|
|
"model": EMBEDDINGS_MODEL_PATH,
|
|
"dimensions": MATRYOSHKA_DIMENSIONS,
|
|
}
|
|
|
|
|
|
###############################################################################
|
|
# MAIN
|
|
###############################################################################
|
|
async def run_benchmark(rps, duration_secs, item_count):
|
|
"""Run a single embeddings benchmark with the given RPS value."""
|
|
return await run_generic_benchmark(
|
|
rps=rps,
|
|
duration_secs=duration_secs,
|
|
item_count=item_count,
|
|
config=config,
|
|
http_url=HTTP_URL,
|
|
build_request_func=build_embeddings_request,
|
|
response_validator=validate_embeddings_response,
|
|
api_name="EMBEDDINGS",
|
|
request_description="embeddings requests",
|
|
)
|
|
|
|
|
|
async def main():
|
|
additional_info = {
|
|
"Input text length": f"{EMBEDDINGS_INPUT_TOKENS} tokens",
|
|
"Input text preview": (
|
|
EMBEDDINGS_INPUT_TEXT[:100] + "..."
|
|
if len(EMBEDDINGS_INPUT_TEXT) > 100
|
|
else EMBEDDINGS_INPUT_TEXT
|
|
),
|
|
}
|
|
|
|
await run_benchmark_main(
|
|
config,
|
|
run_benchmark,
|
|
"EMBEDDINGS",
|
|
HTTP_URL,
|
|
BATCH_SIZE,
|
|
additional_info,
|
|
build_warmup_embeddings_request,
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|