Skip to content

[TRTLLM-9409][feat] Pass MRoPE tensors for EPD disagg - #9758

Merged
2ez4bz merged 1 commit into
NVIDIA:mainfrom
2ez4bz:dev-qwen2.5-vl-epd
Dec 22, 2025
Merged

[TRTLLM-9409][feat] Pass MRoPE tensors for EPD disagg#9758
2ez4bz merged 1 commit into
NVIDIA:mainfrom
2ez4bz:dev-qwen2.5-vl-epd

Conversation

@2ez4bz

@2ez4bz 2ez4bz commented Dec 6, 2025

Copy link
Copy Markdown
Collaborator

Summary by CodeRabbit

  • New Features

    • Added Qwen2.5 VL model variant support
    • Introduced multimodal disaggregated processing with position encoding support
  • Improvements

    • Optimized data movement efficiency for multimodal operations
    • Enhanced result metadata handling for disaggregated execution scenarios
    • Improved vision encoder initialization flexibility

✏️ Tip: You can customize this high-level summary in your review settings.

Description

  • Why?

Certain VLMs like the Qwen family need more than just the multimodal
embeddings in the language model, and need MRoPE position IDs and
deltas. Prior to this commit, only the embeddings could be communicated
from the encoder worker to the prefill worker.

  • What?

This commit extends the DisaggregatedParams to include the MRoPE
information. It also adjusts several pieces of code required to
communicate that between E, P and D workers.

Closes TRTLLM-9409.

Test Coverage

PR Checklist

Please review the following before submitting your PR:

  • PR description clearly explains what and why. If using CodeRabbit's summary, please make sure it makes sense.

  • PR Follows TRT-LLM CODING GUIDELINES to the best of your knowledge.

  • Test cases are provided for new code paths (see test instructions)

  • Any new dependencies have been scanned for license and vulnerabilities

  • CODEOWNERS updated if ownership changes

  • Documentation updated as needed

  • Update tava architecture diagram if there is a significant design change in PR.

  • The reviewers assigned automatically/manually are appropriate for the PR.

  • Please check this after reviewing the above items as appropriate for this PR.

GitHub Bot Help

/bot [-h] ['run', 'kill', 'skip', 'reuse-pipeline'] ...

Provide a user friendly way for developers to interact with a Jenkins server.

Run /bot [-h|--help] to print this help message.

See details below for each supported subcommand.

Details

run [--reuse-test (optional)pipeline-id --disable-fail-fast --skip-test --stage-list "A10-PyTorch-1, xxx" --gpu-type "A30, H100_PCIe" --test-backend "pytorch, cpp" --add-multi-gpu-test --only-multi-gpu-test --disable-multi-gpu-test --post-merge --extra-stage "H100_PCIe-TensorRT-Post-Merge-1, xxx" --detailed-log --debug(experimental)]

Launch build/test pipelines. All previously running jobs will be killed.

--reuse-test (optional)pipeline-id (OPTIONAL) : Allow the new pipeline to reuse build artifacts and skip successful test stages from a specified pipeline or the last pipeline if no pipeline-id is indicated. If the Git commit ID has changed, this option will be always ignored. The DEFAULT behavior of the bot is to reuse build artifacts and successful test results from the last pipeline.

--disable-reuse-test (OPTIONAL) : Explicitly prevent the pipeline from reusing build artifacts and skipping successful test stages from a previous pipeline. Ensure that all builds and tests are run regardless of previous successes.

--disable-fail-fast (OPTIONAL) : Disable fail fast on build/tests/infra failures.

--skip-test (OPTIONAL) : Skip all test stages, but still run build stages, package stages and sanity check stages. Note: Does NOT update GitHub check status.

--stage-list "A10-PyTorch-1, xxx" (OPTIONAL) : Only run the specified test stages. Examples: "A10-PyTorch-1, xxx". Note: Does NOT update GitHub check status.

--gpu-type "A30, H100_PCIe" (OPTIONAL) : Only run the test stages on the specified GPU types. Examples: "A30, H100_PCIe". Note: Does NOT update GitHub check status.

--test-backend "pytorch, cpp" (OPTIONAL) : Skip test stages which don't match the specified backends. Only support [pytorch, cpp, tensorrt, triton]. Examples: "pytorch, cpp" (does not run test stages with tensorrt or triton backend). Note: Does NOT update GitHub pipeline status.

--only-multi-gpu-test (OPTIONAL) : Only run the multi-GPU tests. Note: Does NOT update GitHub check status.

--disable-multi-gpu-test (OPTIONAL) : Disable the multi-GPU tests. Note: Does NOT update GitHub check status.

--add-multi-gpu-test (OPTIONAL) : Force run the multi-GPU tests in addition to running L0 pre-merge pipeline.

--post-merge (OPTIONAL) : Run the L0 post-merge pipeline instead of the ordinary L0 pre-merge pipeline.

--extra-stage "H100_PCIe-TensorRT-Post-Merge-1, xxx" (OPTIONAL) : Run the ordinary L0 pre-merge pipeline and specified test stages. Examples: --extra-stage "H100_PCIe-TensorRT-Post-Merge-1, xxx".

--detailed-log (OPTIONAL) : Enable flushing out all logs to the Jenkins console. This will significantly increase the log volume and may slow down the job.

--debug (OPTIONAL) : Experimental feature. Enable access to the CI container for debugging purpose. Note: Specify exactly one stage in the stage-list parameter to access the appropriate container environment. Note: Does NOT update GitHub check status.

For guidance on mapping tests to stage names, see docs/source/reference/ci-overview.md
and the scripts/test_to_stage_mapping.py helper.

kill

kill

Kill all running builds associated with pull request.

skip

skip --comment COMMENT

Skip testing for latest commit on pull request. --comment "Reason for skipping build/test" is required. IMPORTANT NOTE: This is dangerous since lack of user care and validation can cause top of tree to break.

reuse-pipeline

reuse-pipeline

Reuse a previous pipeline to validate current commit. This action will also kill all currently running builds associated with the pull request. IMPORTANT NOTE: This is dangerous since lack of user care and validation can cause top of tree to break.

