MiniCPM-V 4.6

MiniCPM-V 4.6

MiniCPM-V 4.6은 OpenBMB가 개발한 차세대 멀티모달 모델이에요. MiniCPM-V 시리즈의 팀이 만들었죠. 이 모델은 Qwen3.5 스타일 하이브리드 LLM 백본(Gated Delta Net + full attention)과 임의 종횡비와 고해상도 슬라이싱을 네이티브로 처리하는 NaViT-패킹 비전 인코더, 그리고 엔드투엔드 비디오 지원을 결합해요.

출처: 문서

본문

1. Model Introduction

MiniCPM-V 4.6은 MiniCPM-V 시리즈를 만든 팀인 OpenBMB의 차세대 멀티모달 모델이에요. 이 모델은 Qwen3.5 스타일 하이브리드 LLM 백본(Gated Delta Net + full attention)과 임의 종횡비·고해상도 슬라이싱을 네이티브로 처리하는 NaViT-패킹 비전 인코더, 그리고 엔드투엔드 비디오 지원을 결합해요.

OpenBMB는 HuggingFace에 두 가지 변형을 제공해요:

  • openbmb/MiniCPM-V-4.6 — 기본 instruct 모델. 일반적인 멀티모달 서빙에 이 모델을 사용하세요. thinking 모드는 chat_template_kwargs.enable_thinking=true로 요청마다 여전히 사용할 수 있어요.
  • openbmb/MiniCPM-V-4.6-Thinking — 더 강한 chain-of-thought 동작을 가진 thinking 튜닝 변형. 동일한 --reasoning-parser qwen3 플래그와 함께 사용해요.

주요 특징:

  • 하이브리드 LLM 백본: Gated Delta Net(선형 attention) 레이어와 full-attention 레이어를 섞은 Qwen3.5 스타일 — 모델링 파워를 포기하지 않으면서 긴 컨텍스트 효율을 제공해요.
  • 네이티브 가변 해상도 비전: mid-ViT merger와 이미지별 window attention을 갖춘 NaViT-패킹 비전 인코더. 강제 letterboxing 없이 모든 종횡비의 이미지를 처리해요.
  • 고해상도 슬라이싱: 원본 이미지와 구성 가능한 슬라이스 타일 그리드(오픈 테스트 변형에서 최대 9 타일)로 1280×720+ 이미지의 세부 디테일을 추론할 수 있어요.
  • 비디오: 프레임별 멀티모달 데이터 항목이 동일한 비전 인코더로 라우팅돼요. 요청당 프레임 수는 무제한이에요.
  • Reasoning Parser: 전환 가능한 thinking 모드(Qwen3.5 계열). 요청마다 chat_template_kwargs.enable_thinking, 서버 측에서는 SGLang의 --reasoning-parser qwen3로 노출돼요.
  • Tool Calling: Qwen3.5 스타일 <tool_call><function=…><parameter=…>…</parameter></function></tool_call> XML 형식. SGLang의 --tool-call-parser qwen3_coder를 통해 OpenAI 호환 message.tool_calls로 표면화돼요. thinking 모드·이미지/비디오 입력과 함께 사용할 수 있어요.

라이선스: Apache 2.0.

2. SGLang Installation

nightly Docker 이미지를 받으세요(롤링 태그, main 추적):

# CUDA 13 (Hopper / Blackwell, default)
docker pull lmsysorg/sglang:dev

# CUDA 12 (Ampere or older drivers). Final build: the CUDA 12 lane is retired,
# so this tag no longer tracks main.
docker pull lmsysorg/sglang:dev-cu12

일반적인 SGLang 설치 가이드(PyPI, 소스, Docker)는 공식 SGLang 설치 가이드를 참고하세요.

3. Model Deployment

3.1 Basic Configuration

대화형 명령 생성기: 아래 구성 선택기를 사용해 적절한 배포 명령을 생성하세요. Variant 토글은 openbmb/MiniCPM-V-4.6(base)과 openbmb/MiniCPM-V-4.6-Thinking 사이를 전환해요. Reasoning ParserTool Call Parser 토글은 각각 --reasoning-parser qwen3--tool-call-parser qwen3_coder를 추가해요. 사용 세부 사항은 §4.4를 참조하세요.

