Skip to content

[Common, PyTorch] Improve mHC to match DeepSeek's implementation#2978

Open
kainzhong wants to merge 11 commits into
NVIDIA:mainfrom
kainzhong:feat/mhc_optimization1
Open

[Common, PyTorch] Improve mHC to match DeepSeek's implementation#2978
kainzhong wants to merge 11 commits into
NVIDIA:mainfrom
kainzhong:feat/mhc_optimization1

Conversation

@kainzhong

@kainzhong kainzhong commented May 12, 2026

Copy link
Copy Markdown
Collaborator

Description

Some enhancement for mHC to better align with DeepSeek's tilelang implementation: https://github.com/deepseek-ai/TileKernels/tree/main/tile_kernels/mhc

Fixes # (issue)

Type of change

  • Documentation change (change only to the documentation, either a fix or a new content)
  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Infra/Build change
  • Code refactoring

Changes

  • Add mhc_generate_mix_and_aggregate API that does projection, scale, sinkhorn and aggregate together
  • Allow mhc_fused_projection to accept arguments with mixed dtype: x.dtype=bf16, phi.dtype=fp32, which matches DeepSeek's implementation
  • mhc_fused_projection now outputs fp32 regardless of the input dtype, matching DeepSeek's implementation
  • Add fuse_grad_x_acc optimization (default to False), which will reuse the same grad_x buffer to accumulate the initial mHC input x's gradient for mhc_fused_expand_combine, mhc_fused_aggregate and mhc_fused_projection
  • Support norm_weight for mhc_fused_projection, which would be equivalent to apply RMSNorm in the unfused manner with elementwise_affine=True, which would be the learnable per-element affine parameters for RMSNorm
  • Refactor some kernel code to avoid duplication. I just realized if you make a triton kernel constexpr, it can be used as a macro in if branches since triton will not compile if it knows in compile time that some branch will not be taken
  • Fix the bug that grid will exceed CUDA's limitation when M is too large and the autotune candidate is BLOCK_SIZE_M=1. Such invalid configs will be pruned now.
  • Improve projection op by using TMA if on Hopper+
  • Add deterministic kernel implementations

Checklist:

  • I have read and followed the contributing guidelines
  • The functionality is complete
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes

@kainzhong kainzhong force-pushed the feat/mhc_optimization1 branch from af685d7 to eccba0c Compare May 12, 2026 00:57
@kainzhong kainzhong marked this pull request as ready for review May 13, 2026 17:26
@kainzhong kainzhong requested a review from ksivaman as a code owner May 13, 2026 17:26
@greptile-apps

greptile-apps Bot commented May 13, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR enhances the mHC (manifold Hyper-Connection) Triton kernels to better align with DeepSeek's tilelang implementation, adding a new mhc_generate_mix_and_aggregate high-level API, mixed bf16/fp32 dtype support, TMA acceleration on Hopper+, deterministic workspace reductions, and a fuse_grad_x_acc gradient-accumulation optimisation.

  • New API and mixed-dtype: mhc_generate_mix_and_aggregate bundles projection, scale, sinkhorn, and aggregate; mhc_fused_projection now accepts x: bf16 / phi: fp32, outputs fp32 H and ms, and optionally absorbs an RMSNorm norm_weight into the kernel.
  • Determinism and pruning: Split-K/M backward kernels (projection_bwd_dphi, aggregate_bwd, expand_combine_bwd) now have per-pruner determinism overrides and per-dimension grid-size guards; the previously reported bugs (inverted pruned_configs assignment, bypassed pruner under NVTE_DISABLE_TRITON_AUTOTUNING) have been resolved.
  • Kernel consolidation: The four separate fwd/bwd expand-combine and no-bias/bias kernels are merged into two unified kernels gated by HAS_BIAS, FUSE_GRAD_X_ACC, and DETERMINISTIC constexprs, eliminating significant code duplication.

Confidence Score: 5/5

