From dee70c8333dcaa98100e46c57f4774d30c665ca4 Mon Sep 17 00:00:00 2001 From: michalharakal Date: Fri, 16 Oct 2026 07:37:07 +0200 Subject: [PATCH 1/4] docs(changelog): 0.61.0 entry --- CHANGELOG.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4364b34f..d444910d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.61.0] — 2026-10-16 + +**Padded batches for the encoders.** Against engine **0.60.0**, which gives +`scaledDotProductAttention` key lengths, a window and a right context carried as op metadata +(`maskKind`) and a `skainet.sdpa` composite for fused attention kernels. BERT-class encoders and the +Laya decision models run the sequences of one request as right-padded batches (#490): one attention +node per layer takes the batch's lengths instead of a dense `[b, 1, S, S]` mask, the lengths are a +graph input on the compiled path, and the Laya adapter reports `batchSupport = true`. Parity holds +(the multilingual predict fixtures reproduce through the batched path, 55 values, max |diff| 4.99e-5; +batched vs single logits within 1.9e-6). On the eager FP32 CPU path a batch saves about 10 % per +question at best, since that path is compute-bound; the gain is for the compiled lane and for +accelerators. The BOM re-exports `skainet-bom:0.60.0`. Engine 0.60.0 made its io-core compatibility +aliases errors; the transformers SKEEP-006 schedule moves by one more minor (see *Deprecated*). + ### Added - **Padded batches for the encoders** (#490): `PaddedBatch` (`transformer-core`) describes a @@ -36,6 +50,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Engine 0.60.0** (`scaledDotProductAttention` with `keyLengths`, `window`, `rightContext`; `skainet.sdpa` composite). The version catalog moves `sk.ainet.core:*` to 0.60.0. +### Deprecated + +- **Schedule moved by one more minor.** The SKEEP-006 legacy surface (`GGUFTokenizer` and its + strategies, `TokenizerType`, `SentencePieceSpecialTokens`, `TekkenTokenizerAdapter`, `ModelRegistry`, + the `sk.ainet.apps.kllama.GGUFTokenizer` alias) stays at WARNING in 0.61, goes to ERROR in 0.62 + and leaves in 0.63; `TokenizerFactory` and the `sk.ainet.apps.llm.Tokenizer` sub-interface are + deprecated in 0.62 and removed in 0.63. The runtimes, CLIs and benchmarks still reach the engine + through the factory; this release carries the engine bump and the batched encoders, and that + migration stays a release of its own. The engine's own io-core aliases (`sk.ainet.io.tokenizer.*`, + `sk.ainet.io.model.ModelFormat`, the weight name maps) are errors since engine 0.60.0; the two + tests here that still imported `sk.ainet.io.tokenizer.SentencePieceTokenizer` use the + `sk.ainet.frontend.tokenizer` home. + ## [0.60.0] — 2026-10-15 **Exact GELU from the engine.** Against engine **0.59.0**, which makes `erf` a first-class op and From 230d53676bd984714da748d63051ff4a2ad03194 Mon Sep 17 00:00:00 2001 From: michalharakal Date: Fri, 16 Oct 2026 07:37:07 +0200 Subject: [PATCH 2/4] docs(readme): 0.61.0 highlights and BOM coordinate --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1af8a179..4d2b4b48 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,11 @@ Honest status — see the project-status note at the top of this README. ## Current release -The current release is **0.60.0**, against **SKaiNET 0.59.0**. +The current release is **0.61.0**, against **SKaiNET 0.60.0**. + +**Padded batches for the encoders.** SKaiNET 0.60.0 gives `scaledDotProductAttention` key lengths, a window and a right context carried as op metadata (`maskKind`), with a `skainet.sdpa` composite for targets that have a fused attention kernel. BERT-class encoders and the Laya decision models run the sequences of one request as right-padded batches (#490): `BertEncoderRuntime.encodeBatch` / `encodePadded`, `LayaDecisionModel.logitsBatch`, the Laya adapter with `batchSupport = true`. One attention node per layer takes the batch's lengths instead of a dense mask, so the compiled path gets the lengths as a graph input. The multilingual predict fixtures reproduce through the batched path (55 values, max |diff| 4.99e-5) and batched and single logits agree within 1.9e-6. On the eager FP32 CPU path a batch saves about 10 % per question at best; the gain is for the compiled lane and accelerators. The SKEEP-006 legacy tokenizer surface stays at WARNING in 0.61; the schedule moves by one more minor (ERROR in 0.62, gone in 0.63). + +It builds on **0.60.0**, against **SKaiNET 0.59.0**: **Exact GELU from the engine.** SKaiNET 0.59.0 makes `erf` a first-class op and gives `gelu` an `approximate` flag that travels as op metadata through the graph executor, the backward rule and the StableHLO export. Laya's decision models now run their exact GELU through `gelu(approximate = false)` instead of a host-side loop per FFN per layer, and the multilingual predict fixtures still reproduce (55 values, max |diff| 4.99e-5). The SKEEP-006 legacy tokenizer surface stays at WARNING in 0.60; the schedule moves by one more minor (ERROR in 0.61, gone in 0.62). @@ -291,7 +295,7 @@ The recommended way to consume is via the BOM. It pins every published `skainet- ```kotlin dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.61.0")) // Versions resolved from the BOM: implementation("sk.ainet.transformers:skainet-transformers-core") From a38476ce73ec8badf8521f08240e7396c9d75d76 Mon Sep 17 00:00:00 2001 From: michalharakal Date: Fri, 16 Oct 2026 07:37:07 +0200 Subject: [PATCH 3/4] docs: bump version references to 0.61.0 --- .../ROOT/pages/how-to/export-moonshine-v2-streaming.adoc | 2 +- docs/modules/ROOT/pages/reference/moonshine-encoder.adoc | 2 +- docs/modules/ROOT/pages/reference/tokenizer-api.adoc | 9 +++++---- docs/modules/ROOT/pages/reference/typed-decisions.adoc | 2 +- .../ROOT/pages/tutorials/android-getting-started.adoc | 2 +- .../ROOT/pages/tutorials/getting-started-java.adoc | 4 ++-- .../ROOT/pages/tutorials/getting-started-leaf.adoc | 2 +- .../ROOT/pages/tutorials/llama3-tool-calling.adoc | 2 +- 8 files changed, 13 insertions(+), 12 deletions(-) diff --git a/docs/modules/ROOT/pages/how-to/export-moonshine-v2-streaming.adoc b/docs/modules/ROOT/pages/how-to/export-moonshine-v2-streaming.adoc index db660631..d03cdac9 100644 --- a/docs/modules/ROOT/pages/how-to/export-moonshine-v2-streaming.adoc +++ b/docs/modules/ROOT/pages/how-to/export-moonshine-v2-streaming.adoc @@ -32,7 +32,7 @@ From your own build, resolve the published module and run its main class: ---- val exportTool by configurations.creating dependencies { - exportTool(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) + exportTool(platform("sk.ainet.transformers:skainet-transformers-bom:0.61.0")) exportTool("sk.ainet.transformers:skainet-transformers-inference-moonshine") } tasks.register("exportMoonshine") { diff --git a/docs/modules/ROOT/pages/reference/moonshine-encoder.adoc b/docs/modules/ROOT/pages/reference/moonshine-encoder.adoc index 14514990..121609b5 100644 --- a/docs/modules/ROOT/pages/reference/moonshine-encoder.adoc +++ b/docs/modules/ROOT/pages/reference/moonshine-encoder.adoc @@ -24,7 +24,7 @@ a DSL decoder is future work. [source,kotlin] ---- dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.61.0")) implementation("sk.ainet.transformers:skainet-transformers-inference-moonshine") } ---- diff --git a/docs/modules/ROOT/pages/reference/tokenizer-api.adoc b/docs/modules/ROOT/pages/reference/tokenizer-api.adoc index 8f6531d7..f968ee9b 100644 --- a/docs/modules/ROOT/pages/reference/tokenizer-api.adoc +++ b/docs/modules/ROOT/pages/reference/tokenizer-api.adoc @@ -87,7 +87,8 @@ descriptor with `+`. `GGUFModelInfo.identity` is the string identity |=== `HuggingFaceBPETokenizer` (no callers since 0.58) was removed in 0.59.0. The schedule for the -rest moved by one minor in 0.59.0 and by one more in 0.60.0: the legacy classes stay at WARNING -through 0.60, go to ERROR in 0.61 and leave in 0.62, because the runtimes, CLIs and benchmarks -still reach the engine through `TokenizerFactory` and the sub-interface, and moving them is a -release of its own. +rest moved by one minor in 0.59.0, in 0.60.0 and again in 0.61.0: the legacy classes stay at +WARNING through 0.61, go to ERROR in 0.62 and leave in 0.63, because the runtimes, CLIs and +benchmarks still reach the engine through `TokenizerFactory` and the sub-interface, and moving +them is a release of its own. The engine's io-core aliases they wrapped are errors since +SKaiNET 0.60.0; new code imports the `sk.ainet.frontend.tokenizer` home directly. diff --git a/docs/modules/ROOT/pages/reference/typed-decisions.adoc b/docs/modules/ROOT/pages/reference/typed-decisions.adoc index 5872b4db..70527526 100644 --- a/docs/modules/ROOT/pages/reference/typed-decisions.adoc +++ b/docs/modules/ROOT/pages/reference/typed-decisions.adoc @@ -12,7 +12,7 @@ below put that on the JVM path with the same contract for every model. [source,kotlin] ---- dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.61.0")) implementation("sk.ainet.transformers:skainet-transformers-decisions-api") // the contract, no engine dependency implementation("sk.ainet.transformers:skainet-transformers-decisions-runtime") // validation + acceptance policy implementation("sk.ainet.transformers:skainet-transformers-inference-laya") // Laya as a DecisionAdapter diff --git a/docs/modules/ROOT/pages/tutorials/android-getting-started.adoc b/docs/modules/ROOT/pages/tutorials/android-getting-started.adoc index b5f7cb46..0ee8ff3b 100644 --- a/docs/modules/ROOT/pages/tutorials/android-getting-started.adoc +++ b/docs/modules/ROOT/pages/tutorials/android-getting-started.adoc @@ -55,7 +55,7 @@ dependencies { // self-registers it on ART at process start — nothing to call. runtimeOnly("sk.ainet.core:skainet-backend-jni-cpu") - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.61.0")) implementation("sk.ainet.transformers:skainet-transformers-core") implementation("sk.ainet.transformers:skainet-transformers-runtime-kllama") implementation("sk.ainet.transformers:skainet-transformers-inference-llama") diff --git a/docs/modules/ROOT/pages/tutorials/getting-started-java.adoc b/docs/modules/ROOT/pages/tutorials/getting-started-java.adoc index 966487a1..dfd17a7d 100644 --- a/docs/modules/ROOT/pages/tutorials/getting-started-java.adoc +++ b/docs/modules/ROOT/pages/tutorials/getting-started-java.adoc @@ -25,7 +25,7 @@ In your `build.gradle.kts`: [source,kotlin] ---- dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.61.0")) implementation("sk.ainet.transformers:skainet-transformers-runtime-kllama") implementation("sk.ainet.transformers:skainet-transformers-agent") @@ -41,7 +41,7 @@ Or in Maven (Maven needs the `-jvm` classifier suffix on platform artifacts): sk.ainet.transformers skainet-transformers-bom - 0.60.0 + 0.61.0 pom import diff --git a/docs/modules/ROOT/pages/tutorials/getting-started-leaf.adoc b/docs/modules/ROOT/pages/tutorials/getting-started-leaf.adoc index 7a97ee4f..a73064e6 100644 --- a/docs/modules/ROOT/pages/tutorials/getting-started-leaf.adoc +++ b/docs/modules/ROOT/pages/tutorials/getting-started-leaf.adoc @@ -34,7 +34,7 @@ encoder output to the advertised dimensionality. The runtime applies it automati [source,kotlin] ---- dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.61.0")) implementation("sk.ainet.transformers:skainet-transformers-providers") } ---- diff --git a/docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc b/docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc index c58b8aee..49beb751 100644 --- a/docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc +++ b/docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc @@ -52,7 +52,7 @@ The pieces you need live in three modules: [source,kotlin] ---- dependencies { - implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.60.0")) + implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.61.0")) implementation("sk.ainet.transformers:skainet-transformers-runtime-kllama") implementation("sk.ainet.transformers:skainet-transformers-agent") From 39c1f0564631e9d755b1969a0e416bb6adc572d7 Mon Sep 17 00:00:00 2001 From: michalharakal Date: Fri, 16 Oct 2026 07:37:07 +0200 Subject: [PATCH 4/4] release: prepare 0.61.0 -- against engine 0.60.0 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 6f505c9a..b965875b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ GROUP=sk.ainet.transformers -VERSION_NAME=0.60.0 +VERSION_NAME=0.61.0 POM_DESCRIPTION=SKaiNET-transformers