[MLAS] KleidiAI fix igemm regression#28571
Conversation
There was a problem hiding this comment.
Pull request overview
This PR addresses a CPU convolution performance regression on ARM64 when the KleidiAI SME IGEMM path is selected, by introducing a new convolution route-selection heuristic and changing the KleidiAI LHS packing strategy to reduce peak temporary memory and improve cache locality on large workloads.
Changes:
- Added
ArmKleidiAI::SelectConvRoute(withConvRouteoptionsIgemm,GemmFallback,None) to decide whether to run KleidiAI IGEMM, fall back to GEMM, or use the existing path. - Updated KleidiAI convolution to pack the IGEMM LHS in bounded chunks instead of packing the full LHS up front.
- In the generic MLAS convolution implementation, routed certain workloads to
MlasGemm(instead ofMlasSgemmOperation) whenSelectConvRoutechoosesGemmFallback.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 4 comments.
| File | Description |
|---|---|
| onnxruntime/core/mlas/lib/kleidiai/mlasi_kleidiai.h | Adds ConvRoute + SelectConvRoute heuristic helpers for choosing conv execution route. |
| onnxruntime/core/mlas/lib/kleidiai/convolve_kleidiai.cpp | Reworks KleidiAI SME IGEMM LHS packing into chunked packing and integrates route selection into capability checks. |
| onnxruntime/core/mlas/lib/convolve.cpp | Uses SelectConvRoute to optionally switch im2col+SGEMM slices to MlasGemm for the fallback route. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
@microsoft-github-policy-service agree company="Arm" |
|
Can you please address the Copliot comments ? |
|
Hi, thanks for the reminder. The comments Copilot left are sensible, I'm addressing them with a new patch that's currently work in progress. Once it's done and clears internal review, I'll add it to the PR. |
Thank you! |
|
Hi, I pushed a new patch addressing the Copilot comments, and left a reply with further details on one of the comments. |
Review — PR #28571
|
|
Thank you for the thorough review! The comments are sensible and understandable. I will update the PR as soon as we have a patch to address them finished and internally reviewed. |
|
Hi @hariharans29, thanks again for the thorough review. I've pushed an updated patch addressing the comments. Summary of the changes with respect to the previous review comment points:
Nits:
Additional verification and notesRe-running the regressing modelI reran the regressing PP-OCR model from #27633 on a macOS Arm64 device based on the original report. Using I didn't include a Snapdragon X run because the original issue reported the regression on macOS Arm64.
|
Re-review — PR #28571
|
|
Thank you for the comments! They are all clear and sensible. Good catch with the NHWC padding symmetry correctness comment. I have a patch completed resolving the comments, I'll push it here once it clears internal review. |
|
Hi @hariharans29, thank you for the review! I made changes to address the generated comments. In addition, I found that the pipeline failures were indeed related to the patch, included in the latest commit is a fix moving from |
Third pass — PR #28571Verdict: still approve. Commit New since the last pass1. NHWC padding gate is now strictly uniform — and that's a correctness fix
// The channels-last float convolution path is only implemented by the Arm® KleidiAI™
// SME conv override, which currently uses a single padding value in its LHS indirection table.
// Require uniform padding until separate H/W padding is supported there.
if (Padding[0] != Padding[2] ||
Padding[1] != Padding[3] ||
Padding[0] != Padding[1]) {
return false;
}The previous gate accepted any H-symmetric AND W-symmetric padding (e.g., This isn't just a tightening for the new IGEMM route — Worth a one-line note in the PR description acknowledging this is a behavioral change beyond the IGEMM regression scope — anyone bisecting an NHWC accuracy issue across this PR will appreciate it. 2. Enum and override renaming clarify scope
3. Config-option parsing — contract is now tested
Exactly the missing-test gap I flagged in the prior round. Note: the negative test catches 4.
|
|
Can you please fix the conflict ? |
ebf3f4e to
8571e8f
Compare
|
Hi @Hariharan29, thanks for the comment! I rebased the branch which should resolve the conflict. In addition, I added a small change to fix a numeric issue related to NCHW/NHWC correctness that was flagged by failing tests. With the latest commits, all tests are passing locally. |
* Added check for NHWC layout in SelectConvRoute in onnxruntime/core/mlas/lib/kleidiai/mlasi_kleidiai.h * Fallback routes in SelectConvRoute currently assume NCHW layout, added check to ensure NHWC stays on IGEMM Signed-off-by: Martin Klacer <martin.klacer@arm.com>
Signed-off-by: Martin Klacer <martin.klacer@arm.com>
8571e8f to
75f0249
Compare
This cherry-picks the following commits for the release: | Commit ID | PR Number | Commit Title | |-----------|-----------|-------------| | 56f6fee | #29038 | [CUDA] QMoE GEMV fast path for batch-1 decode | | a2c7c3b | #29081 | Fix QMoE CPU livelock by eliminating nested intra-op parallelism | | bd0cb9a | #28571 | [MLAS] KleidiAI fix igemm regression | | 5eb4aee | #29574 | Fix CustomOp forward compatibility: cap version instead of rejecting | | 5f49a37 | #29274 | fix(ci): incorrect identity for azcopy | | bb9ba7e | #29468 | Upgrade to Xcode 26 | | 36c6b7e | #29450 | Fix brew install applesimutils failure by trusting wix/brew tap | | a491809 | #29575 | Don't echo command when setting VSO variable in mac-cpu-packing-jobs.yml. | | a06675e | #29609 | Fix web e2e (npm/vite) and Python DML CI pipelines | Also fixed version missed by version update script. --------- Signed-off-by: Qxiang Xu <Qixiang.Xu@arm.com> Signed-off-by: Jonathan Clohessy <Jonathan.Clohessy@arm.com> Signed-off-by: Martin Klacer <martin.klacer@arm.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: tlwu <tlwu@example.com> Co-authored-by: Martin Klacer <martin.klacer@arm.com> Co-authored-by: Jonathan Clohessy <Jonathan.Clohessy@arm.com> Co-authored-by: Damien Dooley <damien.dooley@arm.com> Co-authored-by: Chi Lo <54722500+chilo-ms@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Sanaa Hamel <sanaahamel@microsoft.com> Co-authored-by: Edward Chen <18449977+edgchen1@users.noreply.github.com>



Description
This PR fixes a convolution performance regression affecting some OCR models with large-kernel convolutions when the KleidiAI SME IGEMM convolution path is selected.
The change has 2 parts:
ArmKleidiAI::SelectConvRoutethat decides betweenIgemm,GemmFallbackandNonebased on convolution parameters and a workload size-based heuristic.The function
CheckCapabilitiesSmerunsSelectConvRouteand only returns true if the selected route isIgemm. The patch also adds a standard GEMM fallback to theConvRoutepossibilities, and runsMlasGemmif said fallback is selected. If the function selectsNone, then the convolution falls back toMlasSgemmOperation.Motivation and Context
Fixes #27633.