@2ez4bz
2ez4bz force-pushed the dev-qwen2.5-vl-epd branch from 671c8c1 to 365eb1c Compare December 6, 2025 00:34
Comment thread tensorrt_llm/_torch/pyexecutor/model_engine.py
Comment thread tensorrt_llm/_torch/pyexecutor/model_engine.py
Comment thread tensorrt_llm/llmapi/llm.py Outdated
Comment thread tensorrt_llm/llmapi/llm.py Outdated
Comment thread tensorrt_llm/llmapi/mm_encoder.py
Comment thread tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py Outdated
Comment thread tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py Outdated
Comment thread tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py Outdated
@2ez4bz
2ez4bz force-pushed the dev-qwen2.5-vl-epd branch from 365eb1c to a553c4b Compare December 6, 2025 00:36

@jaedeok-nvidia jaedeok-nvidia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Many thanks @2ez4bz for adding mrope support for multimodal EPD disagg serving. I've left several questions. Would you please take a look? In overall it looks good to me, although the detailed logic should be confirmed by Yechan and Chang.

Comment thread tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py Outdated
Comment thread tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py Outdated
Comment thread tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py Outdated
Comment thread tensorrt_llm/_torch/pyexecutor/llm_request.py Outdated
Comment thread tensorrt_llm/_torch/pyexecutor/llm_request.py Outdated
Comment thread tensorrt_llm/_torch/pyexecutor/model_engine.py
Comment thread tensorrt_llm/_torch/models/modeling_llava_next.py
@2ez4bz
2ez4bz force-pushed the dev-qwen2.5-vl-epd branch from a553c4b to 82a0a48 Compare December 8, 2025 23:38
Comment thread tensorrt_llm/llmapi/llm.py Outdated
Comment thread tensorrt_llm/_torch/models/modeling_qwen2vl.py Outdated
Comment thread tensorrt_llm/llmapi/llm.py
Comment thread tensorrt_llm/_torch/pyexecutor/sampler.py Outdated
Comment thread tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py
@2ez4bz
2ez4bz force-pushed the dev-qwen2.5-vl-epd branch from 82a0a48 to 0c02092 Compare December 11, 2025 00:12

@yechank-nvidia yechank-nvidia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thx for the work!

Comment thread tensorrt_llm/llmapi/llm.py Outdated
@2ez4bz
2ez4bz force-pushed the dev-qwen2.5-vl-epd branch 2 times, most recently from a956430 to c770297 Compare December 12, 2025 00:29
@2ez4bz 2ez4bz changed the title [WIP] EPD qwen2.5 VL [TRTLLM-9409][feat] Pass MRoPE tensors for EPD disagg Dec 12, 2025
@2ez4bz
2ez4bz marked this pull request as ready for review December 12, 2025 00:31
@2ez4bz
2ez4bz requested review from a team as code owners December 12, 2025 00:31
@coderabbitai

coderabbitai Bot commented Dec 12, 2025

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

This change introduces support for disaggregated multimodal handling with MRope position data propagation. New Qwen2.5 VL model support is added, multimodal encoders can be disabled during disaggregation, and MRope metadata is threaded through the executor pipeline with conditional device transfers. Test coverage is refactored to use direct model directory inputs instead of model-key-based lookups.

Changes

Cohort / File(s) Summary
Model Initialization & Disaggregation Support
tensorrt_llm/_torch/models/modeling_llava_next.py, tensorrt_llm/_torch/models/modeling_qwen2vl.py
Added explicit mm_encoder = None initialization in DISAGG-enabled branches to ensure attribute consistency. Introduced new Qwen2_5_VL model variant with dedicated Qwen2_5VLInputProcessorBase processor providing get_prompt_token_ids method to expand multimodal tokens into per-MM-token placeholders. Adjusted forward flow to use only num_contexts instead of generation-context handling.
MRope Position Data Storage
tensorrt_llm/_torch/pyexecutor/llm_request.py, tensorrt_llm/disaggregated_params.py, tensorrt_llm/executor/result.py
Added set_mrope_position method and properties mrope_position_ids_handle / mrope_position_deltas_handle to PyResult. Extended DisaggregatedParams with optional MRope handle fields. Updated GenerationResult.__repr__ to include MRope fields and modified multimodal handle processing to capture and propagate MRope metadata via dataclasses.replace.
Executor Data Pipeline & Optimization
tensorrt_llm/_torch/pyexecutor/model_engine.py
Conditional multimodal mrope\_data transfer to CUDA based on device of mrope_position_deltas. Partial pin_memory applied only for CPU-resident mrope tensors. Extended _forward_step_mm_encoder_only to propagate optional MRope fields alongside embeddings.
Sampler & Result Composition
tensorrt_llm/_torch/pyexecutor/sampler.py
Added extra_data optional dict field to MultimodalResult dataclass. Modified sample_async to wrap mm_embeddings and place remaining model outputs into extra_data. Extended update_requests to extract MRope metadata from extra_data and store via set_mrope_position on requests.
Public API Integration
tensorrt_llm/llmapi/llm.py
Hardened multimodal-disaggregated path with safe attribute check for support_mm_disagg. Assemble and pass multimodal_data including optional mrope_config with position IDs and deltas. Enforce that both MRope handles are provided together, raising RuntimeError if only one is supplied.
Code Cleanup
tensorrt_llm/llmapi/mm_encoder.py
Removed unused _item_at helper function and simplified loop iteration to directly iterate over inputs, eliminating enumeration-based indexing.
Test Refactoring
tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py
Replaced model-key based test flow with direct model directory inputs via _LLAVA_DIR and _QWEN_2_5_VL_DIR constants. Updated test signatures: test_single_image_chat(model_dir, pd_disagg) and test_multi_request_batch_chat(model_dir, encoder_max_batch_size). Removed multimodal_model_config fixture and simplified config handling. Fixed free_gpu_memory_fraction to 0.2.

Sequence Diagram(s)