Safe to merge; all three changed files implement well-guarded, tested enhancements with no regressions found in the core gradient math or kernel launch geometry.

The gradient-accumulation ordering (expand_combine → aggregate → projection) is sound: expand_combine WRITES the buffer, aggregate and projection do read-modify-write on non-overlapping work, and the projection backward is always last and returns the fully-accumulated result to PyTorch autograd. Return-value counts in all three autograd Functions match their forward input counts. Grid-dimension pruning is correctly applied to all backward kernels that use M on the Y axis.

All three files look sound. The test_mhc_fuse_grad_acc skip-reason string in tests/pytorch/test_mhc.py is misleading but harmless.

Important Files Changed

Filename Overview
transformer_engine/common/triton/mhc.py Major refactor: adds TMA support, deterministic workspace reductions, split-K/M pruning for all backward kernels (projection-dphi, aggregate, expand-combine), fuses norm_weight into projection, and consolidates the fwd/bwd kernels. Previously flagged bugs (prune-bypass under NVTE_DISABLE_TRITON_AUTOTUNING, grid-dim overflow in dphi) are fixed. Minor: unused stride_norm_weight parameter in the fwd kernel.
transformer_engine/pytorch/triton/mhc.py Adds mhc_generate_mix_and_aggregate API, mixed-dtype bf16/fp32 support, fused_grad_x_acc_buffer optimisation, TMA allocator initialisation, and ENFORCE_DETERMINISTIC flag; backward return-value counts verified to match forward input counts after prior bug fixes.
tests/pytorch/test_mhc.py Expands test coverage for mixed dtypes, norm_weight, split_k, fused-grad-acc, and deterministic paths; skipif reason string for test_mhc_fuse_grad_acc is inverted (says "=0" but the skip fires when "=1").

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant User
    participant API as mhc_generate_mix_and_aggregate
    participant Proj as mhc_fused_projection
    participant Scale as mhc_fused_scale
    participant Sink as mhc_fused_sinkhorn
    participant Agg as mhc_fused_aggregate
    participant Exp as mhc_fused_expand_combine

    User->>API: x, phi, alpha, beta, norm_weight, fused_grad_x_acc_buffer
    API->>Proj: x.view(M,K), phi, norm_weight
    Proj-->>API: H (fp32), ms (fp32)
    API->>Scale: H, alpha, beta, ms
    Scale-->>API: H_pre, H_post, H_res
    API->>Sink: H_res.view(s,b,n,n)
    Sink-->>API: H_res (doubly stochastic)
    API->>Agg: x, H_pre, fused_grad_x_acc_buffer
    Agg-->>User: out (s,b,C), H_post (s,b,n), H_res (s,b,n,n)
    Note over User: layer(out) → f
    User->>Exp: f, bias, H_post, x, H_res, fused_grad_x_acc_buffer
    Exp-->>User: x_new (s,b,C,n)
    Note over Proj,Exp: Backward order: Exp WRITE → Agg ADD → Proj ADD+return
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant User
    participant API as mhc_generate_mix_and_aggregate
    participant Proj as mhc_fused_projection
    participant Scale as mhc_fused_scale
    participant Sink as mhc_fused_sinkhorn
    participant Agg as mhc_fused_aggregate
    participant Exp as mhc_fused_expand_combine

    User->>API: x, phi, alpha, beta, norm_weight, fused_grad_x_acc_buffer
    API->>Proj: x.view(M,K), phi, norm_weight
    Proj-->>API: H (fp32), ms (fp32)
    API->>Scale: H, alpha, beta, ms
    Scale-->>API: H_pre, H_post, H_res
    API->>Sink: H_res.view(s,b,n,n)
    Sink-->>API: H_res (doubly stochastic)
    API->>Agg: x, H_pre, fused_grad_x_acc_buffer
    Agg-->>User: out (s,b,C), H_post (s,b,n), H_res (s,b,n,n)
    Note over User: layer(out) → f
    User->>Exp: f, bias, H_post, x, H_res, fused_grad_x_acc_buffer
    Exp-->>User: x_new (s,b,C,n)
    Note over Proj,Exp: Backward order: Exp WRITE → Agg ADD → Proj ADD+return
