[Perf] Qwen-Image Nightly Performance CI Improvement (#2111)

Signed-off-by: Didan Deng <33117903+wtomin@users.noreply.github.com>
This commit is contained in:
Didan Deng authored and GitHub committed 2026-03-24 16:52:48 +08:00
1 parent 5c14757ef0
commit c39225724d
7 files changed
+477 -201

No files matched your search

+4 -4
View File
@@ -253,11 +253,11 @@ steps:
if: build.env("NIGHTLY") == "1"
commands:
- export VLLM_WORKER_MULTIPROC_METHOD=spawn
- export DIFFUSION_BENCHMARK_DIR=tests/perf/results
- export DIFFUSION_BENCHMARK_DIR=tests/dfx/perf/results
- export CACHE_DIT_VERSION=1.3.0
- pytest -s -v tests/perf/scripts/run_diffusion_benchmark.py --config-file tests/perf/tests/test_qwen_image_vllm_omni.json
- buildkite-agent artifact upload "tests/perf/results/benchmark_results_*.json"
- buildkite-agent artifact upload "tests/perf/results/logs/*.log"
- pytest -s -v tests/dfx/perf/scripts/run_diffusion_benchmark.py --config-file tests/dfx/perf/tests/test_qwen_image_vllm_omni.json
- buildkite-agent artifact upload "tests/dfx/perf/results/benchmark_results_*.json"
- buildkite-agent artifact upload "tests/dfx/perf/results/logs/*.log"
agents:
queue: "mithril-h100-pool"
plugins:
@@ -8,8 +8,8 @@ Supports two server backends:
benchmarks with diffusion_benchmark_serving.py --backend sglang
A config JSON file is REQUIRED via --config-file:
pytest run_diffusion_benchmark.py --config-file tests/perf/tests/test_qwen_image_vllm_omni.json
pytest run_diffusion_benchmark.py --config-file tests/perf/tests/test_qwen_image_sglang_diffusion.json
pytest run_diffusion_benchmark.py --config-file tests/dfx/perf/tests/test_qwen_image_vllm_omni.json
pytest run_diffusion_benchmark.py --config-file tests/dfx/perf/tests/test_qwen_image_sglang_diffusion.json
JSON config entries are distinguished by a "server_type" field ("vllm-omni" or "sglang").
sglang entries support two additional fields under server_params:
@@ -50,7 +50,7 @@ _DEFAULT_RESULT_DIR = Path(__file__).parent.parent / "results"
BENCHMARK_RESULT_DIR = Path(os.environ.get("DIFFUSION_BENCHMARK_DIR", str(_DEFAULT_RESULT_DIR)))
BENCHMARK_SCRIPT = str(
Path(__file__).parent.parent.parent.parent / "benchmarks" / "diffusion" / "diffusion_benchmark_serving.py"
Path(__file__).parent.parent.parent.parent.parent / "benchmarks" / "diffusion" / "diffusion_benchmark_serving.py"
)
# Single aggregated result file for the entire benchmark session.
@@ -76,11 +76,8 @@ def _get_config_file_from_argv() -> str | None:
CONFIG_FILE_PATH = _get_config_file_from_argv()
if CONFIG_FILE_PATH is None:
raise ValueError(
"--config-file is required. Pass the path to a benchmark config JSON, e.g.:\n"
" pytest run_diffusion_benchmark.py "
"--config-file tests/perf/tests/test_qwen_image_vllm_omni.json"
)
print("No config file provided, using default config file: tests/dfx/perf/tests/test_qwen_image_vllm_omni.json")
CONFIG_FILE_PATH = "tests/dfx/perf/tests/test_qwen_image_vllm_omni.json"
# ---------------------------------------------------------------------------
# Config loading
@@ -149,7 +146,7 @@ def pytest_addoption(parser: pytest.Parser) -> None:
default=None,
help=(
"Path to the benchmark config JSON file (required). "
"Example: --config-file tests/perf/tests/test_qwen_image_vllm_omni.json"
"Example: --config-file tests/dfx/perf/tests/test_qwen_image_vllm_omni.json"
),
)
@@ -0,0 +1,241 @@
[
{
"test_name": "test_sglang_qwen_image_single_device",
"description": "sglang: single-device baseline (no parallelism)",
"server_type": "sglang",
"server_params": {
"model": "Qwen/Qwen-Image",
"serve_args": {
"num-gpus": 1,
"dit-cpu-offload": false,
"text-encoder-cpu-offload": false,
"vae-cpu-offload": false
}
},
"benchmark_params": [
{
"name": "512x512_steps20",
"dataset": "random",
"task": "t2i",
"width": 512,
"height": 512,
"num-inference-steps": 20,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"baseline": {
"throughput_qps": 0.001,
"latency_p99": 1000.0,
"peak_memory_mb_max": 400000,
"peak_memory_mb_mean": 400000
}
},
{
"name": "1536x1536_steps35",
"dataset": "random",
"task": "t2i",
"width": 1536,
"height": 1536,
"num-inference-steps": 35,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"baseline": {
"throughput_qps": 0.001,
"latency_p99": 1000.0,
"peak_memory_mb_max": 400000,
"peak_memory_mb_mean": 400000
}
},
{
"name": "mixed_resolution",
"dataset": "random",
"task": "t2i",
"num-inference-steps": 20,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"random-request-config": [
{"width": 512, "height": 512, "num_inference_steps": 20, "weight": 0.15},
{"width": 768, "height": 768, "num_inference_steps": 20, "weight": 0.25},
{"width": 1024, "height": 1024, "num_inference_steps": 25, "weight": 0.45},
{"width": 1536, "height": 1536, "num_inference_steps": 35, "weight": 0.15}
],
"baseline": {
"throughput_qps": 0.001,
"latency_p99": 1000.0,
"peak_memory_mb_max": 400000,
"peak_memory_mb_mean": 400000
}
}
]
},
{
"test_name": "test_sglang_qwen_image_ulysses2_cfg2_vae_patch4",
"description": "sglang: USP=2 + CFG-parallel=2 + VAE patch parallel via --use-parallel-tiling",
"server_type": "sglang",
"server_params": {
"model": "Qwen/Qwen-Image",
"serve_args": {
"num-gpus": 4,
"sp-degree": 2,
"ulysses-degree": 2,
"enable-cfg-parallel": true,
"use-parallel-tiling": true,
"dit-cpu-offload": false,
"text-encoder-cpu-offload": false,
"vae-cpu-offload": false
}
},
"benchmark_params": [
{
"name": "512x512_steps20",
"dataset": "random",
"task": "t2i",
"width": 512,
"height": 512,
"num-inference-steps": 20,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"baseline": {
"throughput_qps": 0.001,
"latency_p99": 1000.0,
"peak_memory_mb_max": 400000,
"peak_memory_mb_mean": 400000
}
},
{
"name": "1536x1536_steps35",
"dataset": "random",
"task": "t2i",
"width": 1536,
"height": 1536,
"num-inference-steps": 35,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"baseline": {
"throughput_qps": 0.001,
"latency_p99": 1000.0,
"peak_memory_mb_max": 400000,
"peak_memory_mb_mean": 400000
}
},
{
"name": "mixed_resolution",
"dataset": "random",
"task": "t2i",
"num-inference-steps": 20,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"random-request-config": [
{"width": 512, "height": 512, "num_inference_steps": 20, "weight": 0.15},
{"width": 768, "height": 768, "num_inference_steps": 20, "weight": 0.25},
{"width": 1024, "height": 1024, "num_inference_steps": 25, "weight": 0.45},
{"width": 1536, "height": 1536, "num_inference_steps": 35, "weight": 0.15}
],
"baseline": {
"throughput_qps": 0.001,
"latency_p99": 1000.0,
"peak_memory_mb_max": 400000,
"peak_memory_mb_mean": 400000
}
}
]
},
{
"test_name": "test_sglang_qwen_image_ulysses2_cfg2_cache_dit",
"description": "sglang: USP=2 + CFG-parallel=2 + Cache-DiT via YAML config (--cache-dit-config)",
"server_type": "sglang",
"server_params": {
"model": "Qwen/Qwen-Image",
"cache_dit_config": {
"cache_config": {
"Fn_compute_blocks": 1,
"Bn_compute_blocks": 0,
"max_warmup_steps": 4,
"residual_diff_threshold": 0.24,
"max_continuous_cached_steps": 3,
"enable_taylorseer": false,
"taylorseer_order": 1,
"scm_steps_mask_policy": "none",
"scm_steps_policy": "dynamic"
},
"parallelism_config": {
"ulysses_size": 2,
"attention_backend": "native"
}
},
"serve_args": {
"num-gpus": 4,
"sp-degree": 2,
"ulysses-degree": 2,
"enable-cfg-parallel": true,
"dit-cpu-offload": false,
"text-encoder-cpu-offload": false,
"vae-cpu-offload": false
}
},
"benchmark_params": [
{
"name": "512x512_steps20",
"dataset": "random",
"task": "t2i",
"width": 512,
"height": 512,
"num-inference-steps": 20,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"baseline": {
"throughput_qps": 0.001,
"latency_p99": 1000.0,
"peak_memory_mb_max": 400000,
"peak_memory_mb_mean": 400000
}
},
{
"name": "1536x1536_steps35",
"dataset": "random",
"task": "t2i",
"width": 1536,
"height": 1536,
"num-inference-steps": 35,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"baseline": {
"throughput_qps": 0.001,
"latency_p99": 1000.0,
"peak_memory_mb_max": 400000,
"peak_memory_mb_mean": 400000
}
},
{
"name": "mixed_resolution",
"dataset": "random",
"task": "t2i",
"num-inference-steps": 20,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"random-request-config": [
{"width": 512, "height": 512, "num_inference_steps": 20, "weight": 0.15},
{"width": 768, "height": 768, "num_inference_steps": 20, "weight": 0.25},
{"width": 1024, "height": 1024, "num_inference_steps": 25, "weight": 0.45},
{"width": 1536, "height": 1536, "num_inference_steps": 35, "weight": 0.15}
],
"baseline": {
"throughput_qps": 0.001,
"latency_p99": 1000.0,
"peak_memory_mb_max": 400000,
"peak_memory_mb_mean": 400000
}
}
]
}
]
@@ -0,0 +1,226 @@
[
{
"test_name": "test_qwen_image_single_device",
"description": "Single-device baseline (no parallelism)",
"server_type": "vllm-omni",
"server_params": {
"model": "Qwen/Qwen-Image",
"serve_args": {
"enable-diffusion-pipeline-profiler": true
}
},
"benchmark_params": [
{
"name": "512x512_steps20",
"dataset": "random",
"task": "t2i",
"width": 512,
"height": 512,
"num-inference-steps": 20,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"baseline": {
"throughput_qps": 0.40,
"latency_p99": 2.55,
"peak_memory_mb_max": 67000,
"peak_memory_mb_mean": 67000
}
},
{
"name": "1536x1536_steps35",
"dataset": "random",
"task": "t2i",
"width": 1536,
"height": 1536,
"num-inference-steps": 35,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"baseline": {
"throughput_qps": 0.037,
"latency_p99": 27.0,
"peak_memory_mb_max": 74000,
"peak_memory_mb_mean": 74000
}
},
{
"name": "mixed_resolution",
"dataset": "random",
"task": "t2i",
"num-inference-steps": 20,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"random-request-config": [
{"width": 512, "height": 512, "num_inference_steps": 20, "weight": 0.15},
{"width": 768, "height": 768, "num_inference_steps": 20, "weight": 0.25},
{"width": 1024, "height": 1024, "num_inference_steps": 25, "weight": 0.45},
{"width": 1536, "height": 1536, "num_inference_steps": 35, "weight": 0.15}
],
"baseline": {
"throughput_qps": 0.14,
"latency_p99": 25.0,
"peak_memory_mb_max": 74000,
"peak_memory_mb_mean": 74000
}
}
]
},
{
"test_name": "test_qwen_image_ulysses2_cfg2_vae_patch4",
"description": "Ulysses SP=2 + CFG-parallel=2 + VAE Patch Parallel=4",
"server_type": "vllm-omni",
"server_params": {
"model": "Qwen/Qwen-Image",
"serve_args": {
"ulysses-degree": 2,
"cfg-parallel-size": 2,
"vae-patch-parallel-size": 4,
"vae-use-tiling": true,
"enable-diffusion-pipeline-profiler": true
}
},
"benchmark_params": [
{
"name": "512x512_steps20",
"dataset": "random",
"task": "t2i",
"width": 512,
"height": 512,
"num-inference-steps": 20,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"baseline": {
"throughput_qps": 0.43,
"latency_p99": 2.34,
"peak_memory_mb_max": 61000,
"peak_memory_mb_mean": 61000
}
},
{
"name": "1536x1536_steps35",
"dataset": "random",
"task": "t2i",
"width": 1536,
"height": 1536,
"num-inference-steps": 35,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"baseline": {
"throughput_qps": 0.11,
"latency_p99": 9.1,
"peak_memory_mb_max": 61000,
"peak_memory_mb_mean": 61000
}
},
{
"name": "mixed_resolution",
"dataset": "random",
"task": "t2i",
"num-inference-steps": 20,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"random-request-config": [
{"width": 512, "height": 512, "num_inference_steps": 20, "weight": 0.15},
{"width": 768, "height": 768, "num_inference_steps": 20, "weight": 0.25},
{"width": 1024, "height": 1024, "num_inference_steps": 25, "weight": 0.45},
{"width": 1536, "height": 1536, "num_inference_steps": 35, "weight": 0.15}
],
"baseline": {
"throughput_qps": 0.29,
"latency_p99": 8.5,
"peak_memory_mb_max": 61000,
"peak_memory_mb_mean": 61000
}
}
]
},
{
"test_name": "test_qwen_image_ulysses2_cfg2_cache_dit",
"description": "Ulysses SP=2 + CFG-parallel=2 + CacheDiT acceleration",
"server_type": "vllm-omni",
"server_params": {
"model": "Qwen/Qwen-Image",
"serve_args": {
"ulysses-degree": 2,
"cfg-parallel-size": 2,
"cache-backend": "cache_dit",
"cache-config": {
"Fn_compute_blocks": 1,
"Bn_compute_blocks": 0,
"max_warmup_steps": 4,
"residual_diff_threshold": 0.24,
"max_continuous_cached_steps": 3,
"enable_taylorseer": false,
"taylorseer_order": 1,
"scm_steps_mask_policy": null,
"scm_steps_policy": "dynamic"
},
"enable-diffusion-pipeline-profiler": true
}
},
"benchmark_params": [
{
"name": "512x512_steps20",
"dataset": "random",
"task": "t2i",
"width": 512,
"height": 512,
"num-inference-steps": 20,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"baseline": {
"throughput_qps": 0.52,
"latency_p99": 2.36,
"peak_memory_mb_max": 67000,
"peak_memory_mb_mean": 67000
}
},
{
"name": "1536x1536_steps35",
"dataset": "random",
"task": "t2i",
"width": 1536,
"height": 1536,
"num-inference-steps": 35,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"baseline": {
"throughput_qps": 0.17,
"latency_p99": 6.15,
"peak_memory_mb_max": 74000,
"peak_memory_mb_mean": 74000
}
},
{
"name": "mixed_resolution",
"dataset": "random",
"task": "t2i",
"num-inference-steps": 20,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"random-request-config": [
{"width": 512, "height": 512, "num_inference_steps": 20, "weight": 0.15},
{"width": 768, "height": 768, "num_inference_steps": 20, "weight": 0.25},
{"width": 1024, "height": 1024, "num_inference_steps": 25, "weight": 0.45},
{"width": 1536, "height": 1536, "num_inference_steps": 35, "weight": 0.15}
],
"baseline": {
"throughput_qps": 0.41,
"latency_p99": 5.33,
"peak_memory_mb_max": 74000,
"peak_memory_mb_mean": 74000
}
}
]
}
]
-57
View File
@@ -1,57 +0,0 @@
[
{
"name": "512x512_steps20",
"dataset": "random",
"task": "t2i",
"width": 512,
"height": 512,
"num-inference-steps": 20,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"baseline": {
"throughput_qps": 0.001,
"latency_p99": 1000.0,
"peak_memory_mb_max": 400000,
"peak_memory_mb_mean": 400000
}
},
{
"name": "1536x1536_steps35",
"dataset": "random",
"task": "t2i",
"width": 1536,
"height": 1536,
"num-inference-steps": 35,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"baseline": {
"throughput_qps": 0.001,
"latency_p99": 1000.0,
"peak_memory_mb_max": 400000,
"peak_memory_mb_mean": 400000
}
},
{
"name": "mixed_resolution",
"dataset": "random",
"task": "t2i",
"num-inference-steps": 20,
"num-prompts": 10,
"max-concurrency": 1,
"enable-negative-prompt": true,
"random-request-config": [
{"width": 512, "height": 512, "num_inference_steps": 20, "weight": 0.15},
{"width": 768, "height": 768, "num_inference_steps": 20, "weight": 0.25},
{"width": 1024, "height": 1024, "num_inference_steps": 25, "weight": 0.45},
{"width": 1536, "height": 1536, "num_inference_steps": 35, "weight": 0.15}
],
"baseline": {
"throughput_qps": 0.001,
"latency_p99": 1000.0,
"peak_memory_mb_max": 400000,
"peak_memory_mb_mean": 400000
}
}
]
@@ -1,73 +0,0 @@
[
{
"test_name": "test_sglang_qwen_image_single_device",
"description": "sglang: single-device baseline (no parallelism)",
"server_type": "sglang",
"server_params": {
"model": "Qwen/Qwen-Image",
"serve_args": {
"num-gpus": 1,
"dit-cpu-offload": false,
"text-encoder-cpu-offload": false,
"vae-cpu-offload": false
}
},
"benchmark_params": {"$ref": "benchmark_params.json"}
},
{
"test_name": "test_sglang_qwen_image_ulysses2_cfg2_vae_patch4",
"description": "sglang: USP=2 + CFG-parallel=2 + VAE patch parallel via --use-parallel-tiling",
"server_type": "sglang",
"server_params": {
"model": "Qwen/Qwen-Image",
"serve_args": {
"num-gpus": 4,
"sp-degree": 2,
"ulysses-degree": 2,
"enable-cfg-parallel": true,
"use-parallel-tiling": true,
"dit-cpu-offload": false,
"text-encoder-cpu-offload": false,
"vae-cpu-offload": false
}
},
"benchmark_params": {"$ref": "benchmark_params.json"}
},
{
"test_name": "test_sglang_qwen_image_ulysses2_cfg2_cache_dit",
"description": "sglang: USP=2 + CFG-parallel=2 + Cache-DiT via YAML config (--cache-dit-config)",
"server_type": "sglang",
"server_params": {
"model": "Qwen/Qwen-Image",
"cache_dit_config": {
"cache_config": {
"Fn_compute_blocks": 1,
"Bn_compute_blocks": 0,
"max_warmup_steps": 4,
"residual_diff_threshold": 0.24,
"max_continuous_cached_steps": 3,
"enable_taylorseer": false,
"taylorseer_order": 1,
"scm_steps_mask_policy": "none",
"scm_steps_policy": "dynamic"
},
"parallelism_config": {
"ulysses_size": 2,
"attention_backend": "native"
}
},
"serve_args": {
"num-gpus": 4,
"sp-degree": 2,
"ulysses-degree": 2,
"enable-cfg-parallel": true,
"dit-cpu-offload": false,
"text-encoder-cpu-offload": false,
"vae-cpu-offload": false
}
},
"benchmark_params": {"$ref": "benchmark_params.json"}
}
]
@@ -1,58 +0,0 @@
[
{
"test_name": "test_qwen_image_single_device",
"description": "Single-device baseline (no parallelism)",
"server_type": "vllm-omni",
"server_params": {
"model": "Qwen/Qwen-Image",
"serve_args": {
"enable-diffusion-pipeline-profiler": true
}
},
"benchmark_params": {"$ref": "benchmark_params.json"}
},
{
"test_name": "test_qwen_image_ulysses2_cfg2_vae_patch4",
"description": "Ulysses SP=2 + CFG-parallel=2 + VAE Patch Parallel=4",
"server_type": "vllm-omni",
"server_params": {
"model": "Qwen/Qwen-Image",
"serve_args": {
"ulysses-degree": 2,
"cfg-parallel-size": 2,
"vae-patch-parallel-size": 4,
"vae-use-tiling": true,
"enable-diffusion-pipeline-profiler": true
}
},
"benchmark_params": {"$ref": "benchmark_params.json"}
},
{
"test_name": "test_qwen_image_ulysses2_cfg2_cache_dit",
"description": "Ulysses SP=2 + CFG-parallel=2 + CacheDiT acceleration",
"server_type": "vllm-omni",
"server_params": {
"model": "Qwen/Qwen-Image",
"serve_args": {
"ulysses-degree": 2,
"cfg-parallel-size": 2,
"cache-backend": "cache_dit",
"cache-config": {
"Fn_compute_blocks": 1,
"Bn_compute_blocks": 0,
"max_warmup_steps": 4,
"residual_diff_threshold": 0.24,
"max_continuous_cached_steps": 3,
"enable_taylorseer": false,
"taylorseer_order": 1,
"scm_steps_mask_policy": null,
"scm_steps_policy": "dynamic"
},
"enable-diffusion-pipeline-profiler": true
}
},
"benchmark_params": {"$ref": "benchmark_params.json"}
}
]