sequenceDiagram
    participant Executor
    participant ModelEngine
    participant Sampler
    participant PyResult
    
    Executor->>ModelEngine: _prepare_tp_inputs(multimodal_params with mrope)
    alt CPU-resident mrope_position_deltas
        ModelEngine->>ModelEngine: to_device(multimodal_data)
    else GPU-resident mrope_position_deltas
        ModelEngine->>ModelEngine: skip transfer
    end
    
    ModelEngine->>ModelEngine: _forward_step_mm_encoder_only()
    ModelEngine->>Sampler: return mm_embeddings + mrope_position_ids/deltas
    
    Sampler->>Sampler: sample_async: wrap in MultimodalResult
    Sampler->>Sampler: pack mrope metadata into extra_data
    Sampler->>PyResult: update_requests: extract extra_data
    PyResult->>PyResult: set_mrope_position(ids, deltas)
    PyResult->>Executor: return LlmResult with mrope handles
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Areas requiring extra attention:

  • MRope data threading across executor pipeline — Verify correct propagation of mrope_position_ids and mrope_position_deltas from executor → model_engine → sampler → result; ensure optional field handling is consistent across all layers
  • Device transfer conditionals in model_engine.py — Review logic for pin_memory and device transfers; confirm that CPU vs. GPU checks correctly avoid redundant transfers and pinning operations
  • Qwen2.5 VL model variant registration — Ensure new processor registration with Qwen2_5VLInputProcessorBase for "qwen2_5_vl" model type does not conflict with existing Qwen2VLModel pathway and that token expansion logic is correct
  • DisaggregatedParams state mutations — Trace dataclasses.replace calls in result.py to verify request_type and multimodal_embedding_handles are correctly preserved/cleared during context vs. generation phases
  • MRope enforcement in llm.py — Validate that the RuntimeError raised when only one of the two MRope handles is provided covers all code paths where mrope_config is assembled
  • Test parameterization coverage — Confirm that model_dir and encoder_max_batch_size parameterization exercises both Llava and Qwen variants with varying batch sizes

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 29.03% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Description check ❓ Inconclusive The PR description explains the motivation (VLMs needing MRoPE data), the solution (extending DisaggregatedParams), and references the closed issue, but the Test Coverage section is empty and lacks specific test file references. Clearly specify which test files validate the MRoPE tensor passing functionality across the encoder-prefill-decoder workers to demonstrate adequate test coverage.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: passing MRoPE tensors for EPD (Encoder-Prefill-Decoder) disaggregation, which aligns with the core modifications across multiple files.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (7)
tensorrt_llm/_torch/pyexecutor/sampler.py (1)

258-271: Avoid mutating model_outputs via pop(); build extra_data without side effects.

model_outputs.pop("mm_embeddings") can break callers if they reuse model_outputs after sampling.

@@
-        data = MultimodalResult(
-            mm_embeddings=model_outputs.pop("mm_embeddings"),
-            extra_data={**model_outputs},
-        )
+        mm_embeddings = model_outputs["mm_embeddings"]
+        extra_data = {k: v for k, v in model_outputs.items() if k != "mm_embeddings"}
+        data = MultimodalResult(
+            mm_embeddings=mm_embeddings,
+            extra_data=(extra_data or None),
+        )
tensorrt_llm/executor/result.py (1)

438-456: Guard optional mRoPE fields + fix tuple assignment to multimodal_embedding_handles.

  1. response_result.mrope_position_*_handle should be accessed via getattr (like mm_embedding_handle) to avoid AttributeError on models that don’t return it.
  2. The trailing comma makes multimodal_embedding_handles a tuple.
@@
             if hasattr(response_result, 'mm_embedding_handle'
                        ) and response_result.mm_embedding_handle is not None:
                 self._mm_embedding_handle = response_result.mm_embedding_handle
-                mrope_position_ids_handle = response_result.mrope_position_ids_handle
-                mrope_position_deltas_handle = response_result.mrope_position_deltas_handle
+                mrope_position_ids_handle = getattr(response_result, "mrope_position_ids_handle", None)
+                mrope_position_deltas_handle = getattr(response_result, "mrope_position_deltas_handle", None)
                 if self.disaggregated_params is not None:
-                    self.disaggregated_params.multimodal_embedding_handles = [
-                        response_result.mm_embedding_handle
-                    ],
+                    self.disaggregated_params.multimodal_embedding_handles = [
+                        response_result.mm_embedding_handle
+                    ]
                     self.disaggregated_params.multimodal_hashes = self._multimodal_hashes
                 else:
                     self.disaggregated_params = DisaggregatedParams(
                         multimodal_embedding_handles=[
                             response_result.mm_embedding_handle
                         ],
                         multimodal_hashes=self._multimodal_hashes)
-                self.disaggregated_params.mrope_position_ids_handle = mrope_position_ids_handle
-                self.disaggregated_params.mrope_position_deltas_handle = mrope_position_deltas_handle
+                if mrope_position_ids_handle is not None or mrope_position_deltas_handle is not None:
+                    self.disaggregated_params.mrope_position_ids_handle = mrope_position_ids_handle
+                    self.disaggregated_params.mrope_position_deltas_handle = mrope_position_deltas_handle
tensorrt_llm/_torch/pyexecutor/model_engine.py (3)

1-1: Add missing NVIDIA copyright header (current year) at file top.

