From 09f0ae459ca4783538e3d45119751da7328de1ac Mon Sep 17 00:00:00 2001 From: Jin Li <59594262+liji-nv@users.noreply.github.com> Date: Thu, 9 Jul 2026 05:30:03 -0700 Subject: [PATCH 1/3] [nvbugs/6417488][test] Unwaive MiniMax M3 NVFP4 accuracy test Signed-off-by: Jin Li <59594262+liji-nv@users.noreply.github.com> --- tests/integration/test_lists/waives.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/integration/test_lists/waives.txt b/tests/integration/test_lists/waives.txt index 6dc4776bb633..06f9f5832fe4 100644 --- a/tests/integration/test_lists/waives.txt +++ b/tests/integration/test_lists/waives.txt @@ -215,7 +215,6 @@ full:GB300/accuracy/test_llm_api_pytorch.py::TestGemma3_1BInstruct::test_fp8_pre full:GB300/accuracy/test_llm_api_pytorch.py::TestLlama3_1_8BInstruct::test_bfloat16_4gpus[pp4-attn_backend=FLASHINFER-torch_compile=False] SKIP (https://nvbugs/6385771) full:GB300/accuracy/test_llm_api_pytorch.py::TestLlama3_1_8BInstruct::test_fp8_4gpus[pp4-fp8kv=True-attn_backend=FLASHINFER-torch_compile=False] SKIP (https://nvbugs/6385771) full:GB300/accuracy/test_llm_api_pytorch.py::TestMiniMaxM3::test_mxfp8[use_msa=False] SKIP (https://nvbugs/6422502) -full:GB300/accuracy/test_llm_api_pytorch.py::TestMiniMaxM3::test_nvfp4[use_msa=False] SKIP (https://nvbugs/6422502) full:GB300/accuracy/test_llm_api_pytorch.py::TestQwen3_5_35B_A3B::test_fp8_moe_dflash SKIP (https://nvbugs/6316985) full:GB300/accuracy/test_llm_api_pytorch_multimodal.py::TestGemma3_27BInstruct::test_fp8_prequantized SKIP (https://nvbugs/6479708) full:GB300/test_e2e.py::test_qwen_e2e_cpprunner_large_new_tokens[DeepSeek-R1-Distill-Qwen-1.5B-DeepSeek-R1-Distill-Qwen-1.5B] SKIP (https://nvbugs/6414760) From 09f26bddd4f3d1df6cdd8e699f61aa46063e6ff4 Mon Sep 17 00:00:00 2001 From: Jin Li <59594262+liji-nv@users.noreply.github.com> Date: Thu, 9 Jul 2026 05:46:59 -0700 Subject: [PATCH 2/3] [nvbugs/6417488][fix] Reject SWA scratch reuse for MiniMax M3 Signed-off-by: Jin Li <59594262+liji-nv@users.noreply.github.com> --- .../attention_backend/sparse/minimax_m3/cache_manager.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tensorrt_llm/_torch/attention_backend/sparse/minimax_m3/cache_manager.py b/tensorrt_llm/_torch/attention_backend/sparse/minimax_m3/cache_manager.py index 65c89b170c5c..2c75dc23943c 100644 --- a/tensorrt_llm/_torch/attention_backend/sparse/minimax_m3/cache_manager.py +++ b/tensorrt_llm/_torch/attention_backend/sparse/minimax_m3/cache_manager.py @@ -365,6 +365,14 @@ def get_buffers(self, layer_idx: int, kv_layout: str = "NHD") -> Optional[torch. full_view = convert_to_torch_tensor(TensorWrapper(addr_key, torch_dtype, full_slot_shape)) return full_view[:, :2] + def _prepare_page_table_tensor(self, index_mapper_capacity: int) -> None: + # M3's pool coalesces INDEX_KEY with K/V for sparse layers, so the + # base's SWA scratch-reuse branch (which assumes per-layer pools) + # does not describe the M3 layout. Fail fast rather than silently + # produce a mismatched pool mapping. + assert not self.enable_swa_scratch_reuse, "MiniMax M3 does not support SWA scratch reuse" + super()._prepare_page_table_tensor(index_mapper_capacity) + def _kv_pool_mapping_offset(self, layer_id, layer_group_id, key_base_addr) -> int: """Pool-mapping offset from the layer's physical position in its pool. From 27dfb1267b6a34a1e851b0aca63c92053a7a045d Mon Sep 17 00:00:00 2001 From: Jin Li <59594262+liji-nv@users.noreply.github.com> Date: Thu, 16 Jul 2026 00:54:36 -0700 Subject: [PATCH 3/3] [nvbugs/6417488][fix] Harden MiniMax M3 C++ KV cache mapping Signed-off-by: Jin Li <59594262+liji-nv@users.noreply.github.com> --- .../_torch/pyexecutor/kv_cache_manager_v2.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/tensorrt_llm/_torch/pyexecutor/kv_cache_manager_v2.py b/tensorrt_llm/_torch/pyexecutor/kv_cache_manager_v2.py index 24808e8b55b5..f6df89f98641 100644 --- a/tensorrt_llm/_torch/pyexecutor/kv_cache_manager_v2.py +++ b/tensorrt_llm/_torch/pyexecutor/kv_cache_manager_v2.py @@ -49,6 +49,7 @@ AttnLifeCycle, BatchDesc, BufferConfig, + BufferId, CacheLevel, CacheTierConfig, CuError, @@ -1924,17 +1925,15 @@ def get_index_k_buffer( if layer_idx not in self.layer_offsets: return None layer_offset = self.layer_offsets[layer_idx] - try: - addr = self.impl.get_mem_pool_base_address(layer_offset, Role.INDEX_KEY) - page_stride = self.impl.get_page_stride(layer_offset, Role.INDEX_KEY) - page_upper = self.impl.get_page_index_upper_bound(layer_offset, Role.INDEX_KEY) - converter = self.impl.get_page_index_converter(layer_offset, Role.INDEX_KEY) - except KeyError: - # INDEX_KEY not registered for this layer (default V2 manager - # registers only K/V/scale; sparse subclasses register - # INDEX_KEY only on sparse layers via - # ``_extra_buffers_per_layer``). + buffer_id = BufferId(layer_offset, Role.INDEX_KEY) + if buffer_id not in self.impl.all_buffer_ids: + # The default V2 manager registers only K/V/scale buffers; + # sparse subclasses register INDEX_KEY only on sparse layers. return None + addr = self.impl.get_mem_pool_base_address(layer_offset, Role.INDEX_KEY) + page_stride = self.impl.get_page_stride(layer_offset, Role.INDEX_KEY) + page_upper = self.impl.get_page_index_upper_bound(layer_offset, Role.INDEX_KEY) + converter = self.impl.get_page_index_converter(layer_offset, Role.INDEX_KEY) if isinstance(dtype, DataType): torch_dtype = binding_to_torch_dtype(dtype)