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
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.54.1] — 2026-09-07

A transformers-only release, same pattern as 0.40.2: no new engine version, still against
**SKaiNET engine 0.54.0**. `MultiHeadAttention` becomes the first consumer of the engine's
SKEEP-005 `Schedule`, and positional KV caches stop copying the whole prefix per layer per token.

### Added — schedule-driven attention: parallel heads, copy-free K/V (SKaiNET SKEEP-005)

- **Attention heads run in parallel** (#413): `MultiHeadAttention` maps heads (or GQA groups) onto
Expand All @@ -32,7 +38,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
`SKAINET_KV_CACHE=append|positional` (verified on Llama-3.2-1B, Qwen2.5-0.5B and Qwen3-1.7B
Q8_0); `AttentionScheduleSpeedProfile` (opt-in) measures all four combinations. Docs: `docs/specs/attention-schedule.md`, the *Parallel Attention Heads via
Schedules* explanation and the *Parallel Attention — Getting Started* tutorial.
- Requires engine **0.54.0** (published; see below).

## [0.54.0] — 2026-09-07

Expand Down
17 changes: 13 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,18 @@ Honest status — see the project-status note at the top of this README.

## Current release

The current release is **0.54.0** (against **SKaiNET 0.54.0**) — version lock-step with the engine
continues, plus two bugs fixed on real hardware and the FunctionGemma/IREE-Android chunked-KV work
closed out.
The current release is **0.54.1** (against **SKaiNET 0.54.0** — a transformers-only release, same
pattern as 0.40.2: no new engine version needed).

**Attention heads run in parallel.** `MultiHeadAttention` is the first consumer of the engine's
SKEEP-005 `Schedule`: heads (or GQA groups) map onto cores via `AttentionSchedulePolicy`
(`Sequential` / `PerHead` / `PerKVGroup` / `Auto`), bit-identical to the sequential path.
`KVCache.updateInPlace` returns copy-free `KVBufferView`s for positional caches instead of copying
the whole prefix per layer per token, and `DecoderKVCacheKind.POSITIONAL` brings that to Llama and
Qwen. Verified on Llama-3.2-1B, Qwen2.5-0.5B and Qwen3-1.7B against mainline llama.cpp.

It builds on **0.54.0**, which restored version lock-step with the engine, plus two bugs fixed on
real hardware and the FunctionGemma/IREE-Android chunked-KV work closed out.

**A stateful Android KV session for FunctionGemma.** `IreeKvSession` / `IreeKvDecoder`
(`llm-runtime/iree-android`) prefill the tool catalog once per process, snapshot the KV state, and
Expand Down Expand Up @@ -209,7 +218,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.54.0"))
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.54.1"))

// Versions resolved from the BOM:
implementation("sk.ainet.transformers:skainet-transformers-core")
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.54.0"))
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.54.1"))
implementation("sk.ainet.transformers:skainet-transformers-inference-moonshine")
}
----
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.54.0"))
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.54.1"))
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.54.0"))
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.54.1"))

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.54.0</version>
<version>0.54.1</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.54.0"))
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.54.1"))
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.54.0"))
implementation(platform("sk.ainet.transformers:skainet-transformers-bom:0.54.1"))

implementation("sk.ainet.transformers:skainet-transformers-runtime-kllama")
implementation("sk.ainet.transformers:skainet-transformers-agent")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ schedule only decides where the work runs.

* JDK 21+ (the JVM is the only target with a parallel schedule; others run `Schedule.Sequential`).
* A Llama 3.2 or Qwen3 GGUF, for example `Llama-3.2-1B-Instruct-Q8_0.gguf`.
* SKaiNET-transformers 0.54.0 or later, or — until that release — the `feature/attention-schedule`
branch built against the engine checkout with `-PuseLocalSkainet=true`.
* SKaiNET-transformers 0.54.1 or later.

== Step 1: Dependencies

Expand Down
7 changes: 3 additions & 4 deletions docs/specs/attention-schedule.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
**Depends on:** SKaiNET engine `Schedule` API — [SKEEP-005](https://skainet-developers.github.io/SKaiNET/skainet/skeep/005-schedules-structured-concurrency.html) (`sk.ainet.context.schedule`, `DirectCpuExecutionContext(schedule = …)`, `CoroutineSchedule`)
**Issues:** transformers #412 (per-head fused attention copies the K/V prefix per layer per token), #413 (attention is single-threaded)
**Labels:** enhancement, performance
**Milestone:** 0.54.0 (lock-step with engine 0.54.0)
**Milestone:** 0.54.1 (transformers-only release; engine 0.54.0)

---

Expand Down Expand Up @@ -132,9 +132,8 @@ returns `null` (→ copied path) on segment-backed data. Every override returns
| AS-8 | vectorised inner dots, growable positional cache | follow-up |

Checkpoints: CP-1 engine `Schedule` API available (SKaiNET `feature/skeep-005-schedules`);
CP-2 transformer-core parity green; CP-3 golden gates green under every switch; CP-4 both
repositories released as 0.54.0 in lock-step (until then: build transformers with
`-PuseLocalSkainet=true`).
CP-2 transformer-core parity green; CP-3 golden gates green under every switch; CP-4 engine
0.54.0 published, transformers released as 0.54.1 on top of it.

[transformers#412]: https://github.com/SKaiNET-developers/SKaiNET-transformers/issues/412
[transformers#413]: https://github.com/SKaiNET-developers/SKaiNET-transformers/issues/413
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.54.0
VERSION_NAME=0.54.1

POM_DESCRIPTION=SKaiNET-transformers

Expand Down
6 changes: 3 additions & 3 deletions llm-inference/gemma/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Reusable **Gemma** model (incl. the FunctionGemma tool-calling fine-tune) author
a portable graph producer with **no runtime/board/Torq code**. Pair it with the runtime module below to
decode on-device.

- **Coordinate:** `sk.ainet.transformers:skainet-transformers-inference-gemma:0.54.0`
- **Coordinate:** `sk.ainet.transformers:skainet-transformers-inference-gemma:0.54.1`
- **Targets:** `android`, `iosArm64`, `iosSimulatorArm64`, `macosArm64`, `linuxX64`, `linuxArm64` (broadly
portable — mobile through server).
- **Entry point:** `gemmaNetwork()` / `GemmaNetworkLoader` (loads a GGUF, builds the DSL graph, incl. the
Expand All @@ -24,8 +24,8 @@ FunctionGemma has a one-liner facade in `…:skainet-transformers-runtime-kgemma

```kotlin
dependencies {
implementation("sk.ainet.transformers:skainet-transformers-inference-gemma:0.54.0")
implementation("sk.ainet.transformers:skainet-transformers-runtime-gemma-iree:0.54.0") // on-device decode
implementation("sk.ainet.transformers:skainet-transformers-inference-gemma:0.54.1")
implementation("sk.ainet.transformers:skainet-transformers-runtime-gemma-iree:0.54.1") // on-device decode
}
```

Expand Down