3.2 Configuration Tips

  • Mamba Radix Cache: Qwen3.5의 하이브리드 Gated Delta Networks 아키텍처는 --mamba-radix-cache-strategy를 통해 두 가지 mamba 스케줄링 전략을 지원해요:
    • V1 (no_buffer): 기본값. overlap 스케줄러 없음, 더 낮은 메모리 사용. AMD MI GPU에 필요해요.
    • V2 (extra_buffer): --mamba-radix-cache-strategy extra_buffer --page-size 64로 overlap 스케줄링과 branching point 캐싱을 활성화. FLA 커널 백엔드(NVIDIA GPU 전용) 필요. 더 높은 mamba 상태 메모리를 처리량 향상과 맞바꿔요. 비-KV-cache-바운드 시나리오에서는 엄격히 우월하고, KV-cache-바운드 경우에는 overlap 스케줄링 이점과 줄어든 최대 동시성을 저울질해야 해요. --page-sizeFLA_CHUNK_SIZE % page_size == 0 또는 page_size % FLA_CHUNK_SIZE == 0을 만족해야 해요(FLA_CHUNK_SIZE는 현재 64).
  • --mem-fraction-static 플래그는 최적의 메모리 활용을 위해 권장되며, 하드웨어와 워크로드에 따라 조정하세요.
  • 컨텍스트 길이 기본값은 262,144 토큰이에요. OOM 오류가 발생하면 줄이는 것을 고려하되, thinking 기능을 유지하려면 최소 128K는 유지하세요.
  • 이 큰 모델의 가중치 로딩을 빠르게 하려면 실행 명령에 --model-loader-extra-config='{"enable_multithread_load": "true","num_threads": 64}'를 추가하세요.
  • CUDA IPC Transport: 환경 변수로 SGLANG_USE_CUDA_IPC_TRANSPORT=1을 추가하면 멀티모달 특성을 전송하는 데 CUDA IPC를 사용해 TTFT(Time To First Token)를 크게 개선해요. 주의: 이미지 크기에 비례해 추가 메모리를 소모하므로 --mem-fraction-static이나 --max-running-requests를 낮춰야 할 수 있어요.
  • Multimodal Attention Backend: H100/H200에서는 --mm-attention-backend fa3을, B200/B300에서는 --mm-attention-backend fa4를 사용해 더 나은 비전 성능을 얻으세요.
  • 큰 이미지나 비디오를 처리할 때는 이미지 특성 텐서 공간을 확보하도록 --mem-fraction-static을 낮춰야 할 수 있어요.
  • 다중 이미지 및 고해상도 이미지: 이미지 프로세서는 원본 픽셀 하나와 슬라이스 타일 패치를 만들어 내며, 각각이 자체 MultimodalDataItem이에요. 특별한 서버 측 플래그는 필요 없어요.
  • 비디오: 동일한 이미지 스타일 슬라이서로 프레임별 디코딩돼요. 추가 플래그 없이 OpenAI 채팅 완성 요청에 video_url을 전달하면 돼요.
  • Chunked Prefill: 큰/슬라이스된 이미지가 많은 고동시성 비전 벤치마킹에서는 --chunked-prefill-size -1을 전달해 prefill 청킹을 비활성화하세요. 기본 chunked-prefill 경로는 mm_utils.embed_mm_inputs에서 이미지 경계를 가로질러 요청을 잘못 분할해 서버가 중단될 수 있어요. 청킹을 비활성화하면 동시성 하에서 더 높은 TTFT를 대가로 이 문제를 피할 수 있어요. 대화형 서빙에는 기본값을 그대로 두세요.

4. Model Invocation

H200에 모델을 배포하세요:

sglang serve --model-path openbmb/MiniCPM-V-4.6 \
  --trust-remote-code \
  --dtype bfloat16 \
  --mem-fraction-static 0.15 \
  --mamba-radix-cache-strategy extra_buffer \
  --page-size 64 \
  --host 0.0.0.0 --port 30000

4.1 Basic Usage (Image)

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:30000/v1",
    api_key="EMPTY",
)

response = client.chat.completions.create(
    model="openbmb/MiniCPM-V-4.6",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://www.ilankelman.org/stopsigns/australia.jpg",
                    },
                },
                {"type": "text", "text": "Describe this image in one sentence."},
            ],
        }
    ],
    max_tokens=200,
    extra_body={"chat_template_kwargs": {"enable_thinking": False}},
)

print(response.choices[0].message.content)

출력 예시:

A black SUV drives past a Chinese-style gate with a red stop sign and traditional architecture, while storefronts and street signs line the sidewalk.

4.2 High-Resolution / Sliced Images

