From e818dba016c390b7a85afb2cb941af8f2928fe3f Mon Sep 17 00:00:00 2001 From: zhumingjue138 Date: Thu, 14 May 2026 10:47:14 +0800 Subject: [PATCH] [Test] Add stability tests for HunyuanImage-3-Instruct (#3504) Signed-off-by: zhumingjue --- .../scripts/test_stability_hunyuan_image.py | 69 +++++++++++++++++++ .../stability/tests/test_hunyuan_image.json | 36 ++++++++++ 2 files changed, 105 insertions(+) create mode 100644 tests/dfx/stability/scripts/test_stability_hunyuan_image.py create mode 100644 tests/dfx/stability/tests/test_hunyuan_image.json diff --git a/tests/dfx/stability/scripts/test_stability_hunyuan_image.py b/tests/dfx/stability/scripts/test_stability_hunyuan_image.py new file mode 100644 index 000000000..38858047f --- /dev/null +++ b/tests/dfx/stability/scripts/test_stability_hunyuan_image.py @@ -0,0 +1,69 @@ +""" +Hunyuan-Image stability: OmniServer (diffusion) + ``diffusion_benchmark_serving.py``. + +Configuration: ``tests/dfx/stability/tests/test_hunyuan_image.json``. +""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from tests.dfx.conftest import ( + create_benchmark_indices, + create_test_parameter_mapping, + create_unique_server_params, + load_configs, +) +from tests.dfx.stability.helpers import _run_one_diffusion_batch, run_stability_benchmark_loop + +STABILITY_DIR = Path(__file__).resolve().parent.parent +DEPLOY_CONFIGS_DIR = STABILITY_DIR / "deploy" +CONFIG_FILE_PATH = str(STABILITY_DIR / "tests" / "test_hunyuan_image.json") +DEFAULT_NUM_PROMPTS_PER_BATCH = 20 +STABILITY_SERVER_TIMEOUT_ARGS = ["--stage-init-timeout", "600", "--init-timeout", "900"] + +try: + BENCHMARK_CONFIGS = load_configs(CONFIG_FILE_PATH) +except FileNotFoundError: + BENCHMARK_CONFIGS = [] + +test_params = create_unique_server_params(BENCHMARK_CONFIGS, DEPLOY_CONFIGS_DIR) if BENCHMARK_CONFIGS else [] +server_to_benchmark_mapping = create_test_parameter_mapping(BENCHMARK_CONFIGS) if BENCHMARK_CONFIGS else {} +benchmark_indices = create_benchmark_indices(BENCHMARK_CONFIGS, server_to_benchmark_mapping) + + +@pytest.mark.slow +@pytest.mark.diffusion +@pytest.mark.parametrize("omni_server", test_params, indirect=True) +@pytest.mark.parametrize("stability_benchmark_params", benchmark_indices, indirect=True) +def test_stability_hunyuan_image(omni_server, stability_benchmark_params): + test_name = stability_benchmark_params["test_name"] + params = stability_benchmark_params["params"] + duration_sec = params.get("duration_sec", 300) + num_prompts_per_batch = params.get("num_prompts_per_batch", DEFAULT_NUM_PROMPTS_PER_BATCH) + request_rate = params.get("request_rate") + max_concurrency = params.get("max_concurrency") + + bench_params = { + k: v + for k, v in params.items() + if k not in ("duration_sec", "request_rate", "max_concurrency", "num_prompts_per_batch") + } + + result = run_stability_benchmark_loop( + host=omni_server.host, + port=omni_server.port, + model=omni_server.model, + duration_sec=duration_sec, + params=bench_params, + request_rate=request_rate, + max_concurrency=max_concurrency, + result_dir=str(STABILITY_DIR), + num_prompts_per_batch=num_prompts_per_batch, + run_one_batch=_run_one_diffusion_batch, + ) + + assert result.get("failed", 0) == 0, f"[{test_name}] Failed requests detected: {result.get('errors', [])}" + assert result.get("completed", 0) > 0, f"[{test_name}] No requests completed" diff --git a/tests/dfx/stability/tests/test_hunyuan_image.json b/tests/dfx/stability/tests/test_hunyuan_image.json new file mode 100644 index 000000000..b78fa812c --- /dev/null +++ b/tests/dfx/stability/tests/test_hunyuan_image.json @@ -0,0 +1,36 @@ +[ + { + "test_name": "test_hunyuan_image_stability_tp2_fp8_sp2", + "server_params": { + "model": "tencent/HunyuanImage-3.0-Instruct", + "serve_args": { + "tensor-parallel-size": 2, + "usp": 2, + "quantization": "fp8", + "distributed-executor-backend": "mp", + "enforce-eager": true, + "enable-diffusion-pipeline-profiler": true + } + }, + "benchmark_params": [ + { + "dataset": "random", + "task": "t2i", + "backend": "vllm-omni", + "duration_sec": 86400, + "max_concurrency": 1, + "num_prompts_per_batch": 50, + "width": { + "min": 512, + "max": 1024 + }, + "height": { + "min": 512, + "max": 1024 + }, + "num_inference_steps": 50, + "enable_negative_prompt": true + } + ] + } +]