Skip to content

[TRTLLM-14813][feat] Add Kimi K3 (KimiLinear) model - #17269

Merged
brnguyen2 merged 8 commits into
NVIDIA:mainfrom
brnguyen2:k3/14813-kimilinear-model
Aug 6, 2026
Merged

[TRTLLM-14813][feat] Add Kimi K3 (KimiLinear) model#17269
brnguyen2 merged 8 commits into
NVIDIA:mainfrom
brnguyen2:k3/14813-kimilinear-model

Conversation

@brnguyen2

@brnguyen2 brnguyen2 commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Description

Adds the Kimi K3 (KimiLinear) model: hybrid KDA/MLA layer stack with the
K3 MoE blocks, HF checkpoint config and weight loading, executor
integration (config utils, resource manager, mamba cache-manager sizing
for KDA state, mapping), chunked prefill enabled by default with KV-cache
block reuse as an opt-in, and quant-config handling for the K3 checkpoint
format. Model-level defaults enable the fused attention-residual path,
CUDA graphs, and the CuTe DSL kernels from the dependency PRs.

Ships with the K3 module packages the model builds on — the KDA mixer +
kernel glue (modules/kimi_kda), the K3 SITU MoE block/gate/MLP
(modules/kimi_k3_moe), the fused attention-residual op wrapper
(modules/kimi_k3_attn_res), and the K3 MLA module as a thin wrapper
over the general MLA path (modules/kimi_k3_mla, TRTLLM-14811). Also
includes fused_moe SiTu activation + communication_method support and
the SiTu entry in the python ActType_TrtllmGen enum mirror.

Dependencies (all merged to main)

All dependency PRs have landed; this branch is now a single model commit
on top of current main.

Notes

  • FP8 KV cache support is not part of this PR; bf16 KV is the validated
    default.
  • Later K3 perf work (fused-A-GEMM mxfp8 dispatch etc.) is intentionally
    excluded and will follow separately.

Test Coverage

  • tests/unittest/_torch/modeling/test_kimi_kda_fused_verify_parity.py
  • tests/unittest/_torch/modeling/test_kimi_kda_verify_parity.py
  • tests/unittest/_torch/modeling/test_kda_mtp_decode_cute_parity.py
  • tests/unittest/_torch/modules/kimi_kda/test_kda_prefill_op.py
  • tests/unittest/_torch/modules/kimi_kda/test_kda_prefill_state_parity.py
  • tests/unittest/_torch/modules/kimi_kda/test_kda_cache_soundness.py
  • tests/unittest/_torch/modules/kimi_k3_attn_res/test_attn_res_op.py
  • tests/unittest/_torch/modules/moe/test_kimi_k3_situ_moe.py

PR Checklist

  • PR title follows the [TRTLLM-14813][feat] convention
  • Sanity rerun on the updated base: build green on a Blackwell (sm_100 family) node; import tensorrt_llm + model module import clean; unit suites green — kimi_kda 35 passed/2 skipped, attn_res 10 passed, situ_moe 23 passed, KDA modeling parity 14 passed
  • Dependencies merged; full CI run kicked on the main-based single-commit head

Dev Engineer Review

  • Added Kimi K3 support across configuration, model execution, KDA, MLA, MoE, checkpoint loading, cache management, quantization, mapping, and runtime integration.
  • Added Blackwell-specific fused kernels with validated PyTorch fallbacks.
  • Added SiTu activation and MXFP4 expert loading support.
  • Added optional output reuse to kda_decode.
  • Added validation for unsupported K3 configurations, cache combinations, routing methods, quantization settings, and hardware paths.
  • CI results were mixed. The latest pipeline passed x86_64 and SBSA builds and the SBSA single-GPU stage. Four x86_64 DGX B200 shards failed because of the pre-existing get_valid_configs() argument mismatch in FP8 block-scale MoE fallback handling. PR #17362 addresses this unrelated failure.

