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
27 changes: 27 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).

Expand Down Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<JavaExec>("exportMoonshine") {
Expand Down
2 changes: 1 addition & 1 deletion docs/modules/ROOT/pages/reference/moonshine-encoder.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
----
Expand Down
9 changes: 5 additions & 4 deletions docs/modules/ROOT/pages/reference/tokenizer-api.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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.
2 changes: 1 addition & 1 deletion docs/modules/ROOT/pages/reference/typed-decisions.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
4 changes: 2 additions & 2 deletions docs/modules/ROOT/pages/tutorials/getting-started-java.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -41,7 +41,7 @@ Or in Maven (Maven needs the `-jvm` classifier suffix on platform artifacts):
<dependency>
<groupId>sk.ainet.transformers</groupId>
<artifactId>skainet-transformers-bom</artifactId>
<version>0.60.0</version>
<version>0.61.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
----
Expand Down
2 changes: 1 addition & 1 deletion docs/modules/ROOT/pages/tutorials/llama3-tool-calling.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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")
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.transformers
VERSION_NAME=0.60.0
VERSION_NAME=0.61.0

POM_DESCRIPTION=SKaiNET-transformers

Expand Down
Loading