Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,16 @@

## [Unreleased]

## [0.57.0] - 2026-09-24

Headline: **grouped-query KV-cache graphs export with an attention mask, and the toolchain moves to
Kotlin 2.4.20.** The StableHLO attention converter now emits valid IR for an explicit mask under
grouped-query attention and onto a dynamic key length, the shape of a chunked-prefill graph over a
KV cache. Static graphs emit exactly what they did in 0.56.0.

Version note: SKaiNET-transformers 0.57.0 follows on this engine release, keeping the two on one
version line.

### Fixed

- **SDPA StableHLO export: explicit masks under grouped-query attention and onto a dynamic key
Expand All @@ -14,6 +24,25 @@
`known_nonexpanding_dimensions`, the form IREE 3.11 lowers. Static graphs are unchanged. Note:
IREE 3.11 does not lower `dynamic_reshape`, so for IREE prefer a head-shared `[b, 1, Sq, ?]` mask
when the key length is dynamic.
- **`skainet-data-source` exports kotlinx-io as `api`** (#1295). `DataSourceArtifact.openSource()` /
`copyTo()`, `DataSourceRemoteContent` and `DataSourceArtifactStore` expose `kotlinx.io.Source` and
`Sink`, but kotlinx-io was an implementation dependency (runtime scope in the published POM), so
consumers failed with "Cannot access class kotlinx.io.Source" unless they declared it themselves.

### Changed

- **Kotlin 2.4.20** (#1304; supersedes #1271, #1272, #1273), with the Kotlin/JS `yarn.lock`
regenerated for the newer JS toolchain.
- **Security pins**: the `webpack` pin is dropped. Kotlin 2.4.20's Gradle plugin requests webpack
5.108.1, already past 5.104.1, the first release clearing GHSA-8fgc-7cc6-rx7x and
GHSA-38r7-794h-5758, so the pin only held the bundler behind the version the plugin is tested
with. All other npm pins are unchanged.
- **Dependencies**: AGP 9.4.1 (#1299), Ktor client 3.6.0 (#1296), kctfork 0.14.0 (#1300).
- **CI**: the publish workflow gains a manual dry run (`workflow_dispatch`): the full release
pipeline into Maven Local, never given the Maven Central credentials (#1294). `GITFLOW.adoc`
documents the dry-run and green-before-tag gates. Action bumps: `actions/deploy-pages` 5.0.1
(#1263), `android-actions/setup-android` 4.0.4 (#1298), `github/codeql-action/upload-sarif`
4.38.1 (#1297).

## [0.56.0] - 2026-09-20

Expand Down
34 changes: 17 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ Add the core dependencies (Gradle Kotlin DSL):
```kotlin
dependencies {
// Recommended: import the umbrella BOM and drop versions on the engine modules.
implementation(platform("sk.ainet:skainet-bom:0.56.0"))
implementation(platform("sk.ainet:skainet-bom:0.57.0"))

implementation("sk.ainet.core:skainet-lang-core")
implementation("sk.ainet.core:skainet-backend-cpu")
Expand Down Expand Up @@ -308,24 +308,18 @@ val withoutLabel = dataPipeline<RawDataset>()

---

## What's New in 0.56.0
## What's New in 0.57.0

Grouped-query attention becomes native to the engine, and the compiled leg of SKEEP-005 lands:
Grouped-query KV-cache graphs export with an attention mask, and the toolchain moves to Kotlin 2.4.20:

- **Grouped-query `scaledDotProductAttention`** — K/V arrive with their own head count
(`[b, nKV, Sk, hd]`); query head `h` reads K/V head `h / (H / nKV)`. Bit-identical to before when
`nKV == H`, and to the old tiled form otherwise. Model code no longer expands K/V heads before
attention — not eagerly, not on the tape.
- **Leaner StableHLO for GQA models** — attention lowers with the head groups as a batching
dimension, so exports carry no broadcast or concatenate of K/V.
- **Structure at compile time, cores at run time** — `ScheduleAnnotationPass` stamps structural
defaults (`parallel_dims = [batch, heads]` on every attention); an explicit `parallelism` is
advisory and a default can never carry a core count.
- **Graph contexts honour the schedule of their ops** — the new `ScheduledOps` seam lets
`DefaultGraphExecutionContext` answer `schedule`/`withSchedule` from the ops it wraps, so the JVM
`ComputeGraphExecutor` runs under the caller's schedule.

0.55.0 is skipped so the engine and SKaiNET-transformers share a version line again.
- **Masked grouped-query attention exports to valid StableHLO** — a per-head mask under GQA is split
into the K/V head groups instead of broadcast onto them, and a mask onto a dynamic key length (the
chunked-prefill shape of a KV-cache graph) uses `dynamic_broadcast_in_dim` with the expansion hints
IREE 3.11 needs. Static graphs emit exactly what they did before.
- **kotlinx-io is part of `skainet-data-source`'s API** — callers of `openSource()` / `copyTo()` no
longer need to declare it themselves.
- **Kotlin 2.4.20**, AGP 9.4.1, Ktor client 3.6.0; the `webpack` security pin is retired now that
the Kotlin toolchain's own webpack is past the fix.

See [CHANGELOG.md](CHANGELOG.md) for full release notes, including every prior release.

Expand All @@ -351,6 +345,12 @@ We love contributions! Whether it's a new operator, documentation, or a bug fix:

Browse the full codebase documentation on [DeepWiki](https://deepwiki.com/SKaiNET-developers/SKaiNET).

### Contributors (0.57.0)

- **Michal Harakal** ([@michalharakal](https://github.com/michalharakal)) — masked grouped-query
attention in the StableHLO export, the kotlinx-io API fix, the Kotlin 2.4.20 upgrade, and the
publish dry run

### Contributors (0.56.0)

- **Michal Harakal** ([@michalharakal](https://github.com/michalharakal)) — grouped-query-native
Expand Down
2 changes: 1 addition & 1 deletion docs/antora.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ asciidoc:
framework_name: SKaiNET
# Current SKaiNET release — bump once per release; referenced as
# {skainet_version} in dependency snippets (blocks need subs="attributes+").
skainet_version: 0.56.0
skainet_version: 0.57.0
ksp_version: 2.2.21-2.0.5
dokka_version: 2.1.0
asciidoctorj_version: 3.0.0
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
= Kernel × platform support matrix
:description: Which compute-kernel provider serves each weight format on each KMP target.

Generated from `kernel-support.json` (version `0.56.0`) by `KernelSupportMatrixTest` — registry introspection of the registered `KernelProvider` implementations. Do not edit by hand; run `./gradlew generateKernelMatrix` to refresh.
Generated from `kernel-support.json` (version `0.57.0`) by `KernelSupportMatrixTest` — registry introspection of the registered `KernelProvider` implementations. Do not edit by hand; run `./gradlew generateKernelMatrix` to refresh.

Each cell is the best (highest-priority) provider that serves `Float32 × format` `matmul` on that platform: *native-ffm* (100) → *panama-vector* (50) → *scalar* (0). An empty cell (`—`) means no provider carries a kernel there (the format is dequant-to-FP32 only).

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
= AI-NET Operators Reference

Generated from version `0.56.0` on 2026-09-20
Generated from version `0.57.0` on 2026-09-24

== Operators by Modality

Expand Down
2 changes: 1 addition & 1 deletion docs/modules/ROOT/pages/reference/ops-status-matrix.adoc
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
= Operator Coverage Matrix
:description: Cross-backend status for every operator function in SKaiNET.

Generated from `operators.json` version `0.56.0` on 2026-09-20.
Generated from `operators.json` version `0.57.0` on 2026-09-24.

Rows are `Operator.function` pairs. The `Validated` column shows whether the function's documentation has been DARC-validated by a reviewer (see xref:contributing/darc-workflow.adoc[DARC workflow]). Remaining columns are backends that appear in any function's `statusByBackend` map — a missing entry means the backend makes no claim about the function (treat it as "unknown", not "not supported").

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ An Android project with Kotlin. Add the SKaiNET modules:
[source,kotlin]
----
dependencies {
implementation("sk.ainet.core:skainet-lang-core:0.56.0") // tensors, DSL, training
implementation("sk.ainet.core:skainet-backend-cpu:0.56.0") // CPU ops
implementation("sk.ainet.core:skainet-compile-dag:0.56.0") // autograd (training context)
implementation("sk.ainet.core:skainet-data-api:0.56.0") // Dataset / DataBatch
implementation("sk.ainet.core:skainet-data-simple:0.56.0") // embedded Iris
runtimeOnly("sk.ainet.core:skainet-backend-jni-cpu:0.56.0") // NEON kernels (see below)
implementation("sk.ainet.core:skainet-lang-core:0.57.0") // tensors, DSL, training
implementation("sk.ainet.core:skainet-backend-cpu:0.57.0") // CPU ops
implementation("sk.ainet.core:skainet-compile-dag:0.57.0") // autograd (training context)
implementation("sk.ainet.core:skainet-data-api:0.57.0") // Dataset / DataBatch
implementation("sk.ainet.core:skainet-data-simple:0.57.0") // embedded Iris
runtimeOnly("sk.ainet.core:skainet-backend-jni-cpu:0.57.0") // NEON kernels (see below)
}
----

Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
GROUP=sk.ainet.core
VERSION_NAME=0.56.0
VERSION_NAME=0.57.0
POM_DESCRIPTION=SKaiNET

POM_URL=https://github.com/SKaiNET-developers/skainet/
Expand Down
Loading