이미지 프로세서는 고해상도 입력에 대해 자동으로 슬라이스 그리드(최대 9 타일)를 선택해요. 1280×720 소스는 그리드 [2, 3]을 만들어요:

  • tgt_sizes=[(24, 44), 6×(28, 36)]인 7개 패치 — HF 참조 구현과 바이트 단위로 일치해요.
from openai import OpenAI

client = OpenAI(base_url="http://localhost:30000/v1", api_key="EMPTY")

response = client.chat.completions.create(
    model="openbmb/MiniCPM-V-4.6",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/idefics-few-shot.jpg",
                    },
                },
                {"type": "text", "text": "Describe this image in one sentence."},
            ],
        }
    ],
    max_tokens=200,
    extra_body={"chat_template_kwargs": {"enable_thinking": False}},
)

print(response.choices[0].message.content)

출력 예시:

The Statue of Liberty stands tall against a cloudy sky, holding a torch aloft and a document in her left hand, symbolizing freedom and enlightenment.

4.3 Video Input

from openai import OpenAI

client = OpenAI(base_url="http://localhost:30000/v1", api_key="EMPTY")

response = client.chat.completions.create(
    model="openbmb/MiniCPM-V-4.6",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "video_url",
                    "video_url": {"url": "<your-video-url-or-file-path>"},
                },
                {"type": "text", "text": "Describe what happens in this video in one sentence."},
            ],
        }
    ],
    max_tokens=200,
    extra_body={"chat_template_kwargs": {"enable_thinking": False}},
)

print(response.choices[0].message.content)

출력 예시(움직이는 색상 사각형의 8프레임 합성 테스트 mp4에 대해 실행):

The video shows a grid of colored squares moving in a random pattern.

4.4 Advanced Usage

4.4.1 Reasoning Parser

서버에 --reasoning-parser qwen3를 전달하면(§3.1에서 "Reasoning Parser" 토글 켜기, 기본값) SGLang이 각 응답을 thinking / response 경계로 분할해요: response 이전 블록은 reasoning_content로, 이후 텍스트는 content로 갑니다. 요청마다 채팅 템플릿의 enable_thinking 플래그가 모델이 실제로 추론을 생성할지 여부를 전환해요.

  • Thinking 모드(기본값, enable_thinking=true): assistant 프롬프트가 thinking\n으로 끝나요. 모델은 추론을 쓰고 response로 닫은 다음 답을 생성해요. reasoning_contentcontent가 모두 채워져요.
  • Instruct 모드(enable_thinking=false): 채팅 템플릿이 빈 thinking response 플레이스홀더를 주입해서 모델이 thinking 토큰을 생성하지 않아요. reasoning_content는 비어 있게 돼요.
# thinking mode
from openai import OpenAI

client = OpenAI(base_url="http://localhost:30000/v1", api_key="EMPTY")

response = client.chat.completions.create(
    model="openbmb/MiniCPM-V-4.6",
    messages=[{"role": "user", "content": "Reply with the single word 'hi'. No explanation."}],
    max_tokens=200,
)

msg = response.choices[0].message
print("reasoning_content:", msg.reasoning_content)
print("content          :", msg.content)
reasoning_content: Got it, let's see. The user wants a reply with "hi" and no explanation. So I need to just say "hi" as the response. ...
content          : hi
# instruct mode
response = client.chat.completions.create(
    model="openbmb/MiniCPM-V-4.6",
    messages=[{"role": "user", "content": "Reply with the single word 'hi'. No explanation."}],
    max_tokens=200,
    extra_body={"chat_template_kwargs": {"enable_thinking": False}},
)

msg = response.choices[0].message
print("reasoning_content:", msg.reasoning_content)
print("content          :", msg.content)
reasoning_content:
content          : hi

4.4.2 Tool Calling

서버에 --tool-call-parser qwen3_coder를 전달하면(§3.1에서 "Tool Call Parser" 토글 켜기) SGLang이 모델 출력에서 <tool_call> 블록을 추출해 OpenAI 스타일 message.tool_calls 필드(finish_reason="tool_calls" 포함)로 만들어요. 모델은 Qwen3.5 XML 툴콜 형식(<tool_call><function=name><parameter=k>v</parameter></function></tool_call>)을 말하며, qwen3_coder 파서가 올바른 선택이에요. 도구 호출은 두 reasoning 모드와 이미지/비디오 입력 모두와 함께 사용할 수 있어요.

