Skip to content

Bump ruff from 0.15.4 to 0.15.6 in /requirements/lintrunner - #6

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/pip/requirements/lintrunner/ruff-0.15.6
Closed

Bump ruff from 0.15.4 to 0.15.6 in /requirements/lintrunner#6
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/pip/requirements/lintrunner/ruff-0.15.6

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Mar 18, 2026

Copy link
Copy Markdown
Contributor

Bumps ruff from 0.15.4 to 0.15.6.

Release notes

Sourced from ruff's releases.

0.15.6

Release Notes

Released on 2026-03-12.

Preview features

  • Add support for lazy import parsing (#23755)
  • Add support for star-unpacking of comprehensions (PEP 798) (#23788)
  • Reject semantic syntax errors for lazy imports (#23757)
  • Drop a few rules from the preview default set (#23879)
  • [airflow] Flag Variable.get() calls outside of task execution context (AIR003) (#23584)
  • [airflow] Flag runtime-varying values in DAG/task constructor arguments (AIR304) (#23631)
  • [flake8-bugbear] Implement delattr-with-constant (B043) (#23737)
  • [flake8-tidy-imports] Add TID254 to enforce lazy imports (#23777)
  • [flake8-tidy-imports] Allow users to ban lazy imports with TID254 (#23847)
  • [isort] Retain lazy keyword when sorting imports (#23762)
  • [pyupgrade] Add from __future__ import annotations automatically (UP006) (#23260)
  • [refurb] Support newline parameter in FURB101 for Python 3.13+ (#23754)
  • [ruff] Add os-path-commonprefix (RUF071) (#23814)
  • [ruff] Add unsafe fix for os-path-commonprefix (RUF071) (#23852)
  • [ruff] Limit RUF036 to typing contexts; make it unsafe for non-typing-only (#23765)
  • [ruff] Use starred unpacking for RUF017 in Python 3.15+ (#23789)

Bug fixes

  • Fix --add-noqa creating unwanted leading whitespace (#23773)
  • Fix --add-noqa breaking shebangs (#23577)
  • [formatter] Fix lambda body formatting for multiline calls and subscripts (#23866)
  • [formatter] Preserve required annotation parentheses in annotated assignments (#23865)
  • [formatter] Preserve type-expression parentheses in the formatter (#23867)
  • [flake8-annotations] Fix stack overflow in ANN401 on quoted annotations with escape sequences (#23912)
  • [pep8-naming] Check naming conventions in match pattern bindings (N806, N815, N816) (#23899)
  • [perflint] Fix comment duplication in fixes (PERF401, PERF403) (#23729)
  • [pyupgrade] Properly trigger super change in nested class (UP008) (#22677)
  • [ruff] Avoid syntax errors in RUF036 fixes (#23764)

Rule changes

  • [flake8-bandit] Flag S501 with requests.request (#23873)
  • [flake8-executable] Fix WSL detection in non-Docker containers (#22879)
  • [flake8-print] Ignore pprint calls with stream= (#23787)

Documentation

  • Update docs for Markdown code block formatting (#23871)
  • [flake8-bugbear] Fix misleading description for B904 (#23731)

Contributors

... (truncated)

Changelog

Sourced from ruff's changelog.

0.15.6

Released on 2026-03-12.

Preview features

  • Add support for lazy import parsing (#23755)
  • Add support for star-unpacking of comprehensions (PEP 798) (#23788)
  • Reject semantic syntax errors for lazy imports (#23757)
  • Drop a few rules from the preview default set (#23879)
  • [airflow] Flag Variable.get() calls outside of task execution context (AIR003) (#23584)
  • [airflow] Flag runtime-varying values in DAG/task constructor arguments (AIR304) (#23631)
  • [flake8-bugbear] Implement delattr-with-constant (B043) (#23737)
  • [flake8-tidy-imports] Add TID254 to enforce lazy imports (#23777)
  • [flake8-tidy-imports] Allow users to ban lazy imports with TID254 (#23847)
  • [isort] Retain lazy keyword when sorting imports (#23762)
  • [pyupgrade] Add from __future__ import annotations automatically (UP006) (#23260)
  • [refurb] Support newline parameter in FURB101 for Python 3.13+ (#23754)
  • [ruff] Add os-path-commonprefix (RUF071) (#23814)
  • [ruff] Add unsafe fix for os-path-commonprefix (RUF071) (#23852)
  • [ruff] Limit RUF036 to typing contexts; make it unsafe for non-typing-only (#23765)
  • [ruff] Use starred unpacking for RUF017 in Python 3.15+ (#23789)

Bug fixes

  • Fix --add-noqa creating unwanted leading whitespace (#23773)
  • Fix --add-noqa breaking shebangs (#23577)
  • [formatter] Fix lambda body formatting for multiline calls and subscripts (#23866)
  • [formatter] Preserve required annotation parentheses in annotated assignments (#23865)
  • [formatter] Preserve type-expression parentheses in the formatter (#23867)
  • [flake8-annotations] Fix stack overflow in ANN401 on quoted annotations with escape sequences (#23912)
  • [pep8-naming] Check naming conventions in match pattern bindings (N806, N815, N816) (#23899)
  • [perflint] Fix comment duplication in fixes (PERF401, PERF403) (#23729)
  • [pyupgrade] Properly trigger super change in nested class (UP008) (#22677)
  • [ruff] Avoid syntax errors in RUF036 fixes (#23764)

Rule changes

  • [flake8-bandit] Flag S501 with requests.request (#23873)
  • [flake8-executable] Fix WSL detection in non-Docker containers (#22879)
  • [flake8-print] Ignore pprint calls with stream= (#23787)

Documentation

  • Update docs for Markdown code block formatting (#23871)
  • [flake8-bugbear] Fix misleading description for B904 (#23731)

Contributors

... (truncated)

Commits
  • e4c7f35 Bump 0.15.6 (#23919)
  • edfe6c1 [ty] Narrow type context during collection literal inference (#23844)
  • dd16d68 Exclude broken symlink in ecosystem check (#23921)
  • 3f94c6a Fix stack overflow in ANN401 on quoted annotations with escape sequences (#23...
  • 91fc7bd [ty] Fix false-positive diagnostics for PEP-604 union annotations on attribut...
  • 04229cf [ty] Initial test suite for PEP-728 TypedDict features (#23832)
  • 728b9d6 [pep8-naming] Check naming conventions in match pattern bindings (N806,...
  • 88d1eec [ty] Ensure a type[] type T is always considered assignable to a union th...
  • 37cdd61 Fix lambda body formatting for multiline calls and subscripts (#23866)
  • a25a4df [ty] Disambiguate duplicate-looking overloaded callables in union display (#2...
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Bumps [ruff](https://github.com/astral-sh/ruff) from 0.15.4 to 0.15.6.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](astral-sh/ruff@0.15.4...0.15.6)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.15.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file python Pull requests that update python code labels Mar 18, 2026
@github-actions

Copy link
Copy Markdown

Performance Comparison

Model Metric Baseline Current Delta
bert model_size_bytes 359 KB 359 KB +0.0%
bert num_nodes 61 61 +0.0%
falcon model_size_bytes 364 KB 364 KB +0.0%
falcon num_nodes 66 66 +0.0%
gemma2 model_size_bytes 428 KB 428 KB +0.0%
gemma2 num_nodes 109 107 -1.8%
gpt2 model_size_bytes 388 KB 388 KB +0.0%
gpt2 num_nodes 60 60 +0.0%
llama model_size_bytes 425 KB 425 KB +0.0%
llama num_nodes 68 68 +0.0%
mamba model_size_bytes 360 KB 360 KB +0.0%
mamba num_nodes 109 109 +0.0%
phi3 model_size_bytes 421 KB 421 KB +0.0%
phi3 num_nodes 68 68 +0.0%
qwen2 model_size_bytes 425 KB 425 KB +0.0%
qwen2 num_nodes 68 68 +0.0%
t5 model_size_bytes 836 KB 836 KB +0.0%
t5 num_nodes 174 174 +0.0%
whisper model_size_bytes 1008 KB 1008 KB +0.0%
whisper num_nodes 140 140 +0.0%

No performance regressions.

@dependabot @github

dependabot Bot commented on behalf of github Mar 20, 2026

Copy link
Copy Markdown
Contributor Author

Superseded by #15.

@dependabot dependabot Bot closed this Mar 20, 2026
@dependabot
dependabot Bot deleted the dependabot/pip/requirements/lintrunner/ruff-0.15.6 branch March 20, 2026 07:45
justinchuby added a commit that referenced this pull request Apr 2, 2026
Replace scattered _GQA_SUPPORT/_PACKED_ATTN_SUPPORT frozensets and
string-branching logic with a single EpCapabilities dataclass and
_EP_REGISTRY dict.

Adding EP #6 now requires a single EpCapabilities entry in _EP_REGISTRY.
No other code changes needed.

Changes:
- _builder.py: Add EpCapabilities dataclass + _EP_REGISTRY, remove
  _GQA_SUPPORT/_PACKED_ATTN_SUPPORT, update _get_optimization_passes to
  query caps.gqa_dtypes/caps.supports_* instead of ep string branches,
  update _optimize to look up caps from registry, update use_concrete_dims
  derivation to use caps.supports_shape
- _ep_validation.py: Derive KNOWN_EPS from _EP_REGISTRY (single source)
- _genai_config.py: Rename _EP_NAME_MAP to _ORT_PROVIDER_NAMES for clarity

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Justin Chu <justinchuby@users.noreply.github.com>
justinchuby added a commit that referenced this pull request Apr 3, 2026
- _execution_providers.py: replace 'Adding EP #6'/'#7' with
  'Adding a new EP = adding one entry here' (numbers go stale)
- _optimizations.py: add __all__ listing public symbols
- _builder.py: consolidate two __all__ blocks into one annotated list
  separating public API from backward-compat re-exports

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Justin Chu <justinchuby@users.noreply.github.com>
justinchuby added a commit that referenced this pull request Apr 13, 2026
…tion, embed_scale

Issue #4: Remove extra post_layernorm from _Gemma4VisionEncoderCore.
HF Gemma4VisionEncoder has no post-encoder norm. The scale-free RMSNorm
(embedding_pre_projection_norm) lives only in _Gemma4VisionEncoderModel
as projector_norm, applied once before the projector.

Issue #5: Zero padding patches and pass attention mask to vision encoder.
Detect pixel_position_ids == -1 in _Gemma4VisionPatchEmbedder; zero
position embeddings for those patches (matching HF _position_embeddings).
Build additive attention bias [B,1,1,N] with -1e9 for padding columns
and thread it through Gemma4VisionEncoderLayer -> Gemma4VisionSelfAttention
-> op.Attention. After all encoder layers, zero padding patch hidden states
before scaling/norm/projection (matching HF VisionPooler masked_fill).

Issue #6: Replace Softmax with arithmetic normalization for MoE top-k weights.
HF: top_k_weights /= top_k_weights.sum(-1, keepdim=True). We were using
op.Softmax which applies exponential re-weighting. Fix: op.ReduceSum + op.Div.

Issue #7: Remove np.float16 cast on embed_scale.
HF uses hidden_size**0.5 as exact float32. np.float16 introduces ~0.01%
rounding error on every embedding lookup. Use math.sqrt() instead.
Both occurrences fixed (_Gemma4TextModel and Gemma4EmbeddingModel).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Justin Chu <justinchuby@users.noreply.github.com>
justinchuby added a commit that referenced this pull request Apr 22, 2026
Remove the deprecated expand_kv_heads_for_attention flag entirely.
The model emits the ideal ONNX graph with native GQA head counts.

Document that nonpad_kv_seqlen (Attention input #6) is only valid in
static cache mode — ORT asserts it cannot be combined with
past_key/past_value inputs. This means it cannot replace attn_mask
in the dynamic cache path to enable Flash dispatch.

CUDA EP limitations tracked upstream:
- microsoft/onnxruntime#28195 (unfused runner NaN for head_dim>256)
- microsoft/onnxruntime#28196 (GQA kernel head_dim>256 support)

CPU EP tested: correct output on google/gemma-4-E2B-it.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Justin Chu <justinchu@microsoft.com>
titaiwangms added a commit that referenced this pull request Jun 6, 2026
The static-cache causal attention mask depends only on S_q, max_seq and
write_indices — all identical across decoder layers — so rebuilding it per
layer duplicated ~16 nodes per layer. Build the mask once and share the same
ir.Value across all layers.

- Add `causal_mask: ir.Value | None` field to StaticCacheState; thread the
  shared value from _make_static_cache_inputs into every layer's state.
- _apply_attention consumes static_cache.causal_mask when present and keeps a
  fallback that builds the mask on demand for direct callers.
- Build the mask once in _make_static_cache_inputs using input_ids (S_q) and
  cache_pairs[0][0] (max_seq); the shared Value guarantees bit-identical
  logits vs the per-layer build (parity by construction).

Also reframe the mask docstring + CHANGELOG honestly: the nonpad_kv_seqlen
key-bound is enforced by the ORT Attention kernel itself (external-cache
input #6, verified bit-identical on CUDA and CPU when poisoning padding
slots), so the causal-only mask must not re-encode it — a `j < nonpad` term
would merely duplicate input #6 and add dead nodes. Non-compact / interior
padding holes are out of contract (a scalar nonpad cannot express them).

Tests: add test_static_cache_mask_built_once (exactly one GreaterOrEqual
mask root; all Attention nodes share one mask Value) and assert shared-Value
identity in test_static_cache_attention_has_causal_mask_input.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: titaiwang <titaiwang@microsoft.com>
titaiwangms added a commit that referenced this pull request Jun 6, 2026
Batched Minor-cleanup follow-up to 36617c9 (no behavior change to shipped
Major-2 hoist). Addresses code/critical/readability review nits:

- Test the previously-uncovered _apply_attention fallback: add
  TestApplyAttentionStaticCacheFallback exercising static-cache mode with
  causal_mask=None. Asserts the fallback builds the mask via the 4-arg
  create_static_cache_causal_mask path (GreaterOrEqual root), that a hoisted
  mask Value is consumed by-identity (not rebuilt), and that the fallback graph
  is op-multiset-equivalent to the hoisted graph. (code-reviewer + critical-reviewer)

- Guard zero-layer models in _make_static_cache_inputs: early-return [] when
  cache_pairs is empty, before indexing cache_pairs[0][0], so a 0-layer config
  yields [] instead of an opaque IndexError. (critical-reviewer M2)

- Fix stale inline comment on the mask root op: "(causal + padding)" ->
  positional causal bound only; nonpad/padding is kernel-enforced (input #6),
  matching the reframed causal-only docstring. (readability M-1)

- Correct create_static_cache_causal_mask `query` param doc: it accepts a 2D
  [batch, S_q] Value (e.g. input_ids) since only dim 1 is read; drop the stale
  "dims 0/1" wording. (readability M-2)

Tests: +3 new passing (fallback path); full fast suite 21 failed / 2673 passed
/ 46 errors — zero new failures vs 36617c9 (the 21 fail + 46 err are
pre-existing missing-optional-dep collection issues). lintrunner f clean.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: titaiwang <titaiwang@microsoft.com>
titaiwangms added a commit that referenced this pull request Jun 19, 2026
Three grounded review fixes on the static-cache probe + opset lowering:

(2) ort_capabilities.py: the inner reject handler matched (NotImplemented,
    Fail) by type alone, so a genuine ORT Fail (CUDA OOM, kernel bug, install
    drift) was silently misclassified as 'needs onnxruntime#28958' -> whole
    suite skips, masking a regression. Add _is_expected_pre28958_reject():
    NotImplemented is always the confirmed pre-#28958 path; a Fail (or the
    defensive RuntimeError fallback) is accepted only when its message carries
    the reject signature (nonpad_kv_seqlen / tensorscatter), else it returns
    PROBE_ERROR and logs at WARNING so real failures stay loud. Value-based
    known-answer check preserved. Adds CPU-only unit tests for the classifier
    and the output check.

(1) _builder.py _apply_opset_lowering: the gate guarded only EP != 'default',
    so it also fired for EP == 'cpu', diverging from ort_inference. Also skip
    'cpu' (CPU EP already has opset-24 kernels). Adds a cpu-skip unit test.

(M2) ort_inference.py _should_lower_opset: only scanned top-level nodes and
    lacked the Attention input-#6 (nonpad_kv_seqlen) check. Delegate to
    _builder._graph_requires_opset24 (recursive + input-#6) so both
    opset-24-detection paths agree.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: titaiwang <titaiwang@microsoft.com>
titaiwangms added a commit that referenced this pull request Jun 19, 2026
…ew fixes

Extend coverage for each behavior added in d0e96f5, per review:

(2) ort_capabilities.py: extract _classify_run_error(exc) -> _ProbeOutcome
    (the caught session.run error -> NEEDS_FIX vs PROBE_ERROR mapping, with
    the debug/warning logging colocated) so the outcome is unit-testable
    without CUDA. New tests assert NotImplemented -> NEEDS_FIX, a
    signature-matching Fail -> NEEDS_FIX, a genuine Fail (CUDA OOM, no
    signature) -> PROBE_ERROR (not a silent 'needs #28958' skip), and the
    RuntimeError fallback -> PROBE_ERROR.

(M2) add ort_inference_test.py: _should_lower_opset with a nested If-subgraph
    Attention(nonpad_kv_seqlen input #6) -> False, proving the recursion +
    input-#6 alignment now fires where the old top-level-only scan missed it;
    plus top-level TensorScatter, standard-graph-lowers, cpu-skip,
    flag-disabled, and opset<=max guards.

(1) cpu-skip already covered by _builder_test.test_apply_opset_lowering_skipped_for_cpu_ep.

Behavior unchanged; 28 unit tests pass, static-cache GPU tests remain
fail-closed-skip on pre-#28958 ORT.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: titaiwang <titaiwang@microsoft.com>
titaiwangms added a commit that referenced this pull request Jun 19, 2026
codecov/patch flagged the new ort_capabilities.py probe-execution lines as
uncovered: on CPU CI the probe short-circuits at the no-CUDA guard, so the
graph builder, feeds, session run/classify, and skip-reason mapping never
ran end-to-end (only the pure classifier was unit-tested).

Add CPU-only coverage that mocks ort.InferenceSession to drive
_probe_static_cache_flash through every outcome - SUPPORTED, NEEDS_FIX
(NotImplemented reject + silently-wrong value), PROBE_ERROR (genuine Fail,
CUDA EP absent, unexpected build failure), and NO_CUDA - asserting the
WARNING is logged on each unexpected failure. Also cover the probe-graph
structure (TensorScatter x2 + maskless is_causal Attention with
nonpad_kv_seqlen input #6), the known-answer feeds, and the skip-reason /
supports_static_cache_flash mapping for all four outcomes. ort_capabilities.py
now 100% covered.

Add a _builder_test case for the per-model continue guard in
_apply_opset_lowering (a sub-model with no default opset import is skipped).

Behavior-preserving: production code untouched; 46 unit tests pass, the
static-cache GPU trio still fail-closed-skips on pre-#28958 ORT.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: titaiwang <titaiwang@microsoft.com>
titaiwangms added a commit that referenced this pull request Jun 23, 2026
…ion for float-bias decoders (#367)

## What
Adds a flag-gated, bias-aware variant of the shared static-cache
`Attention` path: it can now carry an optional float additive bias
(causal + sliding-window + Gemma-4 block-overlay + padding) over the
opset-24 external KV cache (`TensorScatter` + `nonpad_kv_seqlen`), with
`is_causal=0` strictly paired to bias-present. The maskless
`is_causal=1` path (#345) stays the default and is byte-identical when
the flag is off.

This is the contract-independent, ORT-testable CORE of #349 (float-bias
decoders → near-GQA decode). It does NOT re-emit Gemma-4 itself or wire
genai — those are deliberately out of scope (see below).

## Changes
- `components/_common.py`: NEW `create_static_cache_attention_bias` —
emits a `(B,1,S_q,max_seq)` additive bias keyed on absolute query
positions (`write_indices + arange(S_q)`) over dense cache slots with
validity `slot < nonpad_kv_seqlen`, reusing the proven
`create_attention_bias` causal/sliding/block-overlay/padding rules
(re-keyed to static-cache geometry). Exported from
`components/__init__.py`.
- `components/_attention.py`: static branch now derives `(mask_arg,
is_causal)` from `attn_mask` presence — bias-present ⇒ `is_causal=0`
(strictly paired; incoming `is_causal` ignored so the two can never
disagree), maskless ⇒ `is_causal=1`. `nonpad_kv_seqlen` kept as
Attention input #6 in both modes.
- `models/base.py`: `TextModel` threads the bias when
`flags.static_cache_bias` is on AND the model has a `sliding_window` AND
static cache is active; otherwise exact prior maskless behavior.
- `_flags.py`: NEW `MOBIUS_STATIC_CACHE_BIAS` env flag (default OFF) →
`flags.static_cache_bias`.
- `tests/static_cache_bias_parity_test.py`: NEW — ORT CPU (MEA)
manual-feed parity vs an independent numpy dense-attention reference for
a prefill chunk, a decode step, a per-batch B=2 decode (write/nonpad
broadcasting), a sliding-window sweep, and a nonpad padding-clamp; plus
graph-wiring tests asserting flag-off=maskless,
flag-on+sliding=bias-threaded (is_causal=0, bias input#3, nonpad
input#6), and flag-on+non-sliding (llama) stays maskless. 10/10 on CPU;
no genai, no Flash, no onnxruntime#28958 required.

## Why flag-gated / what's deferred (Phase 2, under #349)
The bias geometry is a pure function of model semantics + cache layout,
independent of how the runtime drives the graph — so it is safe to land
before the genai consumer exists. Explicitly OUT OF SCOPE here:
re-emitting Gemma-4's own task/model on the static path,
`genai_config.json` wiring, single-graph vs prefill/decode-split
packaging, e2e generation/decode profiling, the 4D KV layout migration,
and block-overlay at non-zero write offsets (decode-time block overlay
is a no-op under the current scatter-current-chunk geometry; TODO noted
in the test file).

## Verified
- 10/10 new parity tests on CPU (ORT MEA) vs an independent numpy dense
reference; broad non-integration sanity 2927 passed / 43 skipped;
lintrunner clean (real pyproject config).
- Triple-reviewed (code + critical + readability) on the impl + a
code/critical delta pass on the review polish. Critical empirically
verified on CPU that the bias-MEA contract keeps every query row's
diagonal slot valid (no fully-masked row → no NaN edge).

## Relationships
- Closes #366
- Part of #349 (Gemma-4 end-to-end near-GQA decode consumer)
- Sibling to #345 (maskless `is_causal=1` static-cache graph) — shares
the `TensorScatter` + `nonpad_kv_seqlen` primitive; this PR adds the
bias variant.
- genai-side driving tracked separately at
microsoft/onnxruntime-genai#2204.

---------

Signed-off-by: titaiwang <titaiwang@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file python Pull requests that update python code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants