diff --git a/tests/integration/defs/perf/_model_paths.py b/tests/integration/defs/perf/_model_paths.py index ff38823c3913..438e9e2660d5 100644 --- a/tests/integration/defs/perf/_model_paths.py +++ b/tests/integration/defs/perf/_model_paths.py @@ -16,6 +16,7 @@ # Model PATH of local dir synced from internal LLM models repo MODEL_PATH_DICT = { + "muse_spark_open_nvfp4": "Muse-Spark-Open-816B-A42B-NVFP4", "llama_v3.1_8b_instruct": "llama-3.1-model/Llama-3.1-8B-Instruct", "llama_v3.1_8b_instruct_fp8": "llama-3.1-model/Llama-3.1-8B-Instruct-FP8", "llama_v3.1_8b_instruct_fp4": "modelopt-hf-model-hub/Llama-3.1-8B-Instruct-fp4", diff --git a/tests/integration/defs/perf/pytorch_model_config.py b/tests/integration/defs/perf/pytorch_model_config.py index dd8716544e65..92119aa721e4 100644 --- a/tests/integration/defs/perf/pytorch_model_config.py +++ b/tests/integration/defs/perf/pytorch_model_config.py @@ -107,6 +107,32 @@ def get_model_yaml_config(model_label: str, # Pattern-based configurations for models matching specific substrings # This allows for flexible configuration of models based on naming patterns pattern_configs = [ + { + 'patterns': ['muse_spark_open_nvfp4-serve-pytorch'], + 'config': { + 'disable_mm_encoder': True, + 'enable_attention_dp': False, + 'enable_chunked_prefill': True, + 'disable_overlap_scheduler': False, + 'attn_backend': 'TRTLLM', + 'allreduce_strategy': 'NCCL', + 'max_seq_len': 49152, + 'cuda_graph_config': { + 'enable_padding': True, + 'max_batch_size': 256, + }, + 'kv_cache_config': { + 'dtype': 'fp8', + 'enable_block_reuse': True, + 'enable_partial_reuse': True, + 'free_gpu_memory_fraction': 0.8, + 'use_kv_cache_manager_v2': True, + }, + 'moe_config': { + 'backend': 'TRTLLM', + }, + } + }, { 'patterns': ['deepseek_v41_flash_nvfp4'], 'config': { diff --git a/tests/integration/defs/perf/test_perf.py b/tests/integration/defs/perf/test_perf.py index f0e63911e7cd..01824358ee55 100644 --- a/tests/integration/defs/perf/test_perf.py +++ b/tests/integration/defs/perf/test_perf.py @@ -1632,6 +1632,9 @@ def get_commands(self): elif self._config.model_name == "glm_5.3_fp8": # Allow time for checkpoint loading and cold executor warmup. server_timeout = 1800 + elif self._config.model_name == "muse_spark_open_nvfp4": + # Allow time for NVFP4 checkpoint loading and executor warmup. + server_timeout = 3600 elif self._config.model_name in { "glm_5.3_flash_fp8", "glm_5.3_flash_fp8_mtp" }: diff --git a/tests/integration/test_lists/qa/llm_perf_core.yml b/tests/integration/test_lists/qa/llm_perf_core.yml index 39d778c8bb2f..d8d825786ba1 100644 --- a/tests/integration/test_lists/qa/llm_perf_core.yml +++ b/tests/integration/test_lists/qa/llm_perf_core.yml @@ -154,6 +154,10 @@ llm_perf_core: tests: # Upper bound is 10.7 so Rubin shares this set: a VR200 NVL72 node exposes 4 GPUs, # the same shape these cases are sized for, so it runs them rather than a copy. + # Muse Spark Open NVFP4, TP4/EP4, FP8 KV cache; text-only serving. + - perf/test_perf.py::test_perf[muse_spark_open_nvfp4-serve-pytorch-streaming-float4-maxbs:256-maxnt:8192-kv_frac:0.8-input_output_len:8192,1024-reqs:5-con:1-ep:4-tp:4-gpus:4] TIMEOUT(120) + - perf/test_perf.py::test_perf[muse_spark_open_nvfp4-serve-pytorch-streaming-float4-maxbs:256-maxnt:8192-kv_frac:0.8-input_output_len:8192,1024-reqs:160-con:32-ep:4-tp:4-gpus:4] TIMEOUT(120) + - perf/test_perf.py::test_perf[muse_spark_open_nvfp4-serve-pytorch-streaming-float4-maxbs:256-maxnt:8192-kv_frac:0.8-input_output_len:8192,1024-reqs:1280-con:256-ep:4-tp:4-gpus:4] TIMEOUT(120) # GLM-5.3-Flash FP8, TP4/EP4, BF16 KV cache, TRTLLM MoE, MTP3; honor EOS. - perf/test_perf.py::test_perf[glm_5.3_flash_fp8_mtp-serve-pytorch-streaming-float8-maxbs:64-maxnt:16384-kv_frac:0.5-input_output_len:1024,1024-reqs:5-con:1-ep:4-tp:4-gpus:4] TIMEOUT(120) - perf/test_perf.py::test_perf[glm_5.3_flash_fp8_mtp-serve-pytorch-streaming-float8-maxbs:64-maxnt:16384-kv_frac:0.5-input_output_len:1024,1024-reqs:320-con:64-ep:4-tp:4-gpus:4] TIMEOUT(120)