QA Engineer Review

  • Added KDA decode, verification, prefill, and cache soundness tests.
  • Added attention-residual parity tests.
  • Added Kimi K3 SiTu MoE tests for routing, activation contracts, kernel execution, numerical parity, weight loading, TP/EP selection, and TP8 execution.
  • Added test_update_quant_config_from_compressed_tensors_mxfp4_with_fp8_kv_cache.
  • No test-list files were changed.
  • The new KDA, attention-residual, and Kimi K3 SiTu MoE tests are not listed in the available test-db/ or qa/ files.
  • Existing list entries cover related Kimi K2/K2.5 and generic MXFP4 MoE tests.
  • Verdict: needs follow-up.

@brnguyen2

Copy link
Copy Markdown
Collaborator Author

/bot run

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #63876 [ run ] triggered by Bot. Commit: 108cfbe Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #63876 [ run ] completed with state SUCCESS. Commit: 108cfbe
/LLM/main/L0_MergeRequest_PR pipeline #51815 completed with status: 'FAILURE'

CI Report

⚠️ 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

CI Agent Failure Analysis

Link to invocation

@brnguyen2

Copy link
Copy Markdown
Collaborator Author

/bot run

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #63898 [ run ] triggered by Bot. Commit: e40834b Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #63898 [ run ] completed with state SUCCESS. Commit: e40834b
/LLM/main/L0_MergeRequest_PR pipeline #51840 completed with status: 'FAILURE'

CI Report

⚠️ 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

CI Agent Failure Analysis

Link to invocation

@brnguyen2

Copy link
Copy Markdown
Collaborator Author

/bot run

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #63930 [ run ] triggered by Bot. Commit: e40834b Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #63930 [ run ] completed with state SUCCESS. Commit: e40834b
/LLM/main/L0_MergeRequest_PR pipeline #51868 completed with status: 'FAILURE'

CI Report

⚠️ Multi-GPU Label Required:
Multi-GPU tests require the ci: full pre-merge approved label on this PR. Ask a member of NVIDIA/trt-llm-ci-approvers to add the label, then re-trigger CI with the same bot command (no rebase needed).

⚠️ 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

CI Agent Failure Analysis

Link to invocation

@brnguyen2
brnguyen2 force-pushed the k3/14813-kimilinear-model branch from e40834b to 1365842 Compare August 5, 2026 15:38
@brnguyen2

Copy link
Copy Markdown
Collaborator Author

/bot run

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64074 [ run ] triggered by Bot. Commit: 1365842 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64074 [ run ] completed with state SUCCESS. Commit: 1365842
/LLM/main/L0_MergeRequest_PR pipeline #52001 completed with status: 'FAILURE'

CI Report

⚠️ 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

CI Agent Failure Analysis

Link to invocation

@brnguyen2
brnguyen2 force-pushed the k3/14813-kimilinear-model branch from 1365842 to d7cd8ee Compare August 5, 2026 19:08
@brnguyen2

Copy link
Copy Markdown
Collaborator Author

/bot run --skip-test

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64103 [ run ] triggered by Bot. Commit: d7cd8ee Link to invocation

@brnguyen2

Copy link
Copy Markdown
Collaborator Author

/bot run --skip-test

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64111 [ run ] triggered by Bot. Commit: f092cd2 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64103 [ run ] completed with state ABORTED. Commit: d7cd8ee

Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64111 [ run ] completed with state SUCCESS. Commit: f092cd2
/LLM/main/L0_MergeRequest_PR pipeline #52033 (Partly Tested) completed with status: 'SUCCESS'

CI Report

Link to invocation

@brnguyen2

Copy link
Copy Markdown
Collaborator Author

/bot skip --comment "Full pipeline 52001 on the pre-rebase head failed only on AutoDeploy MoE unit tests already failing on main and waived there (nvbugs 6564714, waives merged via #17162), plus cascade aborts from those stages. The branch was then rebased onto current main (which carries those waives) with byte-identical content, adding only a fake-impl registration for the new custom op; that fix passed the H100 unit-test stage on PR #17225 (pipeline 52037), and a build-only run on this exact head passed (pipeline 52033)."

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64129 [ skip ] triggered by Bot. Commit: f092cd2 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64129 [ skip ] completed with state SUCCESS. Commit: f092cd2
Skipping testing for commit f092cd2