Loading

Reviews (13): Last reviewed commit: "Merge branch 'main' into feat/mhc_optimi..." | Re-trigger Greptile

Comment thread transformer_engine/pytorch/triton/mhc.py Outdated
Comment thread transformer_engine/pytorch/triton/mhc.py Outdated
Comment thread transformer_engine/pytorch/triton/mhc.py Outdated
Comment thread transformer_engine/common/triton/mhc.py
Comment thread transformer_engine/common/triton/mhc.py Outdated
Comment thread transformer_engine/common/triton/mhc.py
@timmoon10

Copy link
Copy Markdown
Member

/te-ci

timmoon10
timmoon10 previously approved these changes Jun 29, 2026

@timmoon10 timmoon10 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, I don't see anything particularly suspicious and the API changes are backward-compatible.

fused_grad_x_acc_buffer : Optional[torch.Tensor]
A pre-allocated buffer for inplace gradient accumulation to avoid PyTorch autograd overhead.
If not None, triton kernels will accumulate the gradient of x into this same buffer to avoid copying the gradient by PyTorch.
This optimization requires the operation order to be mhc_fused_projection -> mhc_fused_aggregate -> mhc_fused_expand_combine.

@timmoon10 timmoon10 Jun 29, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Flagging that the ordering requirement is fragile and unintuitive. That said, fused_grad_x_acc_buffer is an optional advanced optimization and the requirement is well documented.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

I can ask user to pass a zero buffer instead of an uninitialized one so in this case the order will not matter (the reason why it has to be this specific order is because in backward mhc_fused_expand_combine will overwrite the value into the buffer instead of a read+write accumulate, so it has to be the last operation in forward and the first operation in backward), but an uninitialized buffer should avoid the cost to reset the memory to zero.
Which approach is better?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think we also need to have this specific order so that mhc_fused_projection can cast the buffer to BF16 and attach it to x.grad. I don't have a strong opinion since all options I see involve doing something non-standard with PyTorch autograd. Probably best to keep it as it is right now, and generalize in the future if there's a need.

Comment thread tests/pytorch/test_mhc.py

@pytest.mark.parametrize("cfg", mhc_configs, ids=MHCConfig.desc)
@pytest.mark.parametrize("dtype", [torch.float32, torch.bfloat16], ids=["fp32", "bf16"])
@pytest.mark.parametrize("recompute", [False, True], ids=["no_recompute", "recompute"])

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Why are we removing this test case? It doesn't seem that we have touched recompute in mhc_fused_sinkhorn.

@kainzhong kainzhong Jun 30, 2026

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Ah it's a mistake. Previously this PR includes a gluon kernel which always recomputes but later I decided to make that a separate PR. I must have forget to revert this line of change. Fixed now.

Comment thread tests/pytorch/test_mhc.py
Comment on lines +504 to +507
# If upcasting from bf16 to fp32 takes place inside the triton kernel, triton will ignore "ieee" precision and use tf32 anyway
# See https://github.com/triton-lang/triton/issues/10176 for detail.
# Therefore, we need to use tf32x3 instead which at least has better accuracy than tf32 just to make the tests pass. In production
# precision should be tf32 so it's not affected.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

If we advertise a feature ("ieee" precision) and it does not work for whatever reason, we should make sure that this caveat is visible in the documentation. tf32x3 should be quite good in emulating full FP32 precision, but still we should have that listed to avoid any confusion from the users.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Changed comments so use_tf32 will make it clear that if activation is bf16 and weight is fp32 then it will use tf32x3 now.

