Skip to content

Conversation

@karthikvetrivel
Copy link
Member

@karthikvetrivel karthikvetrivel commented Dec 19, 2025

Description

Fixes #10170 AutoDeploy compilation failures for IBM Granite MoE models (e.g., ibm-granite/granite-3.1-3b-a800m-instruct) with the error:

"Cannot copy out of meta tensor; no data!"

Root Cause: GraniteMoeTopKGating calls .tolist() on a tensor, which is:

  1. Incompatible with meta tensors (no data to access)
  2. Incompatible with torch.compile/export

Solution: Adds a new export patch (hf_granitemoe_moe) that rewrites the MoE forward pass.

Test Coverage

  1. Ran both original and patched forward with real tensors on CPU — compared for numerical accuracy.
  2. Tested that the patch enables successful torch.export of the full model, which was previously failing with the "Cannot copy out of meta tensor" error.
  3. Verified the patch correctly applies and reverts, restoring the original method after use.

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.

Summary by CodeRabbit

  • New Features
    • Enhanced torch.export compatibility for Granite MoE models, enabling optimized model export and improved deployment capabilities.

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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 19, 2025

📝 Walkthrough

Walkthrough

A new patch module is introduced that rewrites GraniteMoeMoE.forward to be export-compatible by replacing data-dependent operations with a torch_moe custom op, computing router logits directly, selecting top-k routes, and constructing appropriately formatted weight tensors.

Changes

Cohort / File(s) Summary
New MoE Export Patch
tensorrt_llm/_torch/auto_deploy/models/patches/granitemoe.py
Introduces GraniteMoePatch class with _apply_patch and _revert_patch methods to replace and restore GraniteMoeMoE.forward. Implements _forward_moe helper that computes router logits, performs top-k selection, builds stacked weight tensors, and invokes torch_moe op. Registers patch via ExportPatchRegistry with identifier "hf_granitemoe_moe". Includes detailed docstring documenting export incompatibilities and the export-compatible approach.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20–25 minutes

  • torch_moe op integration: Verify correct parameter passing, expected tensor formats, and compatibility with MoE semantics
  • Export compatibility: Confirm all data-dependent operations are eliminated and torch.export constraints are satisfied
  • Weight tensor construction: Validate correctness of w1/w3 stacked tensor building for torch_moe consumption
  • Patch registry mechanism: Ensure proper registration and patch application/reversion logic

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Title check ✅ Passed The title clearly describes the main change: adding an export patch for GraniteMoe MoE models to enable torch.export compatibility, which directly addresses the PR's core objective.
Description check ✅ Passed PR description covers the issue, root cause, and solution clearly. It includes GitHub issue reference, specific error message, test coverage details, and the checklist is completed.
✨ 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.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (2)
tensorrt_llm/_torch/auto_deploy/models/patches/granitemoe.py (2)

19-19: Add return type hint.

The function signature is missing a return type hint. Based on line 62, the function returns a tuple of tensors:

-def _forward_moe(self, layer_input: torch.Tensor):
+def _forward_moe(self, layer_input: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]:

35-35: Consider using dim=-1 for clarity.

While dim=1 is functionally correct for the 2D tensor top_k_logits with shape [B*S, top_k], using dim=-1 would be clearer and more robust (always refers to the last dimension regardless of tensor rank).

-    routing_weights = F.softmax(top_k_logits, dim=1, dtype=torch.float)
+    routing_weights = F.softmax(top_k_logits, dim=-1, dtype=torch.float)
📜 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 bee9051 and cf27ce0.