MiniCPM-V 4.6에는 `--tool-call-parser qwen`을 사용하지 **마세요** — 이 파서는 이전 Qwen2.5 JSON 형식 `{"name":..., "arguments":...}`을 기대하지만, 두 공개 4.6 변형은 중첩된 ``와 `` 태그가 있는 Qwen3.5 스타일 XML 형식을 생성하거든요. `qwen`으로는 바깥 `` 마커는 일치하지만 내부 JSON 파싱이 실패해서 `tool_calls`가 비어 반환되고 원본 마크업이 `content`에 남아요.
from openai import OpenAI

client = OpenAI(base_url="http://localhost:30000/v1", api_key="EMPTY")

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Get the current weather for a city.",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {"type": "string"},
                    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
                },
                "required": ["location"],
            },
        },
    },
]

response = client.chat.completions.create(
    model="openbmb/MiniCPM-V-4.6",
    messages=[{"role": "user", "content": "What is the weather in San Francisco? Use the tool."}],
    tools=tools,
    max_tokens=200,
    extra_body={"chat_template_kwargs": {"enable_thinking": False}},
)

choice = response.choices[0]
print("finish_reason:", choice.finish_reason)
for tc in choice.message.tool_calls or []:
    print(f"  {tc.function.name}({tc.function.arguments})")
finish_reason: tool_calls
  get_weather({"location": "San Francisco", "unit": "celsius"})

최종 자연어 답을 얻으려면 도구의 결과를 tool 역할 메시지로 돌려보내고 동일한 tools 목록으로 API를 다시 호출하세요 — 모델이 content에 답과 함께 finish_reason="stop"을 생성해요.

5. Benchmark

공통 테스트 환경(이하 모든 벤치마크):

  • 하드웨어: 1× NVIDIA H200 (141 GB), 단일 GPU (TP / DP 없음)
  • Docker 이미지: lmsysorg/sglang:dev (transformers 5.6.0, sgl-kernel 0.4.2.post1)
  • 정밀도: BF16

공통 서버 실행 명령:

CUDA_VISIBLE_DEVICES=0 python -m sglang.launch_server \
  --model-path openbmb/MiniCPM-V-4.6 \
  --trust-remote-code \
  --dtype bfloat16 \
  --mem-fraction-static 0.5 \
  --mamba-radix-cache-strategy extra_buffer \
  --chunked-prefill-size -1 \
  --host 0.0.0.0 --port 30000

(--chunked-prefill-size -1은 비전 처리량 실행에 필요해요. §3.2 참조.)

5.1 Accuracy Benchmark

5.1.1 MMMU Benchmark

  • 벤치마크 명령
python3 benchmark/mmmu/bench_sglang.py --port 30000 --concurrency 48 --max-new-tokens 2048
  • 테스트 결과
{'Accounting': {'acc': 0.767, 'num': 30},
 'Agriculture': {'acc': 0.533, 'num': 30},
 'Architecture_and_Engineering': {'acc': 0.4, 'num': 30},
 'Art': {'acc': 0.6, 'num': 30},
 'Art_Theory': {'acc': 0.667, 'num': 30},
 'Basic_Medical_Science': {'acc': 0.533, 'num': 30},
 'Biology': {'acc': 0.333, 'num': 30},
 'Chemistry': {'acc': 0.333, 'num': 30},
 'Clinical_Medicine': {'acc': 0.467, 'num': 30},
 'Computer_Science': {'acc': 0.333, 'num': 30},
 'Design': {'acc': 0.533, 'num': 30},
 'Diagnostics_and_Laboratory_Medicine': {'acc': 0.333, 'num': 30},
 'Economics': {'acc': 0.633, 'num': 30},
 'Electronics': {'acc': 0.5, 'num': 30},
 'Energy_and_Power': {'acc': 0.633, 'num': 30},
 'Finance': {'acc': 0.533, 'num': 30},
 'Geography': {'acc': 0.367, 'num': 30},
 'History': {'acc': 0.533, 'num': 30},
 'Literature': {'acc': 0.7, 'num': 30},
 'Manage': {'acc': 0.367, 'num': 30},
 'Marketing': {'acc': 0.733, 'num': 30},
 'Materials': {'acc': 0.367, 'num': 30},
 'Math': {'acc': 0.567, 'num': 30},
 'Mechanical_Engineering': {'acc': 0.333, 'num': 30},
 'Music': {'acc': 0.267, 'num': 30},
 'Overall': {'acc': 0.527, 'num': 900},
 'Overall-Art and Design': {'acc': 0.517, 'num': 120},
 'Overall-Business': {'acc': 0.607, 'num': 150},
 'Overall-Health and Medicine': {'acc': 0.553, 'num': 150},
 'Overall-Humanities and Social Science': {'acc': 0.617, 'num': 120},
 'Overall-Science': {'acc': 0.473, 'num': 150},
 'Overall-Tech and Engineering': {'acc': 0.443, 'num': 210},
 'Pharmacy': {'acc': 0.667, 'num': 30},
 'Physics': {'acc': 0.767, 'num': 30},
 'Psychology': {'acc': 0.567, 'num': 30},
 'Public_Health': {'acc': 0.767, 'num': 30},
 'Sociology': {'acc': 0.667, 'num': 30}}
