@@ -2324,3 +2324,185 @@ def test_auto_dtype(self, use_py_transceiver, mocker):
23242324 with launch_disaggregated_llm (disagg_cfg , ctx_cfg , gen_cfg ,
23252325 self .MODEL_PATH ) as llm :
23262326 run_accuracy_test (llm , self .MODEL_NAME , ["GSM8K" ])
2327+
2328+
2329+ @pytest .mark .timeout (DEFAULT_TEST_TIMEOUT )
2330+ @skip_pre_blackwell
2331+ class TestDeepSeekV4Flash (LlmapiAccuracyTestHarness ):
2332+ MODEL_NAME = "deepseek-ai/DeepSeek-V4-Flash"
2333+ MODEL_PATH = f"{ llm_models_root ()} /DeepSeek-V4-Flash"
2334+
2335+ @pytest .mark .skip_less_device (4 )
2336+ def test_auto_dtype (self ):
2337+ # Disagg smoke test: CTX TP=2 + GEN TP=2 = 4 GPUs.
2338+ # NVFP4 weights ~71 GB/rank at TP=2, leaving ~107 GB for KV on B200.
2339+ # TRTLLM backend required (WIDEEP lacks MXFP4 support for V4-Flash).
2340+ # V4 uses pure-Python KVCacheManagerV2; needs Python transceiver.
2341+ # NIXL (not DEFAULT) skips the TRTLLM_USE_UCX_KVCACHE=1 fallback.
2342+ cache_transceiver_config = {
2343+ "backend" : "NIXL" ,
2344+ "transceiver_runtime" : "PYTHON" ,
2345+ "max_tokens_in_buffer" : 4096 ,
2346+ }
2347+ ctx_server_config = {
2348+ "tensor_parallel_size" : 2 ,
2349+ "moe_expert_parallel_size" : 2 ,
2350+ "disable_overlap_scheduler" : True ,
2351+ "max_seq_len" : 4096 ,
2352+ "kv_cache_config" : {
2353+ "free_gpu_memory_fraction" : 0.5 ,
2354+ },
2355+ "cache_transceiver_config" : cache_transceiver_config ,
2356+ }
2357+ gen_server_config = {
2358+ "tensor_parallel_size" : 2 ,
2359+ "moe_expert_parallel_size" : 2 ,
2360+ "enable_attention_dp" : True ,
2361+ "disable_overlap_scheduler" : True ,
2362+ "max_seq_len" : 4096 ,
2363+ "moe_config" : {
2364+ "backend" : "TRTLLM" ,
2365+ },
2366+ "kv_cache_config" : {
2367+ "free_gpu_memory_fraction" : 0.5 ,
2368+ },
2369+ "cache_transceiver_config" : cache_transceiver_config ,
2370+ }
2371+ disaggregated_server_config = {
2372+ "hostname" : "localhost" ,
2373+ "backend" : "pytorch" ,
2374+ "context_servers" : {
2375+ "num_instances" : 1
2376+ },
2377+ "generation_servers" : {
2378+ "num_instances" : 1
2379+ },
2380+ }
2381+ # V4-Flash 148GB weight prefetch + warmup needs >35 min, default wait timeout times out.
2382+ with launch_disaggregated_llm (disaggregated_server_config ,
2383+ ctx_server_config ,
2384+ gen_server_config ,
2385+ self .MODEL_PATH ,
2386+ server_waiting_timeout = 3600 ) as llm :
2387+ task = MMLU (self .MODEL_NAME )
2388+ task .evaluate (llm , is_integration_test = True )
2389+
2390+ @pytest .mark .skip_less_device (4 )
2391+ def test_gen_first (self ):
2392+ """Gen-first quick validation for DSv4-Flash on KVCacheManagerV2 + NIXL python."""
2393+ cache_transceiver_config = {
2394+ "backend" : "NIXL" ,
2395+ "transceiver_runtime" : "PYTHON" ,
2396+ "max_tokens_in_buffer" : 4096 ,
2397+ }
2398+ ctx_server_config = {
2399+ "tensor_parallel_size" : 2 ,
2400+ "moe_expert_parallel_size" : 2 ,
2401+ "disable_overlap_scheduler" : True ,
2402+ "max_seq_len" : 4096 ,
2403+ "kv_cache_config" : {
2404+ "free_gpu_memory_fraction" : 0.5 ,
2405+ },
2406+ "cache_transceiver_config" : cache_transceiver_config ,
2407+ }
2408+ gen_server_config = {
2409+ "tensor_parallel_size" : 2 ,
2410+ "moe_expert_parallel_size" : 2 ,
2411+ "enable_attention_dp" : True ,
2412+ "disable_overlap_scheduler" : True ,
2413+ "max_seq_len" : 4096 ,
2414+ "moe_config" : {
2415+ "backend" : "TRTLLM" ,
2416+ },
2417+ "kv_cache_config" : {
2418+ "free_gpu_memory_fraction" : 0.5 ,
2419+ },
2420+ "cache_transceiver_config" : cache_transceiver_config ,
2421+ }
2422+ disaggregated_server_config = {
2423+ "hostname" : "localhost" ,
2424+ "backend" : "pytorch" ,
2425+ "context_servers" : {
2426+ "num_instances" : 1
2427+ },
2428+ "generation_servers" : {
2429+ "num_instances" : 1
2430+ },
2431+ "schedule_style" : "generation_first" ,
2432+ }
2433+ with launch_disaggregated_llm (disaggregated_server_config ,
2434+ ctx_server_config ,
2435+ gen_server_config ,
2436+ self .MODEL_PATH ,
2437+ server_waiting_timeout = 3600 ) as llm :
2438+ task = MMLU (self .MODEL_NAME )
2439+ task .evaluate (llm , is_integration_test = True )
2440+
2441+
2442+ @pytest .mark .timeout (14400 )
2443+ @skip_pre_blackwell
2444+ @pytest .mark .skip_less_device_memory (140000 )
2445+ class TestDeepSeekV4FlashBase (LlmapiAccuracyTestHarness ):
2446+ MODEL_NAME = "deepseek-ai/DeepSeek-V4-Flash-Base"
2447+ MODEL_PATH = f"{ llm_models_root ()} /DeepSeek-V4-Flash-Base"
2448+
2449+ @pytest .mark .skip_less_device (4 )
2450+ def test_auto_dtype (self ):
2451+ # Disagg smoke test: CTX TP=2 + GEN TP=2 = 4 GPUs.
2452+ # FP8 weights ~71 GB/rank at TP=4 → ~142 GB/rank at TP=2; requires
2453+ # ≥140 GB per GPU (fits on B300 288 GB, tight on B200 178 GB).
2454+ # TRTLLM backend: WIDEEP's FP8 block-scale path is Hopper-only.
2455+ # Compact batching keeps KV cache ~1 GB/rank (default ~100 GB requires fully-clean GPU memory).
2456+ # V4 uses pure-Python KVCacheManagerV2; needs Python transceiver.
2457+ # NIXL (not DEFAULT) skips the TRTLLM_USE_UCX_KVCACHE=1 fallback.
2458+ cache_transceiver_config = {
2459+ "backend" : "NIXL" ,
2460+ "transceiver_runtime" : "PYTHON" ,
2461+ "max_tokens_in_buffer" : 4096 ,
2462+ }
2463+ ctx_server_config = {
2464+ "tensor_parallel_size" : 2 ,
2465+ "moe_expert_parallel_size" : 2 ,
2466+ "disable_overlap_scheduler" : True ,
2467+ "max_batch_size" : 16 ,
2468+ "max_num_tokens" : 4096 ,
2469+ "max_seq_len" : 4096 ,
2470+ "kv_cache_config" : {
2471+ "free_gpu_memory_fraction" : 0.5 ,
2472+ },
2473+ "cache_transceiver_config" : cache_transceiver_config ,
2474+ }
2475+ gen_server_config = {
2476+ "tensor_parallel_size" : 2 ,
2477+ "moe_expert_parallel_size" : 2 ,
2478+ "enable_attention_dp" : True ,
2479+ "disable_overlap_scheduler" : True ,
2480+ "max_batch_size" : 16 ,
2481+ "max_num_tokens" : 4096 ,
2482+ "max_seq_len" : 4096 ,
2483+ "moe_config" : {
2484+ "backend" : "TRTLLM" ,
2485+ },
2486+ "kv_cache_config" : {
2487+ "free_gpu_memory_fraction" : 0.5 ,
2488+ },
2489+ "cache_transceiver_config" : cache_transceiver_config ,
2490+ }
2491+ disaggregated_server_config = {
2492+ "hostname" : "localhost" ,
2493+ "backend" : "pytorch" ,
2494+ "context_servers" : {
2495+ "num_instances" : 1
2496+ },
2497+ "generation_servers" : {
2498+ "num_instances" : 1
2499+ },
2500+ }
2501+ # Same long-init reason as TestDeepSeekV4Flash above.
2502+ with launch_disaggregated_llm (disaggregated_server_config ,
2503+ ctx_server_config ,
2504+ gen_server_config ,
2505+ self .MODEL_PATH ,
2506+ server_waiting_timeout = 3600 ) as llm :
2507+ task = MMLU (self .MODEL_NAME )
2508+ task .evaluate (llm , is_integration_test = True )
0 commit comments