"""
assert n == 4, "Only n=4 is supported in this implementation"
check_deterministic("mhc_fused_scale")
out = mHCScaleFusedOp.apply(H, alpha, beta, ms, n)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

_mhc_scale_bwd_fused uses atomic_add, but this function now advertises itself as deterministic. Is the atomic add not a problem for that?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Ah I deleted this by mistake. Previously this PR made this kernel deterministic but later I thought it should be a separate PR but I forgot to revert this line of change. Fixed now.



def _support_tma():
return torch.cuda.get_device_capability()[0] >= 9

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This should use the device actually used (so device of the input) rather than the first device.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Now _support_tma will decide based on input's device instead.

```
layer_input, H_post, H_res = mhc_generate_mix_and_aggregate(x, phi, alpha, beta)
layer_output = layer(layer_input) # Attn / FFN layer
x = mhc_fused_expand_combine(layer_input, bias, H_post, x, H_res)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Shouldn't the combine also take the layer_output?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Ah typo here. It should be layer_output instead of layer_input. Fixed now.

@kainzhong kainzhong force-pushed the feat/mhc_optimization1 branch 4 times, most recently from ee83f1e to 6a9bc2d Compare June 30, 2026 22:16
@kainzhong

Copy link
Copy Markdown
Collaborator Author

/te-ci

@kainzhong

kainzhong commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator Author

Benchmark vs https://github.com/deepseek-ai/TileKernels

  • nondet: non-deterministic triton kernels
  • det: deterministic triton kernels
  Projection

  ┌────────────┬─────┬──────────────┬──────────────┬──────────────┬──────────────┬───────────┐
  │   shape    │ dir │  te nondet   │    te det    │   tilelang   │ nondet vs tl │ det vs tl │
  ├────────────┼─────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────┤
  │ 4096×2048  │ fwd │  22.9 / 2955 │  38.2 / 1773 │  38.1 / 1778 │        1.66× │     1.00× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────┤
  │ 4096×2048  │ bwd │  60.8 / 2224 │  94.2 / 1437 │  337.0 / 401 │        5.54× │     3.58× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────┤
  │ 4096×3072  │ fwd │  29.8 / 3401 │  54.6 / 1859 │  52.5 / 1934 │        1.76× │     0.96× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────┤
  │ 4096×3072  │ bwd │  90.6 / 2238 │ 111.4 / 1821 │  353.6 / 574 │        3.90× │     3.18× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────┤
  │ 4096×4096  │ fwd │  38.8 / 3490 │  70.6 / 1915 │  67.1 / 2014 │        1.73× │     0.95× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────┤
  │ 4096×4096  │ bwd │ 115.1 / 2349 │ 132.6 / 2038 │  362.3 / 746 │        3.15× │     2.73× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────┤
  │ 4096×5120  │ fwd │  45.9 / 3686 │  87.1 / 1941 │  81.8 / 2067 │        1.78× │     0.94× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────┤
  │ 4096×5120  │ bwd │ 147.7 / 2288 │ 182.5 / 1851 │  432.3 / 781 │        2.93× │     2.37× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────┤
  │ 8192×4096  │ fwd │  71.7 / 3764 │  81.3 / 3316 │ 128.9 / 2093 │        1.80× │     1.58× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────┤
  │ 8192×4096  │ bwd │ 216.3 / 2492 │ 252.4 / 2135 │  735.4 / 733 │        3.40× │     2.91× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────┤
  │ 16384×4096 │ fwd │ 122.5 / 4398 │ 141.5 / 3806 │ 250.8 / 2147 │        2.05× │     1.77× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────┤
  │ 16384×4096 │ bwd │ 414.0 / 2600 │ 501.6 / 2145 │ 1475.2 / 730 │        3.56× │     2.94× │
  └────────────┴─────┴──────────────┴──────────────┴──────────────┴──────────────┴───────────┘
  
  Aggregate
 
  ┌────────────┬─────┬──────────────┬──────────────┬──────────┐
  │   shape    │ dir │    te det    │   tilelang   │ te vs tl │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×2048  │ fwd │  15.3 / 5489 │  15.2 / 5518 │    0.99× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×2048  │ bwd │  26.9 / 5620 │  27.7 / 5462 │    1.03× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×3072  │ fwd │  21.4 / 5880 │  21.8 / 5788 │    1.02× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×3072  │ bwd │  38.7 / 5858 │  49.3 / 4599 │    1.27× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×4096  │ fwd │  27.4 / 6136 │  27.8 / 6029 │    1.02× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×4096  │ bwd │  53.5 / 5650 │  65.1 / 4644 │    1.22× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×5120  │ fwd │  33.2 / 6311 │  34.0 / 6169 │    1.02× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×5120  │ bwd │  62.7 / 6023 │  81.0 / 4664 │    1.29× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 8192×4096  │ fwd │  50.9 / 6594 │  51.2 / 6559 │    1.01× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 8192×4096  │ bwd │ 103.1 / 5857 │ 125.1 / 4829 │    1.21× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 16384×4096 │ fwd │  97.2 / 6906 │  97.7 / 6867 │    1.01× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 16384×4096 │ bwd │ 197.5 / 6117 │ 244.7 / 4938 │    1.24× │
  └────────────┴─────┴──────────────┴──────────────┴──────────┘
  Expand_combine

  ┌────────────┬─────┬──────────────┬──────────────┬──────────┐
  │   shape    │ dir │    te det    │   tilelang   │ te vs tl │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×2048  │ fwd │  24.5 / 6174 │  24.7 / 6125 │    1.01× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×2048  │ bwd │  45.1 / 5211 │  70.7 / 3326 │    1.57× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×3072  │ fwd │  34.6 / 6549 │  36.6 / 6192 │    1.06× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×3072  │ bwd │  64.9 / 5430 │  96.3 / 3662 │    1.48× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×4096  │ fwd │  45.4 / 6659 │  47.9 / 6301 │    1.06× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×4096  │ bwd │  84.6 / 5554 │ 120.9 / 3889 │    1.43× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×5120  │ fwd │  56.1 / 6731 │  58.9 / 6410 │    1.05× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 4096×5120  │ bwd │ 103.3 / 5691 │ 147.5 / 3984 │    1.43× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 8192×4096  │ fwd │  86.5 / 6990 │  89.9 / 6721 │    1.04× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 8192×4096  │ bwd │ 155.6 / 6043 │ 231.5 / 4062 │    1.49× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 16384×4096 │ fwd │ 169.2 / 7141 │ 173.9 / 6952 │    1.03× │
  ├────────────┼─────┼──────────────┼──────────────┼──────────┤
  │ 16384×4096 │ bwd │ 298.4 / 6302 │ 445.4 / 4222 │    1.49× │
  └────────────┴─────┴──────────────┴──────────────┴──────────┘

kainzhong and others added 10 commits July 7, 2026 01:04
Signed-off-by: Kaining Zhong <kainingz@nvidia.com>
Signed-off-by: Kaining Zhong <kainingz@nvidia.com>
Signed-off-by: Kaining Zhong <kainingz@nvidia.com>
Signed-off-by: Kaining Zhong <kainingz@nvidia.com>
Signed-off-by: Kaining Zhong <kainingz@nvidia.com>
Signed-off-by: Kaining Zhong <kainingz@nvidia.com>
for more information, see https://pre-commit.ci

Signed-off-by: Kaining Zhong <kainingz@nvidia.com>
Signed-off-by: Kaining Zhong <kainingz@nvidia.com>
Signed-off-by: Kaining Zhong <kainingz@nvidia.com>
Signed-off-by: Kaining Zhong <kainingz@nvidia.com>
@kainzhong kainzhong force-pushed the feat/mhc_optimization1 branch from 0257823 to 7800719 Compare July 7, 2026 01:04
@kainzhong

Copy link
Copy Markdown
Collaborator Author

/te-ci

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.

3 participants