eval out saved to ./val_sglang.json
Overall accuracy: 0.527

5.2 Speed Benchmark

SGLang 내장 bench_serving 도구를 임의 텍스트 프롬프트(1000 입력 / 1000 출력 토큰)와 함께 사용해 텍스트 전용 서빙 성능을 특성화해요.

5.2.1 Latency Benchmark

python3 -m sglang.bench_serving \
  --backend sglang \
  --model openbmb/MiniCPM-V-4.6 \
  --dataset-name random \
  --random-input-len 1000 \
  --random-output-len 1000 \
  --num-prompts 10 \
  --max-concurrency 1 \
  --request-rate inf
============ Serving Benchmark Result ============
Backend:                                 sglang
Traffic request rate:                    inf
Max request concurrency:                 1
Successful requests:                     10
Benchmark duration (s):                  7.47
Total input tokens:                      6101
Total input text tokens:                 6101
Total generated tokens:                  4220
Total generated tokens (retokenized):    3554
Request throughput (req/s):              1.34
Input token throughput (tok/s):          816.44
Output token throughput (tok/s):         564.73
Peak output token throughput (tok/s):    690.00
Peak concurrent requests:                4
Total token throughput (tok/s):          1381.17
Concurrency:                             1.00
----------------End-to-End Latency----------------
Mean E2E Latency (ms):                   746.20
Median E2E Latency (ms):                 590.05
P90 E2E Latency (ms):                    1446.13
P99 E2E Latency (ms):                    1709.38
---------------Time to First Token----------------
Mean TTFT (ms):                          138.12
Median TTFT (ms):                        103.70
P99 TTFT (ms):                           330.79
-----Time per Output Token (excl. 1st token)------
Mean TPOT (ms):                          1.44
Median TPOT (ms):                        1.44
P99 TPOT (ms):                           1.45
---------------Inter-Token Latency----------------
Mean ITL (ms):                           1.44
Median ITL (ms):                         1.45
P95 ITL (ms):                            1.49
P99 ITL (ms):                            1.57
Max ITL (ms):                            5.79
==================================================

5.2.2 Throughput Benchmark

python3 -m sglang.bench_serving \
  --backend sglang \
  --model openbmb/MiniCPM-V-4.6 \
  --dataset-name random \
  --random-input-len 1000 \
  --random-output-len 1000 \
  --num-prompts 1000 \
  --max-concurrency 100 \
  --request-rate inf
============ Serving Benchmark Result ============
Backend:                                 sglang
Traffic request rate:                    inf
Max request concurrency:                 100
Successful requests:                     1000
Benchmark duration (s):                  47.07
Total input tokens:                      502493
Total input text tokens:                 502493
Total generated tokens:                  500251
Total generated tokens (retokenized):    469844
Request throughput (req/s):              21.24
Input token throughput (tok/s):          10675.32
Output token throughput (tok/s):         10627.69
Peak output token throughput (tok/s):    25911.00
Peak concurrent requests:                130
Total token throughput (tok/s):          21303.01
Concurrency:                             97.24
----------------End-to-End Latency----------------
Mean E2E Latency (ms):                   4576.94
Median E2E Latency (ms):                 4331.97
P90 E2E Latency (ms):                    8634.07
P99 E2E Latency (ms):                    9636.44
---------------Time to First Token----------------
Mean TTFT (ms):                          206.50
Median TTFT (ms):                        184.72
P99 TTFT (ms):                           624.23
-----Time per Output Token (excl. 1st token)------
Mean TPOT (ms):                          8.73
Median TPOT (ms):                        9.16
P99 TPOT (ms):                           13.63
---------------Inter-Token Latency----------------
Mean ITL (ms):                           8.75
Median ITL (ms):                         0.05
P95 ITL (ms):                            29.95
P99 ITL (ms):                            108.91
Max ITL (ms):                            448.40
==================================================

