diff --git a/CHANGELOG.md b/CHANGELOG.md index 06fddafb..ecf65b6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## [0.17.0] - 2026-03-25 + +### Added +- **Core Engine Focus**: Refactored the repository to focus on the core `ComputeGraph` framework, compiler, and backends. +- **Standalone Ecosystem**: Extracted high-level LLM and transformer implementations to dedicated repositories ([SKaiNET-LLM](https://github.com/SKaiNET-developers/SKaiNET-LLM) and [SKaiNET-transformers](https://github.com/SKaiNET-developers/SKaiNET-transformers)). +- **LLM-as-DSL**: High-level DSL for defining and running LLM architectures within the core `ComputeGraph` framework. +- **ComputeGraphExecutor**: New optimized executor with support for fusion passes and trace-to-DAG bridging. +- **SDPA & Gather**: Implementation of Scaled Dot-Product Attention (SDPA) and `gather`/`indexSelect` ops across backends. +- **EmbeddingAdapter**: Streamlined embedding layer integration for transformer models. + +### Changed +- **Optimized LLM execution**: Integrated fusion passes for faster inference on supported backends. +- **Improved Tensor API**: Refined `Tensor` interface and updated `ComputeGraphExecutor` for better type safety and performance. +- **Dependency Cleanups**: Removed stale references to LLM and transformer code already moved to the standalone `skainet-transformers` repository. + +### Fixed +- **Embedding Padding**: Fixed `paddingIdx` handling in embedding layers. +- **Concatenation**: Resolved rank-specific issues in tensor concatenation (rank > 1). +- **Compilation**: Fixed various build and compilation errors after module migrations. + ## [0.16.0] - 2026-03-08 ### Added diff --git a/README.md b/README.md index 52e1f024..edfbcf59 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,8 @@ Add the core dependencies (Gradle Kotlin DSL): ```kotlin dependencies { - implementation("sk.ainet.core:SKaiNET-lang-core:0.16.0") - implementation("sk.ainet.core:SKaiNET-backend-cpu:0.16.0") + implementation("sk.ainet.core:SKaiNET-lang-core:0.17.0") + implementation("sk.ainet.core:SKaiNET-backend-cpu:0.17.0") } ``` @@ -37,31 +37,49 @@ val model = nn { } ``` -### Hello LLM +### Core Tensor Ops ```kotlin -val ctx = DirectCpuExecutionContext() -val ingestion = LlamaIngestion(ctx) -val weights = ingestion.load { SystemFileSystem.source(Path("model.gguf")).buffered() } -val tokenizer = GGUFTokenizer.fromSource(SystemFileSystem.source(Path("model.gguf")).buffered()) - -val runtime = LlamaRuntime(ctx, weights) -runtime.generate(tokenizer.encode("Once upon a time"), steps = 64) { token -> - print(tokenizer.decode(token)) -} +val a = tensor(shape(2, 2)) { float(1f, 2f, 3f, 4f) } +val b = tensor(shape(2, 2)) { float(5f, 6f, 7f, 8f) } + +val c = a matMul b +val d = c.relu() +``` + +### GGUF Model Loading + +```kotlin +val source = SystemFileSystem.source(Path("model.gguf")).buffered() +val reader = GGUFReader(source) + +val tensor = reader.tensors.first { it.name == "token_embd.weight" } +val weights = reader.materialize(tensor) ``` > **More examples:** [SKaiNET-examples](https://github.com/SKaiNET-developers/SKaiNET-examples) | [SKaiNET-notebook](https://github.com/SKaiNET-developers/SKaiNET-notebook) --- +## Ecosystem + +SKaiNET is a modular ecosystem. While this repository contains the core engine, specialized high-level libraries are maintained in standalone repositories: + +| Project | Description | +|---|---| +| [SKaiNET-LLM](https://github.com/SKaiNET-developers/SKaiNET-LLM) | Llama, Gemma, and BERT inference runtimes | +| [SKaiNET-transformers](https://github.com/SKaiNET-developers/SKaiNET-transformers) | Pre-built transformer architectures and layers | +| [SKaiNET-examples](https://github.com/SKaiNET-developers/SKaiNET-examples) | Sample projects and integration demos | + +--- + ## Explore | Goal | Start here | |---|---| | Examples and sample projects | [SKaiNET-examples](https://github.com/SKaiNET-developers/SKaiNET-examples) | | Interactive notebooks | [SKaiNET-notebook](https://github.com/SKaiNET-developers/SKaiNET-notebook) | -| LLM inference (Llama, Gemma) | [docs/kllama-getting-started.md](docs/kllama-getting-started.md) | +| LLM inference (Llama, Gemma) | [SKaiNET-LLM](https://github.com/SKaiNET-developers/SKaiNET-LLM) | | Java 21+ integration | [docs/java-getting-started.md](docs/java-getting-started.md) | | Data loading and transforms | [docs/io-readers-guide.md](docs/io-readers-guide.md) | | Graph DSL (ResNet, YOLO) | [docs/graph-dsl.md](docs/graph-dsl.md) | @@ -79,18 +97,15 @@ runtime.generate(tokenizer.encode("Once upon a time"), steps = 64) { token -> - Targets: JVM, macOS (Native), JS, WASM (Browser + WasmWasi) - Single codebase shared across all platforms via Kotlin Multiplatform -### LLM Inference +### Optimized Execution -- **KLlama**: Llama-family models from GGUF files with streaming generation -- **KGemma**: Gemma 3n models from SafeTensors with HuggingFace tokenizer -- **KBert**: BERT and Sentence-Transformers for embeddings -- JVM acceleration via MemorySegment tensors, SIMD GEMM, paged KV cache +- **ComputeGraphExecutor**: Optimized engine with fusion passes and trace-to-DAG bridging. +- **SDPA & Gather**: High-performance Scaled Dot-Product Attention and indexing operations. -### Agentic AI +### Agentic AI Infrastructure -- Function / tool calling via `skainet-kllama-agent` -- `AgentLoop` for multi-turn tool-use conversations -- Java facade: `JavaAgentLoop` +- **ComputeGraph**: Unified framework for defining agentic workflows and tool-calling loops. +- Java facade: `JavaAgentLoop` (in `skainet-lang-java`) ### Neural Network DSL @@ -109,9 +124,8 @@ runtime.generate(tokenizer.encode("Once upon a time"), steps = 64) { token -> ### Java 21+ Support - `SKaiNET` entry point, `TensorJavaOps`, builder-pattern model definition -- `KLlamaJava` / `KBertJava` facades for blocking and async inference - Maven BOM (`sk.ainet:skainet-bom`) for one-line version management -- Docs: [Getting Started](docs/java-getting-started.md) | [LLM Inference](docs/java-llm-inference.md) | [Model Training](docs/java-model-training.md) +- Docs: [Getting Started](docs/java-getting-started.md) | [Model Training](docs/java-model-training.md) ### Edge AI: Arduino / C99 Export @@ -128,12 +142,12 @@ runtime.generate(tokenizer.encode("Once upon a time"), steps = 64) { token -> --- -## What's New in 0.16.0 - -- **Unified LLM core** — deduplicated and optimized implementation of `KvCache`, `softmax`, `RoPE`, and `sampling` -- **Infrastructure cleanup** — extracted core LLM and transformer code to standalone repositories `SKaiNET-transformers`) to streamline the core project -- **Consistent BOM** — refactored `skainet-bom` to use local `project()` references for reliable builds +## What's New in 0.17.0 +- **Core Engine Focus** — Refactored the repository to focus on the core `ComputeGraph` framework, compiler, and backends. Extracted high-level LLM and transformer implementations to standalone repositories. +- **LLM-as-DSL** — New high-level DSL for defining and running LLM architectures within the core framework. +- **Optimized ComputeGraphExecutor** — New executor with support for fusion passes and trace-to-DAG bridging for faster inference. +- **SDPA & Gather** — Implemented Scaled Dot-Product Attention and `gather`/`indexSelect` ops for improved performance. See [CHANGELOG.md](CHANGELOG.md) for the full release history. diff --git a/build.gradle.kts b/build.gradle.kts index f7e55781..27e43398 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -55,6 +55,8 @@ subprojects { tasks.withType().configureEach { maxHeapSize = "8192m" } + + apply(plugin = "org.jetbrains.kotlinx.kover") } kover { @@ -70,6 +72,12 @@ kover { } } +dependencies { + subprojects.forEach { + kover(it) + } +} + // Custom task to generate operator documentation tasks.register("generateOperatorDocs") { group = "documentation" diff --git a/gradle.properties b/gradle.properties index 53bff0f4..08a952b0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ GROUP=sk.ainet.core -VERSION_NAME=0.17.0-SNAPSHOT +VERSION_NAME=0.17.0 POM_DESCRIPTION=SKaiNET diff --git a/skainet-backends/skainet-backend-cpu/build.gradle.kts b/skainet-backends/skainet-backend-cpu/build.gradle.kts index f7a3da73..54d14a7c 100644 --- a/skainet-backends/skainet-backend-cpu/build.gradle.kts +++ b/skainet-backends/skainet-backend-cpu/build.gradle.kts @@ -5,7 +5,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.vanniktech.mavenPublish) - alias(libs.plugins.kover) alias(libs.plugins.binary.compatibility.validator) id("sk.ainet.dokka") } diff --git a/skainet-compile/skainet-compile-c/build.gradle.kts b/skainet-compile/skainet-compile-c/build.gradle.kts index c7b23065..7379b3e2 100644 --- a/skainet-compile/skainet-compile-c/build.gradle.kts +++ b/skainet-compile/skainet-compile-c/build.gradle.kts @@ -5,7 +5,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.vanniktech.mavenPublish) - alias(libs.plugins.kover) alias(libs.plugins.binary.compatibility.validator) id("sk.ainet.dokka") } diff --git a/skainet-compile/skainet-compile-core/build.gradle.kts b/skainet-compile/skainet-compile-core/build.gradle.kts index 942f0fae..e75187fe 100644 --- a/skainet-compile/skainet-compile-core/build.gradle.kts +++ b/skainet-compile/skainet-compile-core/build.gradle.kts @@ -5,7 +5,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.vanniktech.mavenPublish) - alias(libs.plugins.kover) alias(libs.plugins.binary.compatibility.validator) id("sk.ainet.dokka") } diff --git a/skainet-compile/skainet-compile-dag/build.gradle.kts b/skainet-compile/skainet-compile-dag/build.gradle.kts index ecf33e04..4281ec71 100644 --- a/skainet-compile/skainet-compile-dag/build.gradle.kts +++ b/skainet-compile/skainet-compile-dag/build.gradle.kts @@ -5,7 +5,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.vanniktech.mavenPublish) - alias(libs.plugins.kover) alias(libs.plugins.binary.compatibility.validator) id("sk.ainet.dokka") } diff --git a/skainet-compile/skainet-compile-hlo/build.gradle.kts b/skainet-compile/skainet-compile-hlo/build.gradle.kts index 7599cbf5..8d64638c 100644 --- a/skainet-compile/skainet-compile-hlo/build.gradle.kts +++ b/skainet-compile/skainet-compile-hlo/build.gradle.kts @@ -5,7 +5,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.vanniktech.mavenPublish) - alias(libs.plugins.kover) alias(libs.plugins.binary.compatibility.validator) id("sk.ainet.dokka") } diff --git a/skainet-compile/skainet-compile-opt/build.gradle.kts b/skainet-compile/skainet-compile-opt/build.gradle.kts index f81e43a2..0315845f 100644 --- a/skainet-compile/skainet-compile-opt/build.gradle.kts +++ b/skainet-compile/skainet-compile-opt/build.gradle.kts @@ -5,7 +5,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.vanniktech.mavenPublish) - alias(libs.plugins.kover) alias(libs.plugins.binary.compatibility.validator) } diff --git a/skainet-data/skainet-data-api/build.gradle.kts b/skainet-data/skainet-data-api/build.gradle.kts index 2b4dabfd..175b2f3f 100644 --- a/skainet-data/skainet-data-api/build.gradle.kts +++ b/skainet-data/skainet-data-api/build.gradle.kts @@ -5,7 +5,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.vanniktech.mavenPublish) - alias(libs.plugins.kover) id("sk.ainet.dokka") } diff --git a/skainet-data/skainet-data-media/build.gradle.kts b/skainet-data/skainet-data-media/build.gradle.kts index 75f29e92..fef837f2 100644 --- a/skainet-data/skainet-data-media/build.gradle.kts +++ b/skainet-data/skainet-data-media/build.gradle.kts @@ -4,7 +4,6 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) - alias(libs.plugins.kover) id("sk.ainet.dokka") } diff --git a/skainet-data/skainet-data-simple/build.gradle.kts b/skainet-data/skainet-data-simple/build.gradle.kts index f534a8ac..562bedd6 100644 --- a/skainet-data/skainet-data-simple/build.gradle.kts +++ b/skainet-data/skainet-data-simple/build.gradle.kts @@ -5,7 +5,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.vanniktech.mavenPublish) - alias(libs.plugins.kover) id("sk.ainet.dokka") } diff --git a/skainet-data/skainet-data-transform/build.gradle.kts b/skainet-data/skainet-data-transform/build.gradle.kts index 6929cc9d..0824f133 100644 --- a/skainet-data/skainet-data-transform/build.gradle.kts +++ b/skainet-data/skainet-data-transform/build.gradle.kts @@ -5,7 +5,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.vanniktech.mavenPublish) - alias(libs.plugins.kover) id("sk.ainet.dokka") } diff --git a/skainet-lang/skainet-lang-core/build.gradle.kts b/skainet-lang/skainet-lang-core/build.gradle.kts index 1a46f062..6f88d96a 100644 --- a/skainet-lang/skainet-lang-core/build.gradle.kts +++ b/skainet-lang/skainet-lang-core/build.gradle.kts @@ -5,7 +5,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.vanniktech.mavenPublish) - alias(libs.plugins.kover) alias(libs.plugins.binary.compatibility.validator) alias(libs.plugins.ksp) id("sk.ainet.dokka") diff --git a/skainet-lang/skainet-lang-dag/build.gradle.kts b/skainet-lang/skainet-lang-dag/build.gradle.kts index c1ab1c9c..448bc18c 100644 --- a/skainet-lang/skainet-lang-dag/build.gradle.kts +++ b/skainet-lang/skainet-lang-dag/build.gradle.kts @@ -5,7 +5,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.vanniktech.mavenPublish) - alias(libs.plugins.kover) alias(libs.plugins.binary.compatibility.validator) alias(libs.plugins.ksp) id("sk.ainet.dokka") diff --git a/skainet-lang/skainet-lang-models/build.gradle.kts b/skainet-lang/skainet-lang-models/build.gradle.kts index de9bc544..49b96ab9 100644 --- a/skainet-lang/skainet-lang-models/build.gradle.kts +++ b/skainet-lang/skainet-lang-models/build.gradle.kts @@ -5,7 +5,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.vanniktech.mavenPublish) - alias(libs.plugins.kover) alias(libs.plugins.binary.compatibility.validator) id("sk.ainet.dokka") } diff --git a/skainet-models/skainet-model-yolo/build.gradle.kts b/skainet-models/skainet-model-yolo/build.gradle.kts index c1a912db..35211d9f 100644 --- a/skainet-models/skainet-model-yolo/build.gradle.kts +++ b/skainet-models/skainet-model-yolo/build.gradle.kts @@ -5,7 +5,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.vanniktech.mavenPublish) - alias(libs.plugins.kover) alias(libs.plugins.binary.compatibility.validator) id("sk.ainet.dokka") } diff --git a/skainet-pipeline/build.gradle.kts b/skainet-pipeline/build.gradle.kts index da0c2c5d..61234ad7 100644 --- a/skainet-pipeline/build.gradle.kts +++ b/skainet-pipeline/build.gradle.kts @@ -5,7 +5,6 @@ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidMultiplatformLibrary) alias(libs.plugins.vanniktech.mavenPublish) - alias(libs.plugins.kover) alias(libs.plugins.binary.compatibility.validator) id("sk.ainet.dokka")