Add vLLM v0.18.1 source tree with KV transfer abort fix
third_party/vllm/ now tracked in git for direct patch management.
Based on vLLM v0.18.1 release with one patch applied:
vllm/v1/core/sched/scheduler.py:
Replace fatal assert with graceful skip when KV transfer callback
arrives for an already-aborted request during PD disaggregated serving.
Future vLLM modifications should be made directly in third_party/vllm/
and committed normally. The patches/ directory is kept as documentation
of what changed from upstream.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
49
third_party/vllm/tests/evals/gpt_oss/README.md
vendored
Normal file
49
third_party/vllm/tests/evals/gpt_oss/README.md
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
# GPQA Evaluation using GPT-OSS
|
||||
|
||||
This directory contains GPQA evaluation tests using the GPT-OSS evaluation package and vLLM server.
|
||||
|
||||
## Usage
|
||||
|
||||
### Run tests with pytest (like buildkite)
|
||||
|
||||
```bash
|
||||
# H200
|
||||
pytest -s -v tests/evals/gpt_oss/test_gpqa_correctness.py \
|
||||
--config-list-file=configs/models-h200.txt
|
||||
|
||||
# B200
|
||||
pytest -s -v tests/evals/gpt_oss/test_gpqa_correctness.py \
|
||||
--config-list-file=configs/models-b200.txt
|
||||
```
|
||||
|
||||
## Configuration Format
|
||||
|
||||
Model configs in `configs/` directory use this YAML format:
|
||||
|
||||
```yaml
|
||||
model_name: "openai/gpt-oss-20b"
|
||||
metric_threshold: 0.568 # Minimum expected accuracy
|
||||
reasoning_effort: "low" # Reasoning effort level (default: "low")
|
||||
server_args: "--tensor-parallel-size 2" # Server arguments
|
||||
startup_max_wait_seconds: 1800 # Max wait for server startup (default: 1800)
|
||||
env: # Environment variables (optional)
|
||||
SOME_VAR: "value"
|
||||
```
|
||||
|
||||
The `server_args` field accepts any arguments that can be passed to `vllm serve`.
|
||||
|
||||
The `env` field accepts a dictionary of environment variables to set for the server process.
|
||||
|
||||
## Adding New Models
|
||||
|
||||
1. Create a new YAML config file in the `configs/` directory
|
||||
2. Add the filename to the appropriate `models-*.txt` file
|
||||
|
||||
## Tiktoken Encoding Files
|
||||
|
||||
The tiktoken encoding files required by the vLLM server are automatically downloaded from OpenAI's public blob storage on first run:
|
||||
|
||||
- `cl100k_base.tiktoken`
|
||||
- `o200k_base.tiktoken`
|
||||
|
||||
Files are cached in the `data/` directory. The `TIKTOKEN_ENCODINGS_BASE` environment variable is automatically set to point to this directory when running evaluations.
|
||||
2
third_party/vllm/tests/evals/gpt_oss/__init__.py
vendored
Normal file
2
third_party/vllm/tests/evals/gpt_oss/__init__.py
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
6
third_party/vllm/tests/evals/gpt_oss/configs/gpt-oss-20b-baseline.yaml
vendored
Normal file
6
third_party/vllm/tests/evals/gpt_oss/configs/gpt-oss-20b-baseline.yaml
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
model_name: "openai/gpt-oss-20b"
|
||||
metric_threshold: 0.568
|
||||
reasoning_effort: "low"
|
||||
server_args: "--tensor-parallel-size 2"
|
||||
8
third_party/vllm/tests/evals/gpt_oss/configs/gpt-oss-20b-flashinfer-mxfp4-bf16.yaml
vendored
Normal file
8
third_party/vllm/tests/evals/gpt_oss/configs/gpt-oss-20b-flashinfer-mxfp4-bf16.yaml
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
model_name: "openai/gpt-oss-20b"
|
||||
metric_threshold: 0.568
|
||||
reasoning_effort: "low"
|
||||
server_args: "--tensor-parallel-size 2"
|
||||
env:
|
||||
VLLM_USE_FLASHINFER_MOE_MXFP4_BF16: "1"
|
||||
8
third_party/vllm/tests/evals/gpt_oss/configs/gpt-oss-20b-flashinfer-mxfp4-mxfp8-cutlass.yaml
vendored
Normal file
8
third_party/vllm/tests/evals/gpt_oss/configs/gpt-oss-20b-flashinfer-mxfp4-mxfp8-cutlass.yaml
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
model_name: "openai/gpt-oss-20b"
|
||||
metric_threshold: 0.568
|
||||
reasoning_effort: "low"
|
||||
server_args: "--tensor-parallel-size 2"
|
||||
env:
|
||||
VLLM_USE_FLASHINFER_MOE_MXFP4_MXFP8_CUTLASS: "1"
|
||||
8
third_party/vllm/tests/evals/gpt_oss/configs/gpt-oss-20b-marlin.yaml
vendored
Normal file
8
third_party/vllm/tests/evals/gpt_oss/configs/gpt-oss-20b-marlin.yaml
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
model_name: "openai/gpt-oss-20b"
|
||||
metric_threshold: 0.568
|
||||
reasoning_effort: "low"
|
||||
server_args: "--tensor-parallel-size 2"
|
||||
env:
|
||||
VLLM_MXFP4_USE_MARLIN: "1"
|
||||
6
third_party/vllm/tests/evals/gpt_oss/configs/gpt-oss-20b-rocm-baseline.yaml
vendored
Normal file
6
third_party/vllm/tests/evals/gpt_oss/configs/gpt-oss-20b-rocm-baseline.yaml
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
model_name: openai/gpt-oss-20b
|
||||
metric_threshold: 0.568
|
||||
reasoning_effort: low
|
||||
server_args: "--attention-backend ROCM_AITER_UNIFIED_ATTN"
|
||||
8
third_party/vllm/tests/evals/gpt_oss/configs/gpt-oss-20b-sm100-fi-mxfp4-mxfp8-trtllm.yaml
vendored
Normal file
8
third_party/vllm/tests/evals/gpt_oss/configs/gpt-oss-20b-sm100-fi-mxfp4-mxfp8-trtllm.yaml
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
model_name: "openai/gpt-oss-20b"
|
||||
metric_threshold: 0.568
|
||||
reasoning_effort: "low"
|
||||
server_args: "--tensor-parallel-size 2"
|
||||
env:
|
||||
VLLM_USE_FLASHINFER_MOE_MXFP4_MXFP8: "1"
|
||||
5
third_party/vllm/tests/evals/gpt_oss/configs/models-b200.txt
vendored
Normal file
5
third_party/vllm/tests/evals/gpt_oss/configs/models-b200.txt
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
# B200 model configurations for GPQA evaluation
|
||||
# Tests different environment variable combinations
|
||||
gpt-oss-20b-flashinfer-mxfp4-bf16.yaml
|
||||
gpt-oss-20b-flashinfer-mxfp4-mxfp8-cutlass.yaml
|
||||
gpt-oss-20b-sm100-fi-mxfp4-mxfp8-trtllm.yaml
|
||||
3
third_party/vllm/tests/evals/gpt_oss/configs/models-gfx942.txt
vendored
Normal file
3
third_party/vllm/tests/evals/gpt_oss/configs/models-gfx942.txt
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# GFX942 model configurations for GPQA evaluation
|
||||
# Tests different environment variable combinations
|
||||
gpt-oss-20b-rocm-baseline.yaml
|
||||
3
third_party/vllm/tests/evals/gpt_oss/configs/models-gfx950.txt
vendored
Normal file
3
third_party/vllm/tests/evals/gpt_oss/configs/models-gfx950.txt
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# GFX950 model configurations for GPQA evaluation
|
||||
# Tests different environment variable combinations
|
||||
gpt-oss-20b-rocm-baseline.yaml
|
||||
5
third_party/vllm/tests/evals/gpt_oss/configs/models-h100.txt
vendored
Normal file
5
third_party/vllm/tests/evals/gpt_oss/configs/models-h100.txt
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
# H100 model configurations for GPQA evaluation
|
||||
# Tests different environment variable combinations
|
||||
gpt-oss-20b-baseline.yaml
|
||||
gpt-oss-20b-flashinfer-mxfp4-bf16.yaml
|
||||
gpt-oss-20b-marlin.yaml
|
||||
64
third_party/vllm/tests/evals/gpt_oss/conftest.py
vendored
Normal file
64
third_party/vllm/tests/evals/gpt_oss/conftest.py
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
"""
|
||||
Pytest configuration for GPT-OSS evaluation tests.
|
||||
"""
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def pytest_addoption(parser):
|
||||
"""Add custom command line options."""
|
||||
parser.addoption(
|
||||
"--config-list-file",
|
||||
required=True,
|
||||
help="File containing list of config files to test",
|
||||
)
|
||||
|
||||
|
||||
def pytest_generate_tests(metafunc):
|
||||
"""Generate test parameters from config files."""
|
||||
if "config_filename" in metafunc.fixturenames:
|
||||
config_list_file = metafunc.config.getoption("--config-list-file")
|
||||
|
||||
# Handle both relative and absolute paths
|
||||
config_list_path = Path(config_list_file)
|
||||
if not config_list_path.is_absolute():
|
||||
# If relative, try relative to test directory first
|
||||
test_dir_path = Path(__file__).parent / config_list_file
|
||||
if test_dir_path.exists():
|
||||
config_list_path = test_dir_path
|
||||
else:
|
||||
# Try relative to current working directory
|
||||
config_list_path = Path.cwd() / config_list_file
|
||||
|
||||
print(f"Looking for config list at: {config_list_path}")
|
||||
|
||||
config_files = []
|
||||
if config_list_path.exists():
|
||||
# Determine config directory (same directory as the list file)
|
||||
config_dir = config_list_path.parent
|
||||
|
||||
with open(config_list_path) as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line and not line.startswith("#"):
|
||||
config_path = config_dir / line
|
||||
print(f"Checking config file: {config_path}")
|
||||
if config_path.exists():
|
||||
config_files.append(config_path)
|
||||
print(f" Found: {config_path}")
|
||||
else:
|
||||
print(f" Missing: {config_path}")
|
||||
else:
|
||||
print(f"Config list file not found: {config_list_path}")
|
||||
|
||||
# Generate test parameters
|
||||
if config_files:
|
||||
metafunc.parametrize(
|
||||
"config_filename",
|
||||
config_files,
|
||||
ids=[config_file.stem for config_file in config_files],
|
||||
)
|
||||
else:
|
||||
print("No config files found, test will be skipped")
|
||||
172
third_party/vllm/tests/evals/gpt_oss/test_gpqa_correctness.py
vendored
Normal file
172
third_party/vllm/tests/evals/gpt_oss/test_gpqa_correctness.py
vendored
Normal file
@@ -0,0 +1,172 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
"""
|
||||
GPQA evaluation using vLLM server and GPT-OSS evaluation package.
|
||||
|
||||
Usage:
|
||||
pytest -s -v tests/evals/gpt_oss/test_gpqa_correctness.py \
|
||||
--config-list-file=configs/models-h200.txt
|
||||
"""
|
||||
|
||||
import os
|
||||
import shlex
|
||||
import subprocess
|
||||
import sys
|
||||
import urllib.request
|
||||
from pathlib import Path
|
||||
|
||||
import regex as re
|
||||
import yaml
|
||||
|
||||
from tests.utils import RemoteOpenAIServer
|
||||
|
||||
TOL = 0.05 # Absolute tolerance for accuracy comparison
|
||||
|
||||
# Path to tiktoken encoding files
|
||||
TIKTOKEN_DATA_DIR = Path(__file__).parent / "data"
|
||||
|
||||
# Tiktoken encoding files to download
|
||||
TIKTOKEN_FILES = {
|
||||
"cl100k_base.tiktoken": "https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken",
|
||||
"o200k_base.tiktoken": "https://openaipublic.blob.core.windows.net/encodings/o200k_base.tiktoken",
|
||||
}
|
||||
|
||||
|
||||
def ensure_tiktoken_files():
|
||||
"""Download tiktoken encoding files if they don't exist."""
|
||||
TIKTOKEN_DATA_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
for filename, url in TIKTOKEN_FILES.items():
|
||||
filepath = TIKTOKEN_DATA_DIR / filename
|
||||
if not filepath.exists():
|
||||
print(f"Downloading {filename} from {url}...")
|
||||
urllib.request.urlretrieve(url, filepath)
|
||||
print(f" Downloaded to {filepath}")
|
||||
else:
|
||||
print(f" {filename} already exists.")
|
||||
|
||||
|
||||
def run_gpqa_eval(model_name: str, base_url: str, reasoning_effort: str) -> float:
|
||||
"""Run GPQA evaluation using the gpt-oss evaluation package."""
|
||||
|
||||
# Build the command to run the evaluation
|
||||
cmd = [
|
||||
sys.executable,
|
||||
"-m",
|
||||
"gpt_oss.evals",
|
||||
"--eval",
|
||||
"gpqa",
|
||||
"--model",
|
||||
model_name,
|
||||
"--reasoning-effort",
|
||||
reasoning_effort,
|
||||
"--base-url",
|
||||
base_url,
|
||||
"--n-threads",
|
||||
"200",
|
||||
]
|
||||
|
||||
try:
|
||||
# Set up environment for the evaluation subprocess
|
||||
# Inherit current environment and add required variables
|
||||
eval_env = os.environ.copy()
|
||||
eval_env["OPENAI_API_KEY"] = "dummy"
|
||||
|
||||
# Run the evaluation
|
||||
result = subprocess.run(
|
||||
cmd,
|
||||
text=True,
|
||||
capture_output=True,
|
||||
timeout=1800, # 30 minute timeout
|
||||
env=eval_env,
|
||||
)
|
||||
|
||||
print("Evaluation process stdout:\n", result.stdout)
|
||||
print("Evaluation process stderr:\n", result.stderr)
|
||||
print(f"Evaluation process return code: {result.returncode}")
|
||||
|
||||
if result.returncode != 0:
|
||||
raise RuntimeError(
|
||||
f"Evaluation failed with exit code {result.returncode}:\n"
|
||||
f"stdout: {result.stdout}\nstderr: {result.stderr}"
|
||||
)
|
||||
|
||||
# Parse the output to extract the score
|
||||
match = re.search(r"'metric':\s*([\d.]+)", result.stdout)
|
||||
if match:
|
||||
return float(match.group(1))
|
||||
|
||||
# If we still can't find it, raise an error
|
||||
raise ValueError(
|
||||
f"Could not parse score from evaluation output:\n{result.stdout}"
|
||||
)
|
||||
|
||||
except subprocess.TimeoutExpired as e:
|
||||
raise RuntimeError("Evaluation timed out") from e
|
||||
|
||||
|
||||
def test_gpqa_correctness(config_filename):
|
||||
"""Test GPQA correctness for a given model configuration."""
|
||||
# Ensure tiktoken files are downloaded
|
||||
ensure_tiktoken_files()
|
||||
|
||||
# Verify tiktoken files exist
|
||||
for filename in TIKTOKEN_FILES:
|
||||
filepath = TIKTOKEN_DATA_DIR / filename
|
||||
assert filepath.exists(), f"Tiktoken file not found: {filepath}"
|
||||
|
||||
eval_config = yaml.safe_load(config_filename.read_text(encoding="utf-8"))
|
||||
|
||||
# Parse server arguments from config (use shlex to handle quoted strings)
|
||||
server_args_str = eval_config.get("server_args", "")
|
||||
server_args = shlex.split(server_args_str) if server_args_str else []
|
||||
|
||||
# Add standard server arguments
|
||||
server_args.extend(
|
||||
[
|
||||
"--trust-remote-code",
|
||||
"--enforce-eager",
|
||||
"--disable-uvicorn-access-log",
|
||||
]
|
||||
)
|
||||
|
||||
# Build server environment with tiktoken path and any config-specified vars
|
||||
server_env = {"TIKTOKEN_ENCODINGS_BASE": str(TIKTOKEN_DATA_DIR)}
|
||||
if eval_config.get("env"):
|
||||
server_env.update(eval_config["env"])
|
||||
|
||||
reasoning_effort = eval_config.get("reasoning_effort", "low")
|
||||
|
||||
print(f"Starting GPQA evaluation for model: {eval_config['model_name']}")
|
||||
print(f"Expected metric threshold: {eval_config['metric_threshold']}")
|
||||
print(f"Reasoning effort: {reasoning_effort}")
|
||||
print(f"Server args: {' '.join(server_args)}")
|
||||
print(f"Server environment variables: {server_env}")
|
||||
|
||||
# Launch server and run evaluation
|
||||
with RemoteOpenAIServer(
|
||||
eval_config["model_name"],
|
||||
server_args,
|
||||
env_dict=server_env,
|
||||
max_wait_seconds=eval_config.get("startup_max_wait_seconds", 1800),
|
||||
) as remote_server:
|
||||
base_url = remote_server.url_for("v1")
|
||||
print(f"Server started at: {base_url}")
|
||||
|
||||
measured_metric = run_gpqa_eval(
|
||||
eval_config["model_name"], base_url, reasoning_effort
|
||||
)
|
||||
expected_metric = eval_config["metric_threshold"]
|
||||
|
||||
print(f"GPQA Results for {eval_config['model_name']}:")
|
||||
print(f" Measured metric: {measured_metric:.4f}")
|
||||
print(f" Expected metric: {expected_metric:.4f}")
|
||||
print(f" Tolerance: {TOL:.4f}")
|
||||
|
||||
# Verify metric is within tolerance
|
||||
assert measured_metric >= expected_metric - TOL, (
|
||||
f"GPQA metric too low: {measured_metric:.4f} < "
|
||||
f"{expected_metric:.4f} - {TOL:.4f} = {expected_metric - TOL:.4f}"
|
||||
)
|
||||
|
||||
print(f"GPQA test passed for {eval_config['model_name']}")
|
||||
40
third_party/vllm/tests/evals/gsm8k/README.md
vendored
Normal file
40
third_party/vllm/tests/evals/gsm8k/README.md
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
# GSM8K Accuracy Evaluation
|
||||
|
||||
This directory contains a replacement for the lm-eval-harness GSM8K evaluation, using an isolated GSM8K script and vLLM server for better performance and control.
|
||||
|
||||
## Usage
|
||||
|
||||
### Run tests with pytest (like buildkite)
|
||||
|
||||
```bash
|
||||
pytest -s -v tests/evals/gsm8k/test_gsm8k_correctness.py \
|
||||
--config-list-file=configs/models-small.txt
|
||||
```
|
||||
|
||||
### Run standalone evaluation script
|
||||
|
||||
```bash
|
||||
# Start vLLM server first
|
||||
vllm serve Qwen/Qwen2.5-1.5B-Instruct --port 8000
|
||||
|
||||
# Run evaluation
|
||||
python tests/evals/gsm8k/gsm8k_eval.py --port 8000
|
||||
```
|
||||
|
||||
## Configuration Format
|
||||
|
||||
Model configs in `configs/` directory use this YAML format:
|
||||
|
||||
```yaml
|
||||
model_name: "Qwen/Qwen2.5-1.5B-Instruct"
|
||||
accuracy_threshold: 0.54 # Minimum expected accuracy
|
||||
num_questions: 1319 # Number of questions (default: full test set)
|
||||
num_fewshot: 5 # Few-shot examples from train set
|
||||
server_args: "--max-model-len 4096 --tensor-parallel-size 2" # Server arguments
|
||||
env: # Environment variables (optional)
|
||||
VLLM_USE_FLASHINFER_MOE_FP4: "1"
|
||||
```
|
||||
|
||||
The `server_args` field accepts any arguments that can be passed to `vllm serve`.
|
||||
|
||||
The `env` field accepts a dictionary of environment variables to set for the server process.
|
||||
2
third_party/vllm/tests/evals/gsm8k/__init__.py
vendored
Normal file
2
third_party/vllm/tests/evals/gsm8k/__init__.py
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
11
third_party/vllm/tests/evals/gsm8k/configs/DeepSeek-R1-DP.yaml
vendored
Normal file
11
third_party/vllm/tests/evals/gsm8k/configs/DeepSeek-R1-DP.yaml
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
model_name: "deepseek-ai/DeepSeek-R1"
|
||||
accuracy_threshold: 0.95
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
startup_max_wait_seconds: 1200
|
||||
server_args: >-
|
||||
--enforce-eager
|
||||
--max-model-len 4096
|
||||
--data-parallel-size 8
|
||||
--enable-expert-parallel
|
||||
--speculative-config '{"method":"mtp","num_speculative_tokens":3}'
|
||||
11
third_party/vllm/tests/evals/gsm8k/configs/DeepSeek-R1-TP.yaml
vendored
Normal file
11
third_party/vllm/tests/evals/gsm8k/configs/DeepSeek-R1-TP.yaml
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
model_name: "deepseek-ai/DeepSeek-R1"
|
||||
accuracy_threshold: 0.95
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
startup_max_wait_seconds: 1200
|
||||
server_args: >-
|
||||
--enforce-eager
|
||||
--max-model-len 4096
|
||||
--tensor-parallel-size 8
|
||||
--enable-expert-parallel
|
||||
--speculative-config '{"method":"mtp","num_speculative_tokens":3}'
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/DeepSeek-V2-Lite-Instruct-FP8.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/DeepSeek-V2-Lite-Instruct-FP8.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: "RedHatAI/DeepSeek-Coder-V2-Lite-Instruct-FP8"
|
||||
accuracy_threshold: 0.72
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 4096"
|
||||
11
third_party/vllm/tests/evals/gsm8k/configs/DeepSeek-V3.2-DP.yaml
vendored
Normal file
11
third_party/vllm/tests/evals/gsm8k/configs/DeepSeek-V3.2-DP.yaml
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
model_name: "deepseek-ai/DeepSeek-V3.2"
|
||||
accuracy_threshold: 0.95
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
startup_max_wait_seconds: 1200
|
||||
server_args: >-
|
||||
--enforce-eager
|
||||
--max-model-len 4096
|
||||
--data-parallel-size 8
|
||||
--enable-expert-parallel
|
||||
--speculative-config '{"method":"mtp","num_speculative_tokens":3}'
|
||||
11
third_party/vllm/tests/evals/gsm8k/configs/DeepSeek-V3.2-TP.yaml
vendored
Normal file
11
third_party/vllm/tests/evals/gsm8k/configs/DeepSeek-V3.2-TP.yaml
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
model_name: "deepseek-ai/DeepSeek-V3.2"
|
||||
accuracy_threshold: 0.95
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
startup_max_wait_seconds: 1200
|
||||
server_args: >-
|
||||
--enforce-eager
|
||||
--max-model-len 4096
|
||||
--tensor-parallel-size 8
|
||||
--enable-expert-parallel
|
||||
--speculative-config '{"method":"mtp","num_speculative_tokens":3}'
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/Llama-3-8B-Instruct-nonuniform-CT.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/Llama-3-8B-Instruct-nonuniform-CT.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: "nm-testing/Meta-Llama-3-8B-Instruct-nonuniform-test"
|
||||
accuracy_threshold: 0.74
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 4096"
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/Llama-3.2-1B-Instruct-INT8-CT.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/Llama-3.2-1B-Instruct-INT8-CT.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: "RedHatAI/Llama-3.2-1B-Instruct-quantized.w8a8"
|
||||
accuracy_threshold: 0.31
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 4096"
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/Qwen1.5-MoE-W4A16-CT.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/Qwen1.5-MoE-W4A16-CT.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: "nm-testing/Qwen1.5-MoE-A2.7B-Chat-quantized.w4a16"
|
||||
accuracy_threshold: 0.45
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 4096"
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/Qwen2.5-VL-3B-Instruct-FP8-dynamic.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/Qwen2.5-VL-3B-Instruct-FP8-dynamic.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: "RedHatAI/Qwen2.5-VL-3B-Instruct-FP8-Dynamic"
|
||||
accuracy_threshold: 0.60
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 4096"
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/Qwen3-0.6B-FP8.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/Qwen3-0.6B-FP8.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: "Qwen/Qwen3-0.6B-FP8"
|
||||
accuracy_threshold: 0.375
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 4096"
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/Qwen3-30B-A3B-MXFP4A16.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/Qwen3-30B-A3B-MXFP4A16.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: nm-testing/Qwen3-30B-A3B-MXFP4A16
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 4096"
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/Qwen3-30B-A3B-NVFP4.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/Qwen3-30B-A3B-NVFP4.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: "nvidia/Qwen3-30B-A3B-FP4"
|
||||
accuracy_threshold: 0.89
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 4096"
|
||||
11
third_party/vllm/tests/evals/gsm8k/configs/Qwen3-Next-80B-A3B-NVFP4-EP2.yaml
vendored
Normal file
11
third_party/vllm/tests/evals/gsm8k/configs/Qwen3-Next-80B-A3B-NVFP4-EP2.yaml
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
model_name: "nm-testing/Qwen3-Next-80B-A3B-Instruct-NVFP4"
|
||||
accuracy_threshold: 0.75
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: >-
|
||||
--enforce-eager
|
||||
--max-model-len 4096
|
||||
--tensor-parallel-size 2
|
||||
--enable-expert-parallel
|
||||
--speculative-config '{"method":"qwen3_next_mtp","num_speculative_tokens":1}'
|
||||
--moe-backend=flashinfer_trtllm
|
||||
10
third_party/vllm/tests/evals/gsm8k/configs/Qwen3-Next-FP8-EP2.yaml
vendored
Normal file
10
third_party/vllm/tests/evals/gsm8k/configs/Qwen3-Next-FP8-EP2.yaml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
model_name: "Qwen/Qwen3-Next-80B-A3B-Instruct-FP8"
|
||||
accuracy_threshold: 0.85
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: >-
|
||||
--max-model-len 4096
|
||||
--tensor-parallel-size 2
|
||||
--enable-expert-parallel
|
||||
--async-scheduling
|
||||
--moe-backend=flashinfer_trtllm
|
||||
9
third_party/vllm/tests/evals/gsm8k/configs/Qwen3-Next-FP8-EP2_MI355.yaml
vendored
Normal file
9
third_party/vllm/tests/evals/gsm8k/configs/Qwen3-Next-FP8-EP2_MI355.yaml
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
model_name: "Qwen/Qwen3-Next-80B-A3B-Instruct-FP8"
|
||||
accuracy_threshold: 0.85
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: >-
|
||||
--max-model-len 4096
|
||||
--tensor-parallel-size 2
|
||||
--enable-expert-parallel
|
||||
--async-scheduling
|
||||
9
third_party/vllm/tests/evals/gsm8k/configs/Qwen3.5-35B-A3B-DEP2.yaml
vendored
Normal file
9
third_party/vllm/tests/evals/gsm8k/configs/Qwen3.5-35B-A3B-DEP2.yaml
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
model_name: "Qwen/Qwen3.5-35B-A3B"
|
||||
accuracy_threshold: 0.84
|
||||
tolerance: 0.03
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: >-
|
||||
--max-model-len 4096
|
||||
--data-parallel-size 2
|
||||
--enable-expert-parallel
|
||||
10
third_party/vllm/tests/evals/gsm8k/configs/Qwen3.5-35B-A3B-FP8-DEP2.yaml
vendored
Normal file
10
third_party/vllm/tests/evals/gsm8k/configs/Qwen3.5-35B-A3B-FP8-DEP2.yaml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
model_name: "Qwen/Qwen3.5-35B-A3B-FP8"
|
||||
accuracy_threshold: 0.79
|
||||
tolerance: 0.03
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: >-
|
||||
--max-model-len 4096
|
||||
--data-parallel-size 2
|
||||
--enable-expert-parallel
|
||||
--kv-cache-dtype fp8
|
||||
9
third_party/vllm/tests/evals/gsm8k/configs/Qwen3.5-397B-A17B-NVFP4-DEP2.yaml
vendored
Normal file
9
third_party/vllm/tests/evals/gsm8k/configs/Qwen3.5-397B-A17B-NVFP4-DEP2.yaml
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
model_name: "nvidia/Qwen3.5-397B-A17B-NVFP4"
|
||||
accuracy_threshold: 0.88
|
||||
tolerance: 0.03
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: >-
|
||||
--max-model-len 4096
|
||||
--data-parallel-size 2
|
||||
--enable-expert-parallel
|
||||
7
third_party/vllm/tests/evals/gsm8k/configs/models-blackwell.txt
vendored
Normal file
7
third_party/vllm/tests/evals/gsm8k/configs/models-blackwell.txt
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
Qwen3-0.6B-FP8.yaml
|
||||
Qwen2.5-VL-3B-Instruct-FP8-dynamic.yaml
|
||||
Qwen1.5-MoE-W4A16-CT.yaml
|
||||
DeepSeek-V2-Lite-Instruct-FP8.yaml
|
||||
Qwen3-30B-A3B-NVFP4.yaml
|
||||
Qwen3-Next-80B-A3B-NVFP4-EP2.yaml
|
||||
Qwen3-Next-FP8-EP2.yaml
|
||||
4
third_party/vllm/tests/evals/gsm8k/configs/models-h200.txt
vendored
Normal file
4
third_party/vllm/tests/evals/gsm8k/configs/models-h200.txt
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
DeepSeek-R1-TP.yaml
|
||||
DeepSeek-R1-DP.yaml
|
||||
DeepSeek-V3.2-TP.yaml
|
||||
DeepSeek-V3.2-DP.yaml
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/models-mi355.txt
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/models-mi355.txt
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
Qwen3-0.6B-FP8.yaml
|
||||
Qwen2.5-VL-3B-Instruct-FP8-dynamic.yaml
|
||||
Qwen1.5-MoE-W4A16-CT.yaml
|
||||
DeepSeek-V2-Lite-Instruct-FP8.yaml
|
||||
Qwen3-Next-FP8-EP2_MI355.yaml
|
||||
3
third_party/vllm/tests/evals/gsm8k/configs/models-qwen35-blackwell.txt
vendored
Normal file
3
third_party/vllm/tests/evals/gsm8k/configs/models-qwen35-blackwell.txt
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
Qwen3.5-35B-A3B-DEP2.yaml
|
||||
Qwen3.5-35B-A3B-FP8-DEP2.yaml
|
||||
Qwen3.5-397B-A17B-NVFP4-DEP2.yaml
|
||||
7
third_party/vllm/tests/evals/gsm8k/configs/models-small.txt
vendored
Normal file
7
third_party/vllm/tests/evals/gsm8k/configs/models-small.txt
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
Qwen3-0.6B-FP8.yaml
|
||||
Llama-3.2-1B-Instruct-INT8-CT.yaml
|
||||
Llama-3-8B-Instruct-nonuniform-CT.yaml
|
||||
Qwen2.5-VL-3B-Instruct-FP8-dynamic.yaml
|
||||
Qwen1.5-MoE-W4A16-CT.yaml
|
||||
DeepSeek-V2-Lite-Instruct-FP8.yaml
|
||||
Qwen3-30B-A3B-MXFP4A16.yaml
|
||||
@@ -0,0 +1,7 @@
|
||||
model_name: "nvidia/Llama-4-Scout-17B-16E-Instruct-FP8"
|
||||
accuracy_threshold: 0.92
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --data-parallel-size 2 --enable-expert-parallel --moe-backend=triton"
|
||||
env:
|
||||
VLLM_USE_DEEP_GEMM: "0"
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor-dp-ep/Qwen3-30B-A3B-BF16-triton.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor-dp-ep/Qwen3-30B-A3B-BF16-triton.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: "Qwen/Qwen3-30B-A3B"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --data-parallel-size 2 --enable-expert-parallel"
|
||||
@@ -0,0 +1,8 @@
|
||||
model_name: "Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --data-parallel-size 2 --enable-expert-parallel --all2all-backend deepep_high_throughput"
|
||||
env:
|
||||
VLLM_USE_DEEP_GEMM: "1"
|
||||
VLLM_USE_DEEP_GEMM_MOE: "1"
|
||||
@@ -0,0 +1,8 @@
|
||||
model_name: "Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --data-parallel-size 2 --enable-expert-parallel --all2all-backend deepep_low_latency --disable-uvicorn-access-log"
|
||||
env:
|
||||
VLLM_USE_DEEP_GEMM: "1"
|
||||
VLLM_USE_DEEP_GEMM_MOE: "1"
|
||||
@@ -0,0 +1,8 @@
|
||||
model_name: "Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --data-parallel-size 2 --enable-expert-parallel"
|
||||
env:
|
||||
VLLM_USE_DEEP_GEMM: "1"
|
||||
VLLM_USE_DEEP_GEMM_MOE: "1"
|
||||
@@ -0,0 +1,8 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-FP8-block"
|
||||
accuracy_threshold: 0.85
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --data-parallel-size 2 --enable-expert-parallel --all2all-backend deepep_high_throughput"
|
||||
env:
|
||||
VLLM_USE_DEEP_GEMM: "1"
|
||||
VLLM_USE_DEEP_GEMM_MOE: "1"
|
||||
@@ -0,0 +1,8 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-FP8-block"
|
||||
accuracy_threshold: 0.85
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --data-parallel-size 2 --enable-expert-parallel --all2all-backend deepep_low_latency --disable-uvicorn-access-log"
|
||||
env:
|
||||
VLLM_USE_DEEP_GEMM: "1"
|
||||
VLLM_USE_DEEP_GEMM_MOE: "1"
|
||||
@@ -0,0 +1,8 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-FP8-block"
|
||||
accuracy_threshold: 0.85
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --data-parallel-size 2 --enable-expert-parallel"
|
||||
env:
|
||||
VLLM_USE_DEEP_GEMM: "1"
|
||||
VLLM_USE_DEEP_GEMM_MOE: "1"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-NVFP4"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --data-parallel-size 2 --enable-expert-parallel --all2all-backend deepep_low_latency --moe-backend=flashinfer_cutedsl"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-NVFP4"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --data-parallel-size 2 --enable-expert-parallel --moe-backend=flashinfer_cutlass"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "nvidia/Qwen3-30B-A3B-NVFP4"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --data-parallel-size 2 --enable-expert-parallel --all2all-backend deepep_low_latency --moe-backend=flashinfer_cutedsl"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "nvidia/Qwen3-30B-A3B-NVFP4"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --data-parallel-size 2 --enable-expert-parallel --moe-backend=flashinfer_cutlass"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "nvidia/Qwen3-30B-A3B-NVFP4"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --data-parallel-size 2 --enable-expert-parallel --moe-backend=flashinfer_trtllm"
|
||||
12
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor-dp-ep/config-b200.txt
vendored
Normal file
12
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor-dp-ep/config-b200.txt
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
Qwen3-30B-A3B-NvFp4-CT-fi-cutedsl-deepep-ll.yaml
|
||||
Qwen3-30B-A3B-NvFp4-ModelOpt-fi-cutedsl-deepep-ll.yaml
|
||||
Qwen3-30B-A3B-NvFp4-CT-fi-cutlass.yaml
|
||||
Qwen3-30B-A3B-NvFp4-ModelOpt-fi-trtllm.yaml
|
||||
Qwen3-30B-A3B-NvFp4-ModelOpt-fi-cutlass.yaml
|
||||
Qwen3-30B-A3B-Fp8-AutoFp8-deepgemm-deepep-ht.yaml
|
||||
Qwen3-30B-A3B-Fp8-AutoFp8-deepgemm-deepep-ll.yaml
|
||||
Qwen3-30B-A3B-Fp8-AutoFp8-deepgemm.yaml
|
||||
Qwen3-30B-A3B-Fp8-CT-Block-deepgemm-deepep-ht.yaml
|
||||
Qwen3-30B-A3B-Fp8-CT-Block-deepgemm-deepep-ll.yaml
|
||||
Qwen3-30B-A3B-Fp8-CT-Block-deepgemm.yaml
|
||||
Qwen3-30B-A3B-BF16-triton.yaml
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Llama-4-Scout-BF16-fi-cutlass.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Llama-4-Scout-BF16-fi-cutlass.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: "meta-llama/Llama-4-Scout-17B-16E-Instruct"
|
||||
accuracy_threshold: 0.92
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --enable-expert-parallel --moe-backend=flashinfer_cutlass"
|
||||
6
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Llama-4-Scout-BF16-triton.yaml
vendored
Normal file
6
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Llama-4-Scout-BF16-triton.yaml
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
model_name: "meta-llama/Llama-4-Scout-17B-16E-Instruct"
|
||||
accuracy_threshold: 0.92
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2"
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "RedHatAI/Llama-4-Scout-17B-16E-Instruct-FP8-dynamic"
|
||||
accuracy_threshold: 0.92
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "nvidia/Llama-4-Scout-17B-16E-Instruct-FP8"
|
||||
accuracy_threshold: 0.92
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=flashinfer_cutlass"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "nvidia/Llama-4-Scout-17B-16E-Instruct-FP8"
|
||||
accuracy_threshold: 0.92
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=flashinfer_trtllm"
|
||||
@@ -0,0 +1,7 @@
|
||||
model_name: "nvidia/Llama-4-Scout-17B-16E-Instruct-FP8"
|
||||
accuracy_threshold: 0.92
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2"
|
||||
env:
|
||||
VLLM_TEST_FORCE_FP8_MARLIN: "1"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "nvidia/Llama-4-Scout-17B-16E-Instruct-FP8"
|
||||
accuracy_threshold: 0.92
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=triton"
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Mixtral-8x7B-BF16-fi-cutlass.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Mixtral-8x7B-BF16-fi-cutlass.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: "mistralai/Mixtral-8x7B-v0.1"
|
||||
accuracy_threshold: 0.58
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --enable-expert-parallel --moe-backend=flashinfer_cutlass"
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Mixtral-8x7B-BF16-triton.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Mixtral-8x7B-BF16-triton.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: "mistralai/Mixtral-8x7B-v0.1"
|
||||
accuracy_threshold: 0.58
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2"
|
||||
@@ -0,0 +1,6 @@
|
||||
# TODO(rob): enable
|
||||
# model_name: "amd/Mixtral-8x7B-Instruct-v0.1-FP8-KV"
|
||||
# accuracy_threshold: 0.62
|
||||
# num_questions: 1319
|
||||
# num_fewshot: 5
|
||||
# server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=flashinfer_cutlass"
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Mixtral-8x7B-Fp8-AutoFp8-triton.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Mixtral-8x7B-Fp8-AutoFp8-triton.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: "amd/Mixtral-8x7B-Instruct-v0.1-FP8-KV"
|
||||
accuracy_threshold: 0.62
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-FP8"
|
||||
accuracy_threshold: 0.29
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=flashinfer_trtllm"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-NVFP4"
|
||||
accuracy_threshold: 0.29
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=flashinfer_cutlass"
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Qwen3-30B-A3B-BF16-fi-cutlass.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Qwen3-30B-A3B-BF16-fi-cutlass.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: "Qwen/Qwen3-30B-A3B"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --enable-expert-parallel --moe-backend=flashinfer_cutlass"
|
||||
5
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Qwen3-30B-A3B-BF16-triton.yaml
vendored
Normal file
5
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Qwen3-30B-A3B-BF16-triton.yaml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
model_name: "Qwen/Qwen3-30B-A3B"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2"
|
||||
@@ -0,0 +1,8 @@
|
||||
model_name: "Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2"
|
||||
env:
|
||||
VLLM_USE_DEEP_GEMM: "1"
|
||||
VLLM_USE_DEEP_GEMM_MOE: "1"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=flashinfer_cutlass"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=flashinfer_trtllm"
|
||||
@@ -0,0 +1,7 @@
|
||||
model_name: "Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2"
|
||||
env:
|
||||
VLLM_TEST_FORCE_FP8_MARLIN: "1"
|
||||
@@ -0,0 +1,7 @@
|
||||
model_name: "Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=triton"
|
||||
env:
|
||||
VLLM_USE_DEEP_GEMM: "0"
|
||||
@@ -0,0 +1,8 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-FP8-block"
|
||||
accuracy_threshold: 0.85
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2"
|
||||
env:
|
||||
VLLM_USE_DEEP_GEMM: "1"
|
||||
VLLM_USE_DEEP_GEMM_MOE: "1"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-FP8-block"
|
||||
accuracy_threshold: 0.85
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=flashinfer_cutlass"
|
||||
@@ -0,0 +1,7 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-FP8-block"
|
||||
accuracy_threshold: 0.85
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2"
|
||||
env:
|
||||
VLLM_TEST_FORCE_FP8_MARLIN: "1"
|
||||
@@ -0,0 +1,7 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-FP8-block"
|
||||
accuracy_threshold: 0.85
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=triton"
|
||||
env:
|
||||
VLLM_USE_DEEP_GEMM: "0"
|
||||
@@ -0,0 +1,7 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-FP8-dynamic"
|
||||
accuracy_threshold: 0.85
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2"
|
||||
env:
|
||||
VLLM_TEST_FORCE_FP8_MARLIN: "1"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-FP8-dynamic"
|
||||
accuracy_threshold: 0.85
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-NVFP4"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=flashinfer_cutlass"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-NVFP4"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=flashinfer_trtllm"
|
||||
7
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Qwen3-30B-A3B-NvFp4-CT-marlin.yaml
vendored
Normal file
7
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/Qwen3-30B-A3B-NvFp4-CT-marlin.yaml
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-NVFP4"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2"
|
||||
env:
|
||||
VLLM_TEST_FORCE_FP8_MARLIN: "1"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "RedHatAI/Qwen3-30B-A3B-NVFP4"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=cutlass"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "nvidia/Qwen3-30B-A3B-NVFP4"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=flashinfer_cutlass"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "nvidia/Qwen3-30B-A3B-NVFP4"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=flashinfer_trtllm"
|
||||
@@ -0,0 +1,7 @@
|
||||
model_name: "nvidia/Qwen3-30B-A3B-NVFP4"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2"
|
||||
env:
|
||||
VLLM_TEST_FORCE_FP8_MARLIN: "1"
|
||||
@@ -0,0 +1,5 @@
|
||||
model_name: "nvidia/Qwen3-30B-A3B-NVFP4"
|
||||
accuracy_threshold: 0.88
|
||||
num_questions: 1319
|
||||
num_fewshot: 5
|
||||
server_args: "--enforce-eager --max-model-len 8192 --tensor-parallel-size 2 --moe-backend=cutlass"
|
||||
17
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/config-b200.txt
vendored
Normal file
17
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/config-b200.txt
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
Llama-4-Scout-Fp8-CT-vllm-cutlass.yaml
|
||||
Llama-4-Scout-Fp8-ModelOpt-fi-trtllm.yaml
|
||||
Qwen3-30B-A3B-Fp8-AutoFp8-fi-trtllm.yaml
|
||||
Qwen3-30B-A3B-NvFp4-CT-vllm-cutlass.yaml
|
||||
Qwen3-30B-A3B-NvFp4-CT-marlin.yaml
|
||||
Qwen3-30B-A3B-NvFp4-CT-fi-trtllm.yaml
|
||||
Qwen3-30B-A3B-NvFp4-CT-fi-cutlass.yaml
|
||||
Qwen3-30B-A3B-NvFp4-ModelOpt-vllm-cutlass.yaml
|
||||
Qwen3-30B-A3B-NvFp4-ModelOpt-marlin.yaml
|
||||
Qwen3-30B-A3B-NvFp4-ModelOpt-fi-trtllm.yaml
|
||||
Qwen3-30B-A3B-NvFp4-ModelOpt-fi-cutlass.yaml
|
||||
Llama-4-Scout-BF16-fi-cutlass.yaml
|
||||
Llama-4-Scout-BF16-triton.yaml
|
||||
Mixtral-8x7B-BF16-fi-cutlass.yaml
|
||||
Mixtral-8x7B-BF16-triton.yaml
|
||||
Nemotron-Nano-30B-Fp8-ModelOpt-fi-trtllm.yaml
|
||||
Nemotron-Nano-30B-NvFp4-ModelOpt-fi-cutlass.yaml
|
||||
12
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/config-h100.txt
vendored
Normal file
12
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/config-h100.txt
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
Mixtral-8x7B-Fp8-AutoFp8-triton.yaml
|
||||
Qwen3-30B-A3B-Fp8-AutoFp8-deepgemm.yaml
|
||||
Qwen3-30B-A3B-Fp8-AutoFp8-fi-cutlass.yaml
|
||||
Qwen3-30B-A3B-Fp8-AutoFp8-marlin.yaml
|
||||
Qwen3-30B-A3B-Fp8-AutoFp8-triton.yaml
|
||||
Qwen3-30B-A3B-Fp8-CT-Block-deepgemm.yaml
|
||||
Qwen3-30B-A3B-Fp8-CT-Block-marlin.yaml
|
||||
Qwen3-30B-A3B-Fp8-CT-Block-triton.yaml
|
||||
Qwen3-30B-A3B-Fp8-CT-Channel-marlin.yaml
|
||||
Qwen3-30B-A3B-Fp8-CT-Channel-vllm-cutlass.yaml
|
||||
Qwen3-30B-A3B-BF16-fi-cutlass.yaml
|
||||
Qwen3-30B-A3B-BF16-triton.yaml
|
||||
1
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/config-test.txt
vendored
Normal file
1
third_party/vllm/tests/evals/gsm8k/configs/moe-refactor/config-test.txt
vendored
Normal file
@@ -0,0 +1 @@
|
||||
Qwen3-30B-A3B-NvFp4-CT-marlin.yaml
|
||||
61
third_party/vllm/tests/evals/gsm8k/conftest.py
vendored
Normal file
61
third_party/vllm/tests/evals/gsm8k/conftest.py
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def pytest_addoption(parser):
|
||||
"""Add custom command line options."""
|
||||
parser.addoption(
|
||||
"--config-list-file",
|
||||
default="configs/models-small.txt",
|
||||
help="File containing list of config files to test",
|
||||
)
|
||||
|
||||
|
||||
def pytest_generate_tests(metafunc):
|
||||
"""Generate test parameters from config files."""
|
||||
if "config_filename" in metafunc.fixturenames:
|
||||
config_list_file = metafunc.config.getoption("--config-list-file")
|
||||
|
||||
# Handle both relative and absolute paths
|
||||
config_list_path = Path(config_list_file)
|
||||
if not config_list_path.is_absolute():
|
||||
# If relative, try relative to test directory first
|
||||
test_dir_path = Path(__file__).parent / config_list_file
|
||||
if test_dir_path.exists():
|
||||
config_list_path = test_dir_path
|
||||
else:
|
||||
# Try relative to current working directory
|
||||
config_list_path = Path.cwd() / config_list_file
|
||||
|
||||
print(f"Looking for config list at: {config_list_path}")
|
||||
|
||||
config_files = []
|
||||
if config_list_path.exists():
|
||||
# Determine config directory (same directory as the list file)
|
||||
config_dir = config_list_path.parent
|
||||
|
||||
with open(config_list_path) as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line and not line.startswith("#"):
|
||||
config_path = config_dir / line
|
||||
print(f"Checking config file: {config_path}")
|
||||
if config_path.exists():
|
||||
config_files.append(config_path)
|
||||
print(f" ✓ Found: {config_path}")
|
||||
else:
|
||||
print(f" ✗ Missing: {config_path}")
|
||||
else:
|
||||
print(f"Config list file not found: {config_list_path}")
|
||||
|
||||
# Generate test parameters
|
||||
if config_files:
|
||||
metafunc.parametrize(
|
||||
"config_filename",
|
||||
config_files,
|
||||
ids=[config_file.stem for config_file in config_files],
|
||||
)
|
||||
else:
|
||||
print("No config files found, test will be skipped")
|
||||
314
third_party/vllm/tests/evals/gsm8k/gsm8k_eval.py
vendored
Normal file
314
third_party/vllm/tests/evals/gsm8k/gsm8k_eval.py
vendored
Normal file
@@ -0,0 +1,314 @@
|
||||
#!/usr/bin/env python3
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
"""
|
||||
Isolated GSM8K evaluation script for vLLM serve endpoint.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import ast
|
||||
import asyncio
|
||||
import json
|
||||
import os
|
||||
import time
|
||||
from collections.abc import Generator
|
||||
|
||||
import aiohttp
|
||||
import numpy as np
|
||||
import regex as re
|
||||
import requests
|
||||
from tqdm.asyncio import tqdm
|
||||
|
||||
INVALID = -9999999
|
||||
|
||||
|
||||
def download_and_cache_file(url: str, filename: str | None = None) -> str:
|
||||
"""Download and cache a file from a URL."""
|
||||
if filename is None:
|
||||
filename = os.path.join("/tmp", url.split("/")[-1])
|
||||
|
||||
if os.path.exists(filename):
|
||||
return filename
|
||||
|
||||
print(f"Downloading from {url} to {filename}")
|
||||
response = requests.get(url, stream=True)
|
||||
response.raise_for_status()
|
||||
|
||||
with open(filename, "wb") as f:
|
||||
for chunk in response.iter_content(chunk_size=1024):
|
||||
f.write(chunk)
|
||||
|
||||
return filename
|
||||
|
||||
|
||||
def load_gsm8k_data() -> tuple[list[dict], list[dict]]:
|
||||
"""Load GSM8K train and test data"""
|
||||
train_url = "https://raw.githubusercontent.com/openai/grade-school-math/master/grade_school_math/data/train.jsonl"
|
||||
test_url = "https://raw.githubusercontent.com/openai/grade-school-math/master/grade_school_math/data/test.jsonl"
|
||||
|
||||
train_file = download_and_cache_file(train_url)
|
||||
test_file = download_and_cache_file(test_url)
|
||||
|
||||
train_data = list(read_jsonl(train_file))
|
||||
test_data = list(read_jsonl(test_file))
|
||||
|
||||
return train_data, test_data
|
||||
|
||||
|
||||
def read_jsonl(filename: str) -> Generator[dict, None, None]:
|
||||
"""Read a JSONL file."""
|
||||
with open(filename) as fin:
|
||||
for line in fin:
|
||||
if not line.startswith("#"):
|
||||
yield json.loads(line)
|
||||
|
||||
|
||||
def get_answer_value(answer_str: str) -> int:
|
||||
"""Extract the numerical answer from the response."""
|
||||
answer_str = answer_str.replace(",", "")
|
||||
numbers = re.findall(r"\d+", answer_str)
|
||||
if len(numbers) < 1:
|
||||
return INVALID
|
||||
try:
|
||||
return ast.literal_eval(numbers[-1])
|
||||
except SyntaxError:
|
||||
return INVALID
|
||||
|
||||
|
||||
async def call_vllm_api(
|
||||
session: aiohttp.ClientSession,
|
||||
prompt: str,
|
||||
temperature: float,
|
||||
max_tokens: int,
|
||||
stop: list[str] | None = None,
|
||||
url: str | None = None,
|
||||
seed: int | None = None,
|
||||
) -> tuple[str, int]:
|
||||
"""Call vLLM's OpenAI-compatible completions endpoint.
|
||||
|
||||
Returns:
|
||||
Tuple of (response_text, completion_tokens)
|
||||
"""
|
||||
data = {
|
||||
"prompt": prompt,
|
||||
"temperature": temperature,
|
||||
"max_tokens": max_tokens,
|
||||
"stop": stop,
|
||||
}
|
||||
if seed is not None:
|
||||
data["seed"] = seed
|
||||
|
||||
try:
|
||||
async with session.post(f"{url}/v1/completions", json=data) as response:
|
||||
response.raise_for_status()
|
||||
result = await response.json()
|
||||
text = result["choices"][0]["text"]
|
||||
completion_tokens = result.get("usage", {}).get("completion_tokens", 0)
|
||||
return text, completion_tokens
|
||||
except Exception as e:
|
||||
print(f"Error calling vLLM API: {e}")
|
||||
return "", 0
|
||||
|
||||
|
||||
def _build_gsm8k_prompts(
|
||||
num_questions: int = 1319,
|
||||
num_shots: int = 5,
|
||||
) -> tuple[list[str], list[int]]:
|
||||
"""Build few-shot GSM8K completion prompts and ground-truth labels."""
|
||||
if num_questions == 0:
|
||||
return [], []
|
||||
train_data, test_data = load_gsm8k_data()
|
||||
num_questions = min(num_questions, len(test_data))
|
||||
|
||||
few_shot_examples = ""
|
||||
for i in range(num_shots):
|
||||
few_shot_examples += (
|
||||
f"Question: {train_data[i]['question']}\n"
|
||||
f"Answer: {train_data[i]['answer']}\n\n"
|
||||
)
|
||||
|
||||
prompts = []
|
||||
labels = []
|
||||
for i in range(num_questions):
|
||||
prompts.append(
|
||||
few_shot_examples + f"Question: {test_data[i]['question']}\nAnswer:"
|
||||
)
|
||||
labels.append(get_answer_value(test_data[i]["answer"]))
|
||||
|
||||
assert all(label != INVALID for label in labels), "Some labels are invalid"
|
||||
return prompts, labels
|
||||
|
||||
|
||||
def _score_gsm8k(
|
||||
states: list[str],
|
||||
output_tokens: list[int],
|
||||
labels: list[int],
|
||||
num_shots: int,
|
||||
max_tokens: int,
|
||||
latency: float,
|
||||
) -> dict[str, float | int]:
|
||||
"""Score GSM8K responses and return a results dict."""
|
||||
num_questions = len(labels)
|
||||
preds = [get_answer_value(state) for state in states]
|
||||
accuracy = np.mean(np.array(preds) == np.array(labels))
|
||||
invalid_rate = np.mean(np.array(preds) == INVALID)
|
||||
total_output_tokens = sum(output_tokens)
|
||||
tokens_per_second = total_output_tokens / latency if latency > 0 else 0.0
|
||||
|
||||
return {
|
||||
"accuracy": accuracy,
|
||||
"invalid_rate": invalid_rate,
|
||||
"latency": latency,
|
||||
"questions_per_second": num_questions / latency if latency > 0 else 0.0,
|
||||
"total_output_tokens": total_output_tokens,
|
||||
"tokens_per_second": tokens_per_second,
|
||||
"num_questions": num_questions,
|
||||
"num_shots": num_shots,
|
||||
"max_tokens": max_tokens,
|
||||
"timestamp": time.time(),
|
||||
}
|
||||
|
||||
|
||||
def evaluate_gsm8k(
|
||||
num_questions: int = 1319,
|
||||
num_shots: int = 5,
|
||||
max_tokens: int = 256,
|
||||
host: str = "http://127.0.0.1",
|
||||
port: int = 8000,
|
||||
temperature: float = 0.0,
|
||||
seed: int | None = 42,
|
||||
) -> dict[str, float | int]:
|
||||
"""
|
||||
Evaluate GSM8K accuracy using vLLM serve endpoint.
|
||||
|
||||
Returns dict with accuracy, invalid_rate, latency, etc.
|
||||
"""
|
||||
base_url = f"{host}:{port}"
|
||||
prompts, labels = _build_gsm8k_prompts(num_questions, num_shots)
|
||||
num_questions = len(prompts)
|
||||
|
||||
async def run_async_evaluation():
|
||||
states: list[str] = [""] * num_questions
|
||||
output_tokens: list[int] = [0] * num_questions
|
||||
|
||||
async def get_answer(session: aiohttp.ClientSession, i: int) -> tuple[str, int]:
|
||||
answer, tokens = await call_vllm_api(
|
||||
session=session,
|
||||
prompt=prompts[i],
|
||||
temperature=temperature,
|
||||
max_tokens=max_tokens,
|
||||
stop=["Question", "Assistant:", "<|separator|>"],
|
||||
url=base_url,
|
||||
seed=seed,
|
||||
)
|
||||
states[i] = answer
|
||||
output_tokens[i] = tokens
|
||||
return answer, tokens
|
||||
|
||||
async with aiohttp.ClientSession(
|
||||
timeout=aiohttp.ClientTimeout(total=600)
|
||||
) as session:
|
||||
tasks = [get_answer(session, i) for i in range(num_questions)]
|
||||
await tqdm.gather(*tasks, desc="Evaluating")
|
||||
|
||||
return states, output_tokens
|
||||
|
||||
print(f"Running GSM8K evaluation: {num_questions} questions, {num_shots}-shot")
|
||||
|
||||
tic = time.perf_counter()
|
||||
states, output_tokens = asyncio.run(run_async_evaluation())
|
||||
latency = time.perf_counter() - tic
|
||||
|
||||
return _score_gsm8k(states, output_tokens, labels, num_shots, max_tokens, latency)
|
||||
|
||||
|
||||
def evaluate_gsm8k_offline(
|
||||
llm,
|
||||
num_questions: int = 1319,
|
||||
num_shots: int = 5,
|
||||
max_tokens: int = 256,
|
||||
temperature: float = 0.0,
|
||||
) -> dict[str, float | int]:
|
||||
"""Evaluate GSM8K accuracy using an offline vllm.LLM object.
|
||||
|
||||
Same prompts and scoring as evaluate_gsm8k(), but runs generation
|
||||
directly via llm.generate() instead of calling a server over HTTP.
|
||||
"""
|
||||
from vllm import SamplingParams
|
||||
|
||||
prompts, labels = _build_gsm8k_prompts(num_questions, num_shots)
|
||||
|
||||
sampling_params = SamplingParams(
|
||||
temperature=temperature,
|
||||
max_tokens=max_tokens,
|
||||
stop=["Question", "Assistant:", "<|separator|>"],
|
||||
)
|
||||
|
||||
print(
|
||||
f"Running offline GSM8K evaluation: {len(prompts)} questions, {num_shots}-shot"
|
||||
)
|
||||
|
||||
tic = time.perf_counter()
|
||||
outputs = llm.generate(prompts, sampling_params)
|
||||
latency = time.perf_counter() - tic
|
||||
|
||||
states = [o.outputs[0].text for o in outputs]
|
||||
output_tokens = [len(o.outputs[0].token_ids) for o in outputs]
|
||||
|
||||
return _score_gsm8k(states, output_tokens, labels, num_shots, max_tokens, latency)
|
||||
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(description="GSM8K evaluation for vLLM serve")
|
||||
parser.add_argument(
|
||||
"--num-shots", type=int, default=5, help="Number of few-shot examples"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--num-questions",
|
||||
type=int,
|
||||
default=1319,
|
||||
help="Number of questions to evaluate",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--max-tokens", type=int, default=256, help="Max tokens for generation"
|
||||
)
|
||||
parser.add_argument("--host", type=str, default="http://127.0.0.1", help="Host URL")
|
||||
parser.add_argument("--port", type=int, default=8000, help="Port number")
|
||||
parser.add_argument(
|
||||
"--temperature", type=float, default=0.0, help="Temperature for generation"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--seed", type=int, default=42, help="Random seed for reproducibility"
|
||||
)
|
||||
parser.add_argument("--save-results", type=str, help="Save results to JSON file")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
result = evaluate_gsm8k(
|
||||
num_questions=args.num_questions,
|
||||
num_shots=args.num_shots,
|
||||
max_tokens=args.max_tokens,
|
||||
host=args.host,
|
||||
port=args.port,
|
||||
temperature=args.temperature,
|
||||
seed=args.seed,
|
||||
)
|
||||
|
||||
# Print results to terminal
|
||||
print("\nResults:")
|
||||
print(f"Accuracy: {result['accuracy']:.3f}")
|
||||
print(f"Invalid responses: {result['invalid_rate']:.3f}")
|
||||
print(f"Total latency: {result['latency']:.3f} s")
|
||||
print(f"Questions per second: {result['questions_per_second']:.3f}")
|
||||
print(f"Total output tokens: {result['total_output_tokens']}")
|
||||
print(f"Output tokens per second: {result['tokens_per_second']:.3f}")
|
||||
|
||||
# Optional file saving
|
||||
if args.save_results:
|
||||
with open(args.save_results, "w") as f:
|
||||
json.dump(result, f, indent=2)
|
||||
print(f"Results saved to {args.save_results}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
116
third_party/vllm/tests/evals/gsm8k/test_gsm8k_correctness.py
vendored
Normal file
116
third_party/vllm/tests/evals/gsm8k/test_gsm8k_correctness.py
vendored
Normal file
@@ -0,0 +1,116 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
"""
|
||||
GSM8K evaluation using vLLM server and isolated GSM8K script.
|
||||
Replacement for lm-eval-harness with better performance and control.
|
||||
|
||||
Usage:
|
||||
pytest -s -v tests/evals/gsm8k/test_gsm8k_correctness.py \
|
||||
--config-list-file=configs/models-small.txt
|
||||
"""
|
||||
|
||||
import shlex
|
||||
|
||||
import pytest
|
||||
import yaml
|
||||
|
||||
from tests.utils import RemoteOpenAIServer
|
||||
from vllm.platforms import current_platform
|
||||
|
||||
from .gsm8k_eval import evaluate_gsm8k
|
||||
|
||||
|
||||
def run_gsm8k_eval(eval_config: dict, server_url: str) -> dict:
|
||||
"""Run GSM8K evaluation using our isolated script."""
|
||||
# Extract host and port from server URL
|
||||
if "://" in server_url:
|
||||
server_url = server_url.split("://")[1]
|
||||
|
||||
host_port = server_url.split("/")[0] # Remove path if present
|
||||
if ":" in host_port:
|
||||
host, p = host_port.split(":")
|
||||
port = int(p)
|
||||
else:
|
||||
host = host_port
|
||||
port = 8000
|
||||
|
||||
# Add http:// prefix if not present
|
||||
if not host.startswith("http"):
|
||||
host = f"http://{host}"
|
||||
|
||||
# Run GSM8K evaluation
|
||||
results = evaluate_gsm8k(
|
||||
num_questions=eval_config["num_questions"],
|
||||
num_shots=eval_config["num_fewshot"],
|
||||
host=host,
|
||||
port=port,
|
||||
)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def test_gsm8k_correctness(config_filename):
|
||||
"""Test GSM8K correctness for a given model configuration."""
|
||||
eval_config = yaml.safe_load(config_filename.read_text(encoding="utf-8"))
|
||||
|
||||
if (
|
||||
not current_platform.is_cuda()
|
||||
and "Qwen3-30B-A3B-MXFP4A16" in eval_config["model_name"]
|
||||
):
|
||||
pytest.skip(
|
||||
"Skipping Qwen3-30B-A3B-MXFP4A16 on non-CUDA platforms. "
|
||||
"Marlin kernels are not supported."
|
||||
)
|
||||
|
||||
# Parse server arguments from config (use shlex to handle quoted strings)
|
||||
server_args_str = eval_config.get("server_args", "")
|
||||
server_args = shlex.split(server_args_str) if server_args_str else []
|
||||
|
||||
# Add standard server arguments
|
||||
server_args.extend(
|
||||
[
|
||||
"--trust-remote-code",
|
||||
"--disable-uvicorn-access-log",
|
||||
]
|
||||
)
|
||||
|
||||
env_dict = eval_config.get("env", None)
|
||||
|
||||
print(f"Starting GSM8K evaluation for model: {eval_config['model_name']}")
|
||||
print(f"Expected metric threshold: {eval_config['accuracy_threshold']}")
|
||||
print(f"Number of questions: {eval_config['num_questions']}")
|
||||
print(f"Number of few-shot examples: {eval_config['num_fewshot']}")
|
||||
print(f"Server args: {' '.join(server_args)}")
|
||||
print(f"Environment variables: {env_dict}")
|
||||
|
||||
# Launch server and run evaluation
|
||||
with RemoteOpenAIServer(
|
||||
eval_config["model_name"],
|
||||
server_args,
|
||||
env_dict=env_dict,
|
||||
max_wait_seconds=eval_config.get("startup_max_wait_seconds", 600),
|
||||
) as remote_server:
|
||||
server_url = remote_server.url_for("v1")
|
||||
print(f"Server started at: {server_url}")
|
||||
|
||||
results = run_gsm8k_eval(eval_config, server_url)
|
||||
|
||||
measured_metric = results["accuracy"]
|
||||
expected_metric = eval_config["accuracy_threshold"]
|
||||
tol = eval_config.get("tolerance", 0.08)
|
||||
|
||||
print(f"GSM8K Results for {eval_config['model_name']}:")
|
||||
print(f" Measured metric: {measured_metric:.4f}")
|
||||
print(f" Expected metric: {expected_metric:.4f}")
|
||||
print(f" Tolerance: {tol:.4f}")
|
||||
print(f" Questions: {results['num_questions']}")
|
||||
print(f" Invalid rate: {results['invalid_rate']:.3f}")
|
||||
print(f" Latency: {results['latency']:.1f}s")
|
||||
print(f" QPS: {results['questions_per_second']:.1f}")
|
||||
|
||||
assert measured_metric >= expected_metric - tol, (
|
||||
f"GSM8K metric too low: {measured_metric:.4f} < "
|
||||
f"{expected_metric:.4f} - {tol:.4f} = {expected_metric - tol:.4f}"
|
||||
)
|
||||
|
||||
print(f"✅ GSM8K test passed for {eval_config['model_name']}")
|
||||
Reference in New Issue
Block a user