Link to invocation

Squash of the KimiLinear model integration on top of the kernel PRs
(NVIDIA#17190, NVIDIA#17054, NVIDIA#17266, NVIDIA#17225):

- KimiLinear model (modeling_kimi_k3) and KimiLinearConfig registration
- Kimi K3 support modules: KDA mixer, K3 MoE, K3 MLA, fused
  attention-residual wrapper
- K3 MLA module refactored onto the general MLA path (TRTLLM-14811)
- fused_moe: SiTu activation and communication_method support
- SiTu in the ActType_TrtllmGen python enum (python mirror of the C++
  enum from the MoE kernel drop)
- kda_decode: accept an optional out tensor (to be folded into NVIDIA#17054)
- KDA kernel/runtime unit tests

Signed-off-by: Brian Nguyen <brnguyen@nvidia.com>
@brnguyen2
brnguyen2 force-pushed the k3/14813-kimilinear-model branch from f092cd2 to 82fab8c Compare August 5, 2026 23:59
@brnguyen2

Copy link
Copy Markdown
Collaborator Author

/bot run

@brnguyen2
brnguyen2 marked this pull request as ready for review August 6, 2026 00:05
@brnguyen2
brnguyen2 requested review from a team as code owners August 6, 2026 00:05
@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64354 [ run ] triggered by Bot. Commit: c0f2bb9 Link to invocation

@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.

Caution

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

⚠️ Outside diff range comments (1)
tensorrt_llm/_torch/models/checkpoints/hf/weight_loader.py (1)

234-241: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Do not treat filesystem errors as a missing Kimi configuration.

Line 234 can return False when stat() cannot access the path, even if config.json exists. (docs.python.org) If one rank takes this result, it enters the eager path and executes the collectives at Lines 213-217, while another rank enters the lazy path. The job can deadlock.

Open the file directly and catch only FileNotFoundError. Propagate other filesystem errors.

Proposed fix
     config_path = os.path.join(checkpoint_dir, "config.json")
-    if not os.path.isfile(config_path):
-        return False
-    with open(config_path) as f:
-        model_type = json.load(f).get("model_type")
+    try:
+        with open(config_path) as f:
+            model_type = json.load(f).get("model_type")
+    except FileNotFoundError:
+        return False
     return model_type in ("kimi_k3", "kimi_linear")

As per coding guidelines, catch the narrowest exception possible.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tensorrt_llm/_torch/models/checkpoints/hf/weight_loader.py` around lines 234
- 241, Update the Kimi configuration check around config_path and model_type to
open config.json directly, catching only FileNotFoundError to return False for a
genuinely missing file. Remove the os.path.isfile precheck so permission, I/O,
and other filesystem errors propagate consistently across ranks.

Source: Coding guidelines

🧹 Nitpick comments (1)
tensorrt_llm/_torch/custom_ops/cpp_custom_ops.py (1)

315-315: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use PEP 604 optional annotations.

Change the two annotations to torch.Tensor | None. The project supports Python 3.10+, and the coding guidelines prefer | unions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tensorrt_llm/_torch/custom_ops/cpp_custom_ops.py` at line 315, Update the two
Optional[torch.Tensor] annotations in the affected function signature to use
torch.Tensor | None, and remove the now-unused Optional import if applicable.

Sources: Coding guidelines, Learnings

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@tensorrt_llm/_torch/models/checkpoints/hf/weight_loader.py`:
- Around line 234-241: Update the Kimi configuration check around config_path
and model_type to open config.json directly, catching only FileNotFoundError to
return False for a genuinely missing file. Remove the os.path.isfile precheck so
permission, I/O, and other filesystem errors propagate consistently across
ranks.

---

Nitpick comments:
In `@tensorrt_llm/_torch/custom_ops/cpp_custom_ops.py`:
- Line 315: Update the two Optional[torch.Tensor] annotations in the affected
function signature to use torch.Tensor | None, and remove the now-unused
Optional import if applicable.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 307b17e2-eccc-4be5-8c10-ca19ac2bea3a

📥 Commits

Reviewing files that changed from the base of the PR and between 83e865f and c0f2bb9.

📒 Files selected for processing (5)
  • tensorrt_llm/_torch/custom_ops/cpp_custom_ops.py
  • tensorrt_llm/_torch/models/checkpoints/hf/weight_loader.py
  • tensorrt_llm/_torch/models/modeling_kimi_linear.py
  • tensorrt_llm/_torch/modules/kimi_k3_moe/kimi_k3_moe_block.py
  • tensorrt_llm/_torch/modules/mla.py
🚧 Files skipped from review as they are similar to previous changes (3)
  • tensorrt_llm/_torch/modules/kimi_k3_moe/kimi_k3_moe_block.py
  • tensorrt_llm/_torch/modules/mla.py
  • tensorrt_llm/_torch/models/modeling_kimi_linear.py

Comment thread tensorrt_llm/_torch/modules/fused_moe/configurable_moe.py
Comment thread tensorrt_llm/_torch/modules/fused_moe/configurable_moe.py
Comment thread tensorrt_llm/_torch/modules/kimi_k3_moe/_moe_kernels.py
@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64354 [ run ] completed with state SUCCESS. Commit: c0f2bb9
/LLM/main/L0_MergeRequest_PR pipeline #52248 completed with status: 'FAILURE'

CI Report

⚠️ 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

CI Agent Failure Analysis

Link to invocation

@Tabrizian

Copy link
Copy Markdown
Member

py_executor changes and disagg changes LGTM.

@brnguyen2

Copy link
Copy Markdown
Collaborator Author

CI status on head c0f2bb9 (pipeline 52248) and why a skip is justified

Full L0 ran on the exact merge head:

  • Both builds green (x86_64 and SBSA).
  • SBSA single-GPU: fully green (28/28 stages).
  • x86_64 single-GPU: 208/216 stages green. The 4 failing stages are all DGX_B200 PyTorch shards.
  • Multi-GPU stages did not run: they were blocked-collateral of the x86_64 single-GPU failure, not independent failures.

The 4 failures share one root cause, and it is not from this PR

Per the CI failure analysis for pipeline 52248, all four failing shards (DeepSeek V3 Lite FP8 perf sanity, Gemma4 dummy e2e, layer-wise benchmarks, LTX2 example) fail on the same error:

RuntimeError: get_valid_configs() is missing value for argument '_6'.

Root cause: #15297 added a numFusedSharedExpert argument to FP8BlockScaleMoERunner::getValidConfigs and updated the get_valid_tactics call site, but missed the memoized fallback path — get_fallback_tactic() in tensorrt_llm/_torch/custom_ops/trtllm_gen_custom_ops.py still builds a 5-element key for the now 6-argument binding. Any FP8 block-scale MoE forward that misses the autotuner profiling cache fails hard. The bug is readable straight from main's source and is deterministic once that path is hit; nothing in the path is Kimi-related, and this PR does not modify the failing file. The one-line fix is up as #17362.

All four affected tests are non-Kimi tests exercising FP8 block-scale MoE on B200, which is exactly the blast radius that bug predicts.

Prior run on the previous head

Pipeline 52214 (head b379d30) was pure infrastructure: the test artifact download hit repeated 503s and then a truncated tarball, so no tests executed. The delta between that head and c0f2bb9 is a review-feedback commit (comment cleanups, an eps fallback, defensive guards) that has never been implicated in any test failure.

Additional coverage beyond this pipeline

The stacked serving/spec-dec branch (#17327), which contains this PR's full diff, passed 652 Kimi unit tests plus a speculative-decoding-vs-baseline logits-parity integration run and GSM8K accuracy checks on multi-GPU hardware.

Known residual gap, stated for the record: the multi-GPU L0 stages were blocked by the failure above and so did not run in this pipeline. The multi-GPU validation cited above covers the Kimi paths this PR adds; shared-code risk to other models is bounded by the fully-green single-GPU coverage of the same files.

@brnguyen2

Copy link
Copy Markdown
Collaborator Author

/bot skip --comment "All 4 failures in pipeline 52248 trace to a single pre-existing main bug (FP8 MoE fallback-tactic signature mismatch from #15297, fixed by #17362) in code this PR does not modify; see previous comment for the full analysis and coverage evidence."

@brnguyen2
brnguyen2 enabled auto-merge (squash) August 6, 2026 17:56
@brnguyen2

Copy link
Copy Markdown
Collaborator Author

/bot skip --comment "All 4 failures in pipeline 52248 trace to a single pre-existing main bug (FP8 MoE fallback-tactic signature mismatch from #15297, fixed by #17362) in code this PR does not modify; see previous comment for the full analysis and coverage evidence."

Comment thread tensorrt_llm/_torch/configs/kimi_linear.py
Comment thread tensorrt_llm/_torch/models/checkpoints/hf/weight_loader.py
Comment thread tensorrt_llm/_torch/models/modeling_kimi_linear.py
Comment thread tensorrt_llm/_torch/models/modeling_kimi_linear.py
Comment thread tensorrt_llm/_torch/models/modeling_kimi_linear.py
Comment thread tests/unittest/_torch/modeling/test_kimi_kda_fused_verify_parity.py
Comment thread tests/unittest/_torch/modeling/test_kimi_kda_fused_verify_parity.py
Comment thread tests/unittest/_torch/modeling/test_kimi_kda_fused_verify_parity.py
Comment thread tests/unittest/_torch/modeling/test_kimi_kda_fused_verify_parity.py
Comment thread tests/unittest/_torch/modeling/test_kimi_kda_fused_verify_parity.py
@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64388 [ skip ] triggered by Bot. Commit: c883e1d Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64388 [ skip ] completed with state SUCCESS. Commit: c883e1d
Skipping testing for commit c883e1d

Link to invocation

@brnguyen2
brnguyen2 merged commit 36922c7 into NVIDIA:main Aug 6, 2026
9 of 10 checks passed
brnguyen2 added a commit to brnguyen2/TensorRT-LLM that referenced this pull request Aug 7, 2026
…swap helper

Behavior-neutral refactors deferred from NVIDIA#17269:

- Extract the duplicated FP8 weight-read module swap (nested _swap in the
  MoE-MLP and MLA converters, plus the inline KDA o_proj conversion) into
  a module-level _swap_linear_to_fp8_weight_read helper.
- Split the ~450-line KimiLinearForCausalLM.load_weights into focused
  methods: _validate_checkpoint_keys, _load_trunk_params,
  _load_expert_slices, and _finalize_weight_load, with load_weights as a
  short orchestrator. Code moved verbatim; no functional changes.

Signed-off-by: Brian Nguyen <brnguyen@nvidia.com>
brnguyen2 added a commit to brnguyen2/TensorRT-LLM that referenced this pull request Aug 7, 2026
…dling

Item 1.2 of the PR NVIDIA#17269 deferred-cleanup bucket.

(a) Record the decision to keep SiTu in the trtllm-gen-local ActType_TrtllmGen
enum rather than adding it to the shared ActivationType, which mirrors the
cutlass enum in common.h and would then need a cutlass member no cutlass
kernel implements. Documented at the enum and left the enums unchanged.

(b) Route SiTu and SwiGLU per-expert alpha/beta through a single
_gemm1_activation_params accessor at the op call instead of duplicating the
is_situ_activation ternary. Behavior-identical: same tensors, same op slot.

The deeper storage merge (eliminating the separate situ_alpha/situ_beta
buffers by reusing swiglu_alpha/swiglu_beta) is left as a TODO because
'swiglu_alpha is not None' gates quant-method selection and validation on the
numeric path; it needs GPU parity revalidation before it can land.

Signed-off-by: Brian Nguyen <brnguyen@nvidia.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.