Per coding guidelines for **/*.{cpp,h,cu,py}, this file should have the NVIDIA header (with 2025) before imports.


1938-1946: Potential crash: torch.cat(mrope_position_ids, ...) can see mixed CPU/CUDA tensors.

With mixed scheduling (some requests already in generation with recovered CUDA MRoPE tensors, others new context with CPU MRoPE tensors), torch.cat(...) will throw a device mismatch.

One low-impact fix is to normalize all mrope_position_ids to a single device before concatenation (prefer CUDA if any are CUDA):

-            mrope_position_ids = torch.cat(mrope_position_ids, dim=-1)
-            if mrope_position_ids.device.type == "cpu":
-                mrope_position_ids = mrope_position_ids.pin_memory()
+            # Normalize to a single device to avoid cat() device-mismatch in mixed batches.
+            if any(t.device.type == "cuda" for t in mrope_position_ids):
+                target_device = self.mrope_position_ids_cuda.device
+                normalized = []
+                for t in mrope_position_ids:
+                    if t.device != target_device:
+                        if t.device.type == "cpu":
+                            t = t.pin_memory().to(target_device, non_blocking=True)
+                        else:
+                            t = t.to(target_device)
+                    normalized.append(t)
+                mrope_position_ids = torch.cat(normalized, dim=-1)
+            else:
+                mrope_position_ids = torch.cat(mrope_position_ids, dim=-1).pin_memory()

2805-2814: Keep mm-encoder-only output schema consistent (always include logits).

You now return {'mm_embeddings': ..., 'logits': None, ...} but the “no multimodal data” early-return still returns only {'mm_embeddings': []}. Suggest:

-            return {'mm_embeddings': []}
+            return {'mm_embeddings': [], 'logits': None}

Also applies to: 2840-2860

tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py (1)

1-1: Add missing NVIDIA copyright header (current year) at file top.

Per coding guidelines for **/*.{cpp,h,cu,py}, tests should also carry the NVIDIA header (with 2025).

tensorrt_llm/_torch/models/modeling_qwen2vl.py (1)

1-1: Add missing NVIDIA copyright header (current year) at file top.

Per coding guidelines for **/*.{cpp,h,cu,py}, this file should have the NVIDIA header (with 2025) before imports.

🧹 Nitpick comments (4)
tensorrt_llm/disaggregated_params.py (1)

43-44: Consider adding validation in __post_init__ for consistency.

The code in llm.py (lines 447, 467-470) enforces that both mrope_position_ids_handle and mrope_position_deltas_handle must be provided together or both be None. Consider adding this validation here in __post_init__ to fail fast with a clear error message, similar to the existing validation for multimodal_embedding_handles and multimodal_hashes.

     def __post_init__(self):
         if self.request_type is not None:
             self.request_type = self.request_type.lower()
             if self.request_type not in [
                 "context_only",
                 "generation_only",
                 "context_and_generation",
             ]:
                 raise ValueError(
                     f"Unknown request type: {self.request_type}. Must be context_only, generation_only or "
                     "context_and_generation"
                 )
+        # Validate mrope handles are both present or both None
+        if (self.mrope_position_ids_handle is None) != (self.mrope_position_deltas_handle is None):
+            raise ValueError(
+                "mrope_position_ids_handle and mrope_position_deltas_handle must both be provided or both be None"
+            )
         if self.multimodal_embedding_handles is not None:
tensorrt_llm/_torch/pyexecutor/sampler.py (1)

199-207: Public MultimodalResult.extra_data should be documented via docstring/field doc, not a line comment.

Per coding guidelines (“prefer docstrings over comments” for public interfaces), consider turning the comment into a class docstring or a field doc block.

tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py (1)

126-130: Avoid mutating inputs in-place for the decode step (test robustness).

Consider creating a shallow copy for the decode call so future assertions/extensions don’t accidentally depend on the mutated state:

-        inputs[0]['multi_modal_data'] = None
-        inputs[0]['prompt_token_ids'] = outputs[0].prompt_token_ids
+        decode_inputs = [dict(inputs[0])]
+        decode_inputs[0]['multi_modal_data'] = None
+        decode_inputs[0]['prompt_token_ids'] = outputs[0].prompt_token_ids
...
-        outputs = llm_decode.generate(
-            inputs,
+        outputs = llm_decode.generate(
+            decode_inputs,
             sampling_params=sampling_params,
             disaggregated_params=pd_disaggregated_params)
tensorrt_llm/_torch/models/modeling_qwen2vl.py (1)

1051-1126: Harden get_prompt_token_ids (avoid assert for user/input validation; address TRY003).

Assertions can be optimized out; for input validation, explicit exceptions are safer. Also ruff TRY003 is currently flagging the raised exceptions.

-        hidden_size = mm_handles[0]['tensor_size'][1]
-        assert hidden_size == self.config.text_config.hidden_size, "Multimodal embedding hidden size must match model hidden size"
+        hidden_size = mm_handles[0]["tensor_size"][1]
+        if hidden_size != self.config.text_config.hidden_size:
+            raise ValueError("Multimodal embedding hidden size must match model hidden size")
...
-        assert write_pos == final_length, f"Write position mismatch: {write_pos} != {final_length}"
-        assert mm_token_length[-1] + mm_token_offsets[
-            -1] <= final_length, f"mm_token_length[-1] + mm_token_offsets[-1] ({mm_token_length[-1] + mm_token_offsets[-1]}) should be less than or equal to final_length ({final_length})"
+        if write_pos != final_length:
+            raise RuntimeError(f"Write position mismatch: {write_pos} != {final_length}")
+        if mm_token_length[-1] + mm_token_offsets[-1] > final_length:
+            raise RuntimeError("Expanded multimodal placeholders exceed final token length")
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4f6d4da and c770297.

📒 Files selected for processing (10)
  • tensorrt_llm/_torch/models/modeling_llava_next.py (1 hunks)
  • tensorrt_llm/_torch/models/modeling_qwen2vl.py (4 hunks)
  • tensorrt_llm/_torch/pyexecutor/llm_request.py (4 hunks)
  • tensorrt_llm/_torch/pyexecutor/model_engine.py (3 hunks)
  • tensorrt_llm/_torch/pyexecutor/sampler.py (5 hunks)
  • tensorrt_llm/disaggregated_params.py (1 hunks)
  • tensorrt_llm/executor/result.py (5 hunks)
  • tensorrt_llm/llmapi/llm.py (3 hunks)
  • tensorrt_llm/llmapi/mm_encoder.py (1 hunks)
  • tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py (6 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.py

📄 CodeRabbit inference engine (CODING_GUIDELINES.md)

**/*.py: The code developed for TensorRT-LLM should conform to Python 3.8+
Indent Python code with 4 spaces; do not use tabs
Always maintain the namespace when importing in Python, even if only one class or function from a module is used (e.g., use from package.subpackage import foo and then foo.SomeClass() instead of from package.subpackage.foo import SomeClass)
Python filenames should use snake_case (e.g., some_file.py)
Python class names should use PascalCase (e.g., class SomeClass)
Python function and method names should use snake_case (e.g., def my_awesome_function():)
Python local variable names should use snake_case, with prefix k for variable names that start with a number (e.g., k_99th_percentile = ...)
Python global variables should use upper snake_case with prefix G (e.g., G_MY_GLOBAL = ...)
Python constants should use upper snake_case (e.g., MY_CONSTANT = ...)
Avoid shadowing variables declared in an outer scope in Python
Initialize all externally visible members of a Python class in the constructor
For Python interfaces that may be used outside a file, prefer docstrings over comments
Python comments should be reserved for code within a function, or interfaces that are local to a file
Use Google style docstrings for Python classes and functions, which can be parsed by Sphinx
Python attributes and variables can be documented inline with type and description (e.g., self.x = 5 followed by """<type>: Description of 'x'""" )
Avoid using reflection in Python when functionality can be easily achieved without reflection
When using try-except blocks in Python, limit the except clause to the smallest set of specific errors possible instead of catching all exceptions
When using try-except blocks in Python to handle multiple possible variable types (duck-typing), keep the body of the try as small as possible and use the else block to implement the logic