5.3 Vision Speed Benchmark

SGLang 내장 bench_serving 도구를 임의 이미지와 함께 사용해요. 각 요청은 128개의 입력 텍스트 토큰, 720p 이미지 1장, 1024개의 출력 토큰을 가져요.

5.3.1 Latency Benchmark

python3 -m sglang.bench_serving \
  --backend sglang-oai-chat \
  --host 127.0.0.1 \
  --port 30000 \
  --model openbmb/MiniCPM-V-4.6 \
  --dataset-name image \
  --image-count 1 \
  --image-resolution 720p \
  --random-input-len 128 \
  --random-output-len 1024 \
  --num-prompts 10 \
  --max-concurrency 1 \
  --request-rate inf
============ Serving Benchmark Result ============
Backend:                                 sglang-oai-chat
Traffic request rate:                    inf
Max request concurrency:                 1
Successful requests:                     10
Benchmark duration (s):                  10.26
Total input tokens:                      767
Total input text tokens:                 750
Total input vision tokens:               17
Total generated tokens:                  4220
Total generated tokens (retokenized):    4220
Request throughput (req/s):              0.97
Input token throughput (tok/s):          74.77
Output token throughput (tok/s):         411.39
Peak output token throughput (tok/s):    654.00
Peak concurrent requests:                2
Total token throughput (tok/s):          486.16
Concurrency:                             1.00
----------------End-to-End Latency----------------
Mean E2E Latency (ms):                   1024.04
Median E2E Latency (ms):                 897.99
P90 E2E Latency (ms):                    1584.25
P99 E2E Latency (ms):                    1781.78
---------------Time to First Token----------------
Mean TTFT (ms):                          416.94
Median TTFT (ms):                        403.18
P99 TTFT (ms):                           477.49
-----Time per Output Token (excl. 1st token)------
Mean TPOT (ms):                          1.44
Median TPOT (ms):                        1.44
P99 TPOT (ms):                           1.45
---------------Inter-Token Latency----------------
Mean ITL (ms):                           1.44
Median ITL (ms):                         1.44
P95 ITL (ms):                            1.48
P99 ITL (ms):                            1.56
Max ITL (ms):                            2.89
==================================================

5.3.2 Throughput Benchmark

python3 -m sglang.bench_serving \
  --backend sglang-oai-chat \
  --host 127.0.0.1 \
  --port 30000 \
  --model openbmb/MiniCPM-V-4.6 \
  --dataset-name image \
  --image-count 1 \
  --image-resolution 720p \
  --random-input-len 128 \
  --random-output-len 1024 \
  --num-prompts 1000 \
  --max-concurrency 100 \
  --request-rate inf
============ Serving Benchmark Result ============
Backend:                                 sglang-oai-chat
Traffic request rate:                    inf
Max request concurrency:                 100
Successful requests:                     1000
Benchmark duration (s):                  360.01
Total input tokens:                      79925
Total input text tokens:                 78283
Total input vision tokens:               1642
Total generated tokens:                  510855
Total generated tokens (retokenized):    430289
Request throughput (req/s):              2.78
Input token throughput (tok/s):          222.01
Output token throughput (tok/s):         1419.01
Peak output token throughput (tok/s):    19620.00
Peak concurrent requests:                105
Total token throughput (tok/s):          1641.02
Concurrency:                             99.69
----------------End-to-End Latency----------------
Mean E2E Latency (ms):                   35888.57
Median E2E Latency (ms):                 35321.48
P90 E2E Latency (ms):                    41017.37
P99 E2E Latency (ms):                    60343.22
---------------Time to First Token----------------
Mean TTFT (ms):                          35096.32
Median TTFT (ms):                        34301.37
P99 TTFT (ms):                           59966.25
-----Time per Output Token (excl. 1st token)------
Mean TPOT (ms):                          1.63
Median TPOT (ms):                        1.45
P99 TPOT (ms):                           10.15
---------------Inter-Token Latency----------------
Mean ITL (ms):                           1.58
Median ITL (ms):                         0.12
P95 ITL (ms):                            0.23
P99 ITL (ms):                            0.77
Max ITL (ms):                            2086.12
==================================================

더 알아보기