📒 Files selected for processing (1)
  • tensorrt_llm/_torch/auto_deploy/models/patches/granitemoe.py (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.py

📄 CodeRabbit inference engine (CODING_GUIDELINES.md)

**/*.py: 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
Python files should use snake_case naming: some_file.py
Python classes should use PascalCase naming: class SomeClass
Python functions and methods should use snake_case naming: def my_awesome_function():
Python local variables should use snake_case naming: my_variable = ...
Python variable names that start with a number should be prefixed with 'k': k_99th_percentile = ...
Python global variables should use upper snake_case with prefix 'G': G_MY_GLOBAL = ...
Python constants should use upper snake_case naming: 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 in Python for classes and functions, which can be parsed by Sphinx
Python attributes and variables can be documented inline with type and description
Avoid using reflection in Python when functionality can be easily achieved without reflection
When using try-except blocks in Python, limit the except to the smallest set of errors possible
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, using the else block for logic

Files:

  • tensorrt_llm/_torch/auto_deploy/models/patches/granitemoe.py
**/*.{cpp,h,cu,cuh,py}

📄 CodeRabbit inference engine (CODING_GUIDELINES.md)

All TensorRT-LLM Open Source Software code should contain an NVIDIA copyright header that includes the year of its latest meaningful modification

Files:

  • tensorrt_llm/_torch/auto_deploy/models/patches/granitemoe.py
🧠 Learnings (1)
📓 Common learnings
Learnt from: djns99
Repo: NVIDIA/TensorRT-LLM PR: 6915
File: cpp/tensorrt_llm/kernels/cutlass_kernels/moe_gemm/moe_kernels.cu:4010-4012
Timestamp: 2025-08-14T23:23:27.449Z
Learning: For MOE (Mixture of Experts) code reviews in TensorRT-LLM, avoid repeatedly suggesting finalize fusion validation checks and safety assertions. The user djns99 has indicated these suggestions are repetitive and unwanted across multiple MOE-related changes.
Learnt from: jhaotingc
Repo: NVIDIA/TensorRT-LLM PR: 7856
File: cpp/tensorrt_llm/thop/fp8BlockScaleMoe.cpp:159-166
Timestamp: 2025-09-19T21:28:13.751Z
Learning: In TensorRT-LLM blockScaleMoe routing (cpp/tensorrt_llm/kernels/trtllmGenKernels/blockScaleMoe/runner.cu), the DeepSeek routing method performs reinterpret_cast<float*>(routingLogits) at line 89, which could cause issues if routing_logits are BF16. However, Qwen3-FP8 models use RenormalizeNaive routing method and are not affected by this dtype casting issue.
🧬 Code graph analysis (1)
tensorrt_llm/_torch/auto_deploy/models/patches/granitemoe.py (2)
tensorrt_llm/_torch/auto_deploy/export/interface.py (2)
  • BaseExportPatch (47-139)
  • ExportPatchRegistry (186-233)
tensorrt_llm/_torch/auto_deploy/custom_ops/fused_moe/torch_moe.py (1)
  • torch_moe (90-201)
⏰ 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 (2)
tensorrt_llm/_torch/auto_deploy/models/patches/granitemoe.py (2)

27-62: LGTM! The export-compatible forward pass is correctly implemented.

The implementation properly:

  • Avoids the problematic .tolist() by directly accessing self.router.layer for router logits computation
  • Performs top-k selection and softmax in an export-compatible manner
  • Correctly reorders weights from GraniteMoe's [gate, up] format to torch_moe's expected [w3, w1] stacked format
  • Invokes torch_moe with the correct stacked-tensor format (single-element lists for w1_weight and w2_weight, empty list for w3_weight)
  • Returns both layer_output and router_logits to match the original forward signature

The PR objectives confirm that numerical accuracy was verified against the original forward pass.


65-89: LGTM! The patch mechanism is correctly implemented.

The patch class properly:

  • Registers with the export patch registry under the key "hf_granitemoe_moe"
  • Implements the required _apply_patch and _revert_patch methods from BaseExportPatch
  • Safely stores the original forward method before patching and restores it on revert
  • Uses method monkey-patching to replace GraniteMoeMoE.forward at the class level

The implementation follows the export patch framework contract and ensures clean patch application/removal.

Comment on lines 1 to 29
"""A patch for GraniteMoe to make it compatible with torch.export.

The main issue is that GraniteMoeTopKGating calls `.tolist()` on a tensor which is:
1. Incompatible with meta tensors (no data to access)
2. Incompatible with torch.compile/export (data-dependent operation)

This patch rewrites the MoE forward to use the torch_moe custom op instead.
"""

import torch
import torch.nn.functional as F

# Try to import GraniteMoe classes from transformers
from transformers.models.granitemoe.modeling_granitemoe import GraniteMoeMoE

from ...export.interface import BaseExportPatch, ExportPatchRegistry

Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Add required copyright header and fix import style.

Two coding guideline violations:

  1. Missing copyright header: All TensorRT-LLM code must include an NVIDIA copyright header with the year of last modification.

  2. Import style (line 14): The coding guidelines require maintaining namespace when importing. Instead of importing GraniteMoeMoE directly, import the module:

    from transformers.models.granitemoe import modeling_granitemoe

    Then reference as modeling_granitemoe.GraniteMoeMoE in the code (lines 14, 81, 84, 89).

As per coding guidelines, Python files should contain copyright headers and maintain namespace on imports.

🤖 Prompt for AI Agents
tensorrt_llm/_torch/auto_deploy/models/patches/granitemoe.py lines 1-17: add the
required NVIDIA copyright header with the last modification year (2025) at the
top of the file, and replace the direct class import on line 14 with a
namespaced module import: "from transformers.models.granitemoe import
modeling_granitemoe", then update all uses of GraniteMoeMoE (lines 14, 81, 84,
89) to reference modeling_granitemoe.GraniteMoeMoE so the namespace is preserved
per coding guidelines.

@karthikvetrivel karthikvetrivel changed the title [None][fix] Add export patch for GraniteMoe MoE models to enable torch.export compatibility [#10170][fix] Add export patch for GraniteMoe MoE models to enable torch.export compatibility Dec 19, 2025
@lucaslie lucaslie moved this from Backlog to In progress in AutoDeploy Board Dec 19, 2025
Copy link
Member

@lucaslie lucaslie left a comment

Choose a reason for hiding this comment

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

Looks great!

@lucaslie
Copy link
Member

/bot run

@lucaslie lucaslie moved this from In progress to In review in AutoDeploy Board Dec 19, 2025
@tensorrt-cicd
Copy link
Collaborator

PR_Github #29191 [ run ] triggered by Bot. Commit: cf27ce0

@tensorrt-cicd
Copy link
Collaborator

PR_Github #29191 [ run ] completed with state SUCCESS. Commit: cf27ce0
/LLM/main/L0_MergeRequest_PR pipeline #22394 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

@lucaslie
Copy link
Member

/bot run

@tensorrt-cicd
Copy link
Collaborator

PR_Github #29198 [ run ] triggered by Bot. Commit: cf27ce0

@tensorrt-cicd
Copy link
Collaborator

PR_Github #29198 [ run ] completed with state SUCCESS. Commit: cf27ce0
/LLM/main/L0_MergeRequest_PR pipeline #22402 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

@karthikvetrivel
Copy link
Member Author

/bot run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In review

Development

Successfully merging this pull request may close these issues.

[Feature]: AutoDeploy: Add torch.export support for GraniteMoe models

3 participants