Files:

  • tensorrt_llm/disaggregated_params.py
  • tensorrt_llm/llmapi/mm_encoder.py
  • tensorrt_llm/_torch/models/modeling_llava_next.py
  • tensorrt_llm/_torch/pyexecutor/sampler.py
  • tensorrt_llm/_torch/pyexecutor/llm_request.py
  • tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py
  • tensorrt_llm/llmapi/llm.py
  • tensorrt_llm/_torch/pyexecutor/model_engine.py
  • tensorrt_llm/_torch/models/modeling_qwen2vl.py
  • tensorrt_llm/executor/result.py
**/*.{cpp,h,cu,py}

📄 CodeRabbit inference engine (CODING_GUIDELINES.md)

All TensorRT-LLM Open Source Software code files should contain an NVIDIA copyright header that includes the current year at the top

Files:

  • tensorrt_llm/disaggregated_params.py
  • tensorrt_llm/llmapi/mm_encoder.py
  • tensorrt_llm/_torch/models/modeling_llava_next.py
  • tensorrt_llm/_torch/pyexecutor/sampler.py
  • tensorrt_llm/_torch/pyexecutor/llm_request.py
  • tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py
  • tensorrt_llm/llmapi/llm.py
  • tensorrt_llm/_torch/pyexecutor/model_engine.py
  • tensorrt_llm/_torch/models/modeling_qwen2vl.py
  • tensorrt_llm/executor/result.py
🧠 Learnings (14)
📚 Learning: 2025-08-14T15:38:01.771Z
Learnt from: MatthiasKohl
Repo: NVIDIA/TensorRT-LLM PR: 6904
File: cpp/tensorrt_llm/pybind/thop/bindings.cpp:55-57
Timestamp: 2025-08-14T15:38:01.771Z
Learning: In TensorRT-LLM Python bindings, tensor parameter collections like mla_tensor_params and spec_decoding_tensor_params are kept as required parameters without defaults to maintain API consistency, even when it might affect backward compatibility.

Applied to files:

  • tensorrt_llm/disaggregated_params.py
  • tensorrt_llm/_torch/pyexecutor/sampler.py
  • tensorrt_llm/llmapi/llm.py
📚 Learning: 2025-07-22T09:22:14.726Z
Learnt from: yechank-nvidia
Repo: NVIDIA/TensorRT-LLM PR: 6254
File: tensorrt_llm/_torch/pyexecutor/model_engine.py:1201-1204
Timestamp: 2025-07-22T09:22:14.726Z
Learning: In TensorRT-LLM's multimodal processing pipeline, shared tensor recovery using `from_shared_tensor()` is only needed during the context phase. Generation requests reuse the already-recovered tensor data and only need to call `strip_for_generation()` to remove unnecessary multimodal data while preserving the recovered tensors. This avoids redundant tensor recovery operations during generation.

Applied to files:

  • tensorrt_llm/llmapi/mm_encoder.py
  • tensorrt_llm/llmapi/llm.py
  • tensorrt_llm/_torch/pyexecutor/model_engine.py
  • tensorrt_llm/executor/result.py
📚 Learning: 2025-08-14T06:36:40.701Z
Learnt from: timlee0212
Repo: NVIDIA/TensorRT-LLM PR: 6886
File: tensorrt_llm/_torch/models/modeling_deepseekv3.py:0-0
Timestamp: 2025-08-14T06:36:40.701Z
Learning: In DeepSeek V3 model (tensorrt_llm/_torch/models/modeling_deepseekv3.py), the disagreement between AllReduce.__init__ guard and _compute_mlp_tp_size logic for MNNVL usage is expected by design. The AllReduce component and MLP TP-size computation intentionally use different criteria for MNNVL availability decisions.

Applied to files:

  • tensorrt_llm/_torch/models/modeling_llava_next.py
  • tensorrt_llm/llmapi/llm.py
  • tensorrt_llm/_torch/models/modeling_qwen2vl.py
📚 Learning: 2025-07-28T17:06:08.621Z
Learnt from: moraxu
Repo: NVIDIA/TensorRT-LLM PR: 6303
File: tests/integration/test_lists/qa/examples_test_list.txt:494-494
Timestamp: 2025-07-28T17:06:08.621Z
Learning: In TensorRT-LLM testing, it's common to have both CLI flow tests (test_cli_flow.py) and PyTorch API tests (test_llm_api_pytorch.py) for the same model. These serve different purposes: CLI flow tests validate the traditional command-line workflow, while PyTorch API tests validate the newer LLM API backend. Both are legitimate and should coexist.

Applied to files:

  • tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py
  • tensorrt_llm/llmapi/llm.py
📚 Learning: 2025-08-11T20:09:24.389Z
Learnt from: achartier
Repo: NVIDIA/TensorRT-LLM PR: 6763
File: tests/integration/defs/triton_server/conftest.py:16-22
Timestamp: 2025-08-11T20:09:24.389Z
Learning: In the TensorRT-LLM test infrastructure, the team prefers simple, direct solutions (like hard-coding directory traversal counts) over more complex but robust approaches when dealing with stable directory structures. They accept the maintenance cost of updating tests if the layout changes.

Applied to files:

  • tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py
📚 Learning: 2025-09-09T09:40:45.658Z
Learnt from: fredricz-20070104
Repo: NVIDIA/TensorRT-LLM PR: 7645
File: tests/integration/test_lists/qa/llm_function_core.txt:648-648
Timestamp: 2025-09-09T09:40:45.658Z
Learning: In TensorRT-LLM test lists, it's common and intentional for the same test to appear in multiple test list files when they serve different purposes (e.g., llm_function_core.txt for comprehensive core functionality testing and llm_function_core_sanity.txt for quick sanity checks). This duplication allows tests to be run in different testing contexts.

Applied to files:

  • tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py
📚 Learning: 2025-09-03T13:16:38.028Z
Learnt from: nvpohanh
Repo: NVIDIA/TensorRT-LLM PR: 7478
File: tests/unittest/_torch/modeling/test_modeling_llama_min_latency.py:286-308
Timestamp: 2025-09-03T13:16:38.028Z
Learning: In test files, temporary monkey-patches for upstream bugs can be kept simple when they are explicitly intended to be removed soon, rather than investing effort in making them more robust.

Applied to files:

  • tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py
📚 Learning: 2025-08-20T06:56:02.889Z
Learnt from: eopXD
Repo: NVIDIA/TensorRT-LLM PR: 6768
File: cpp/tensorrt_llm/batch_manager/kvCacheManager.cpp:577-579
Timestamp: 2025-08-20T06:56:02.889Z
Learning: In cpp/tensorrt_llm/batch_manager/kvCacheManager.cpp, maxSequenceLength is now enforced as a non-optional argument in the BlockManager constructor, so concerns about std::nullopt defaulting to 0 are not applicable. When windowSize > maxSequenceLength, a warning should be added instead of handling optional parameter cases.

Applied to files:

  • tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py
📚 Learning: 2025-08-13T08:21:13.006Z
Learnt from: dbari
Repo: NVIDIA/TensorRT-LLM PR: 6714
File: tests/integration/defs/triton_server/build_model.sh:724-726
Timestamp: 2025-08-13T08:21:13.006Z
Learning: Mistral Small 3.1 multimodal (pixtral model type) supports any batch size for the multimodal encoder, not just batch size 1. The max_batch_size parameter can be set to values like 2 without conflicts with the runtime batching logic.

Applied to files:

  • tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py
📚 Learning: 2025-08-21T02:39:12.009Z
Learnt from: djns99
Repo: NVIDIA/TensorRT-LLM PR: 7104
File: cpp/tensorrt_llm/kernels/cutlass_kernels/moe_gemm/moe_kernels.cu:1475-1480
Timestamp: 2025-08-21T02:39:12.009Z
Learning: The min latency mode functionality in TensorRT-LLM MOE kernels (cpp/tensorrt_llm/kernels/cutlass_kernels/moe_gemm/moe_kernels.cu) is deprecated and no longer being maintained/updated, as confirmed by djns99. Bug reports and optimization suggestions for the computeStridesTmaWarpSpecializedLowLatencyKernel and related min latency code paths should be deprioritized.

Applied to files:

  • tensorrt_llm/llmapi/llm.py
📚 Learning: 2025-08-14T15:43:23.107Z
Learnt from: MatthiasKohl
Repo: NVIDIA/TensorRT-LLM PR: 6904
File: tensorrt_llm/_torch/attention_backend/trtllm.py:259-262
Timestamp: 2025-08-14T15:43:23.107Z
Learning: In TensorRT-LLM's attention backend, tensor parameters in the plan() method are assigned directly without validation (dtype, device, contiguity checks). This maintains consistency across all tensor inputs and follows the pattern of trusting callers to provide correctly formatted tensors.

Applied to files:

  • tensorrt_llm/llmapi/llm.py
📚 Learning: 2025-08-19T12:45:11.997Z
Learnt from: amitz-nv
Repo: NVIDIA/TensorRT-LLM PR: 7033
File: tensorrt_llm/_torch/pyexecutor/model_engine.py:0-0
Timestamp: 2025-08-19T12:45:11.997Z
Learning: In tensorrt_llm/_torch/pyexecutor/model_engine.py, DoRA (Delta Orthogonal Rank Adaptation) functionality was removed from the PyTorch flow to eliminate issues with inverted DoRA detection logic. The original is_dora condition was checking if scaling_vec_pointer == 0, which was potentially incorrect.

Applied to files:

  • tensorrt_llm/_torch/pyexecutor/model_engine.py
📚 Learning: 2025-08-19T12:45:35.429Z
Learnt from: amitz-nv
Repo: NVIDIA/TensorRT-LLM PR: 7033
File: tensorrt_llm/_torch/pyexecutor/model_engine.py:2086-2092
Timestamp: 2025-08-19T12:45:35.429Z
Learning: DoRA (Delta Orthogonal Rank Adaptation) functionality has been removed from the PyTorch flow in tensorrt_llm/_torch/pyexecutor/model_engine.py. The is_dora field is computed but not used downstream in the PyTorch flow, so converting it to a tensor would be wasteful overhead.

Applied to files:

  • tensorrt_llm/_torch/pyexecutor/model_engine.py
📚 Learning: 2025-08-26T06:07:02.166Z
Learnt from: shaharmor98
Repo: NVIDIA/TensorRT-LLM PR: 7231
File: tensorrt_llm/_torch/pyexecutor/_util.py:504-509
Timestamp: 2025-08-26T06:07:02.166Z
Learning: In tensorrt_llm/_torch/pyexecutor/_util.py, when calling model_engine.set_lora_model_config(), pass model_binding_config.mlp_hidden_size directly without multiplying by mapping.tp_size, as the mlp_hidden_size from get_bindings_model_config() is already the per-TP rank value needed for LoRA weight packaging.

Applied to files:

  • tensorrt_llm/_torch/pyexecutor/model_engine.py
🧬 Code graph analysis (6)
tensorrt_llm/disaggregated_params.py (1)
tensorrt_llm/_torch/pyexecutor/llm_request.py (2)
  • mrope_position_ids_handle (368-371)
  • mrope_position_deltas_handle (374-377)
tensorrt_llm/llmapi/mm_encoder.py (1)
triton_backend/all_models/tests/test_llmapi_python_backend.py (1)
  • inputs (135-153)
tensorrt_llm/llmapi/llm.py (2)
tensorrt_llm/_torch/pyexecutor/llm_request.py (3)
  • mrope_position_ids_handle (368-371)
  • mrope_position_deltas_handle (374-377)
  • get (129-147)
tensorrt_llm/inputs/multimodal.py (1)
  • MultimodalParams (197-521)
tensorrt_llm/_torch/pyexecutor/model_engine.py (1)
tensorrt_llm/inputs/multimodal.py (1)
  • to_device (405-449)
tensorrt_llm/_torch/models/modeling_qwen2vl.py (2)
tensorrt_llm/inputs/registry.py (7)
  • register_input_processor (544-570)
  • support_multimodal_disaggregated (514-541)
  • config (173-175)
  • config (343-344)
  • tokenizer (167-169)
  • tokenizer (338-339)
  • dtype (179-181)
tensorrt_llm/_torch/models/modeling_llava_next.py (4)
  • get_prompt_token_ids (170-243)
  • config (69-70)
  • tokenizer (73-74)
  • dtype (85-86)
tensorrt_llm/executor/result.py (1)
tensorrt_llm/_torch/pyexecutor/llm_request.py (2)
  • mrope_position_ids_handle (368-371)
  • mrope_position_deltas_handle (374-377)
🪛 Ruff (0.14.8)
tensorrt_llm/_torch/pyexecutor/sampler.py

288-288: zip() without an explicit strict= parameter

Add explicit value for parameter strict=

(B905)

tensorrt_llm/llmapi/llm.py

468-470: Avoid specifying long messages outside the exception class

(TRY003)

tensorrt_llm/_torch/models/modeling_qwen2vl.py

1073-1073: Avoid specifying long messages outside the exception class

(TRY003)


1076-1076: Avoid specifying long messages outside the exception class

(TRY003)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Pre-commit Check
🔇 Additional comments (13)
tensorrt_llm/_torch/pyexecutor/llm_request.py (4)

265-266: LGTM!

Instance variables follow the existing pattern for _mm_embeddings and are properly initialized to None.


298-306: LGTM!

The set_mrope_position method correctly wraps tensors in SharedTensorContainer and dumps to dict, following the same pattern as append_mm_embeddings. The parentheses around the SharedTensorContainer calls are unnecessary but don't affect functionality.


367-377: LGTM!

The new properties follow the same pattern as mm_embedding_handle and include helpful docstring notes explaining how to rebuild the SharedTensorContainer from the returned dict.


406-410: LGTM!

The py_result_properties frozenset is correctly updated to include the new mrope handle properties, enabling access through LlmResult.__getattr__.

tensorrt_llm/llmapi/mm_encoder.py (1)

105-107: LGTM!

The loop refactor from enumeration to direct iteration is cleaner since the index is not used. This aligns with the removal of the unused _item_at helper function.

tensorrt_llm/llmapi/llm.py (3)

92-98: LGTM!

Formatting change only - the _repr_fields list items are now on separate lines for better readability.


427-427: LGTM!

Using getattr(..., False) is safer than direct attribute access, preventing AttributeError if support_mm_disagg is not defined on the input processor.


444-457: LGTM!

The mrope_config construction follows a clear pattern: check if mrope_position_ids_handle is present, assert that mrope_position_deltas_handle is also present (since they must come as a pair), then build the config dict. The assertion is appropriate here since this is an internal invariant.

tensorrt_llm/_torch/pyexecutor/sampler.py (1)

284-305: [Rewritten review comment]
[Classification tag]

tensorrt_llm/_torch/pyexecutor/model_engine.py (1)

1699-1714: CPU-only to_device() for mrope_position_deltas is a good fix.

Guarding the transfer by device.type == "cpu" avoids calling pin/transfer paths on CUDA tensors (which matches the earlier rationale in past review notes).

tests/unittest/_torch/multimodal/test_mm_encoder_standalone.py (2)

21-29: Model-dir based parameterization + constructor updates look good.

This removes the model-key indirection and makes the test matrix explicit.

Also applies to: 52-65, 68-73


174-184: Encoder max-batch-size matrix is a pragmatic way to encode model quirks.

The explicit (model_dir, encoder_max_batch_size) pairing is much easier to track than conditional skips/config plumbing.

Also applies to: 206-213

tensorrt_llm/_torch/models/modeling_qwen2vl.py (1)

978-978: num_context_requests = attn_metadata.num_contexts looks right for disagg threading.

This avoids mixing generation requests into the “context embeddings/mrope” preparation slice.

Comment thread tensorrt_llm/_torch/models/modeling_llava_next.py
Comment thread tensorrt_llm/_torch/models/modeling_qwen2vl.py
Comment thread tensorrt_llm/executor/result.py
Comment thread tensorrt_llm/executor/result.py
Comment thread tensorrt_llm/executor/result.py
Comment thread tensorrt_llm/llmapi/llm.py Outdated

@achartier achartier left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM for the pyexecutor part, but needs to address the coderabbit comments.

@2ez4bz
2ez4bz force-pushed the dev-qwen2.5-vl-epd branch from c770297 to df2c5b1 Compare December 12, 2025 06:06
@2ez4bz 2ez4bz changed the title [TRTLLM-9409][feat] Pass MRoPE tensors for EPD disagg [TRTLLM-9409][feat] Pass MRoPE tensors for EPD disagg Dec 12, 2025
@2ez4bz

2ez4bz commented Dec 12, 2025

Copy link
Copy Markdown
Collaborator Author

/bot run

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #27990 [ run ] triggered by Bot. Commit: df2c5b1

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #29188 [ run ] triggered by Bot. Commit: 64d4eee

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #29188 [ run ] completed with state SUCCESS. Commit: 64d4eee
/LLM/main/L0_MergeRequest_PR pipeline #22392 completed with status: 'FAILURE'

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

@reasonsolo

Copy link
Copy Markdown
Collaborator

@2ez4bz Could you rebase your PR then rerun the pipeline? test_auto_scaling is fixed in #9845, but you haven't rebased this PR for 3 days.

@reasonsolo

Copy link
Copy Markdown
Collaborator

/bot run

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #29205 [ run ] triggered by Bot. Commit: 93dec2b

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #29205 [ run ] completed with state SUCCESS. Commit: 93dec2b
/LLM/main/L0_MergeRequest_PR pipeline #22408 completed with status: 'FAILURE'

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

@2ez4bz

2ez4bz commented Dec 20, 2025

Copy link
Copy Markdown
Collaborator Author

/bot run

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #29212 [ run ] triggered by Bot. Commit: 93dec2b

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #29212 [ run ] completed with state SUCCESS. Commit: 93dec2b
/LLM/main/L0_MergeRequest_PR pipeline #22415 completed with status: 'FAILURE'

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

@2ez4bz

2ez4bz commented Dec 21, 2025

Copy link
Copy Markdown
Collaborator Author

/bot run

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #29290 [ run ] triggered by Bot. Commit: 93dec2b

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #29290 [ run ] completed with state SUCCESS. Commit: 93dec2b
/LLM/main/L0_MergeRequest_PR pipeline #22488 completed with status: 'FAILURE'

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

* Why?

Certain VLMs like the Qwen family need more than just the multimodal
embeddings in the language model, and need MRoPE position IDs and
deltas. Prior to this commit, only the embeddings could be communicated
from the encoder worker to the prefill worker.

* What?

This commit extends the `DisaggregatedParams` to include the MRoPE
information. It also adjusts several pieces of code required to
communicate that between E, P and D workers.

Closes TRTLLM-9409.

Signed-off-by: William Zhang <133824995+2ez4bz@users.noreply.github.com>
@2ez4bz
2ez4bz force-pushed the dev-qwen2.5-vl-epd branch from 93dec2b to d0a511f Compare December 21, 2025 22:30
@2ez4bz

2ez4bz commented Dec 21, 2025

Copy link
Copy Markdown
Collaborator Author

/bot run

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #29329 [ run ] triggered by Bot. Commit: d0a511f

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #29329 [ run ] completed with state SUCCESS. Commit: d0a511f
/LLM/main/L0_MergeRequest_PR pipeline #22521 completed with status: 'FAILURE'

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

@2ez4bz

2ez4bz commented Dec 22, 2025

Copy link
Copy Markdown
Collaborator Author

/bot run

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #29341 [ run ] triggered by Bot. Commit: d0a511f

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #29341 [ run ] completed with state SUCCESS. Commit: d0a511f
/LLM/main/L0_MergeRequest_PR pipeline #22533 completed with status: 'FAILURE'

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

@2ez4bz

2ez4bz commented Dec 22, 2025

Copy link
Copy Markdown
Collaborator Author

/bot run

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #29383 [ run ] triggered by Bot. Commit: d0a511f

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #29383 [ run ] completed with state SUCCESS. Commit: d0a511f
/LLM/main/L0_MergeRequest_PR pipeline #22571 completed with status: 'SUCCESS'

@2ez4bz
2ez4bz merged commit a6a8898 into NVIDIA:main Dec 22, 2025
5 checks passed
@2ez4bz

2ez4bz commented Dec 22, 2025

Copy link
Copy Markdown
Collaborator Author

first try

codego7250 pushed a commit to codego7250/TensorRT-LLM that referenced this pull request Dec 22, 2025
* Why?

Certain VLMs like the Qwen family need more than just the multimodal
embeddings in the language model, and need MRoPE position IDs and
deltas. Prior to this commit, only the embeddings could be communicated
from the encoder worker to the prefill worker.

* What?

This commit extends the `DisaggregatedParams` to include the MRoPE
information. It also adjusts several pieces of code required to
communicate that between E, P and D workers.

Closes TRTLLM-9409.

Signed-off-by: William Zhang <133824995+2ez4bz@users.noreply.github.com>
JunyiXu-nv pushed a commit to JunyiXu-nv/TensorRT-LLM that referenced this pull request Dec 30, 2025
* Why?

Certain VLMs like the Qwen family need more than just the multimodal
embeddings in the language model, and need MRoPE position IDs and
deltas. Prior to this commit, only the embeddings could be communicated
from the encoder worker to the prefill worker.

* What?

This commit extends the `DisaggregatedParams` to include the MRoPE
information. It also adjusts several pieces of code required to
communicate that between E, P and D workers.

Closes TRTLLM-9409.

Signed-off-by: William Zhang <133824995+2ez4bz@users.noreply.github.com>
videodanchik pushed a commit to videodanchik/TensorRT-LLM that referenced this pull request Jan 14, 2026
* Why?

Certain VLMs like the Qwen family need more than just the multimodal
embeddings in the language model, and need MRoPE position IDs and
deltas. Prior to this commit, only the embeddings could be communicated
from the encoder worker to the prefill worker.

* What?

This commit extends the `DisaggregatedParams` to include the MRoPE
information. It also adjusts several pieces of code required to
communicate that between E, P and D workers.

Closes TRTLLM-9409.

Signed-off-by: William Zhang <133824995+2ez4bz@users.noreply.github.com>
Signed-off-by: Daniil Kulko <kulkodaniil@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants