This repository contains demos, benchmarks, and documentation from the "JVM in the Age of AI" conference talk (JFokus 2026). All demos are functional and can be run on your own hardware.
# Run all smoke tests (quick validation)
./gradlew runSmokeTests
# Run all LLM inference runs
./gradlew runBenchmarksAll demos use the same model: Llama 3.2 1B Instruct (FP16, ~2.5 GB)
| Demo | Technology | Command |
|---|---|---|
| java-llama.cpp | JNI + Metal/CUDA GPU | ./gradlew :demos:java-llama-cpp:run |
| Cyfra | Scala + Vulkan GPU | ./cyfra-demo/scripts/run-cyfra-llama.sh |
| Llama3.java | Pure Java Vector API | ./gradlew :demos:llama3-java:run |
| GraalPy (CPython) | Python (CPython) | ./gradlew :demos:graalpy:llamaPython |
| TornadoVM | Java + OpenCL GPU | ./demos/tornadovm/scripts/run-gpullama3.sh |
| GraalPy (GraalPy) | Python (GraalPy) | β Fails |
| Demo | Technology | Purpose | Command |
|---|---|---|---|
| TensorFlow FFM | FFM API | TensorFlow C API from Java | ./gradlew :demos:tensorflow-ffm:run |
| JCuda | JNI | CUDA device detection | ./gradlew :demos:jcuda:run |
| TornadoVM | TaskGraph | GPU array operations | ./demos/tornadovm/scripts/run-tornado.sh |
| Babylon | Code Reflection | HAT GPU MatMul | ./demos/babylon/run-babylon.sh |
| Valhalla | Vector API | FP16 + SIMD operations | ./gradlew :demos:valhalla:run |
| Cyfra | Scala/Vulkan | GPU programming | See cyfra-demo/ |
./gradlew runSmokeTestsRuns:
- TensorFlow FFM smoke test
- JCuda device detection
- Valhalla Vector API demos
- Babylon RuntimeCheck
- TornadoVM baseline
- GraalPy basic embedding
Duration: ~2-3 minutes
./gradlew runBenchmarksRuns:
- Llama3.java (JDK 25)
- java-llama.cpp (Metal/CUDA)
- GraalPy CPython LLM
- GraalPy GraalPy LLM (fails - expected)
Duration: ~5-10 minutes (includes model loading)
Requires: Model at ~/.llama/models/Llama-3.2-1B-Instruct-f16.gguf
- SDKMAN: https://sdkman.io
# From repository root
sdk env install && sdk env
# For each demo (optional - each has .sdkmanrc, they require different JDKs)
cd demos/<demo-name>
sdk env install && sdk env./scripts/download-models.sh --fp16All Java demos follow consistent structure:
demos/<demo-name>/
βββ src/main/java/com/skowronski/talk/jvmai/
β βββ *.java # Java sources
βββ build.gradle.kts # Gradle build
βββ .sdkmanrc # JDK version
βββ README.md # Quick start guide
βββ Findings.md # Technical deep dive
Package: All Java demos use com.skowronski.talk.jvmai
# All 3 demos (basic, CPython LLM, GraalPy LLM)
./gradlew :demos:graalpy:run./gradlew :demos:tensorflow-ffm:run./gradlew :demos:java-llama-cpp:run./gradlew :demos:jcuda:run# JDK 25 (fast - ~13 tok/s)
./gradlew :demos:llama3-java:run
# JDK 21 (slow - ~0.3 tok/s, 40x slower!)
./gradlew :demos:llama3-java:llama21# Both Vector API and FP16 demos
./gradlew :demos:valhalla:run# RuntimeCheck + HAT MatMul (if Babylon JDK + HAT available)
./demos/babylon/run-babylon.sh
# RuntimeCheck only
./gradlew :demos:babylon:run# CPU baseline
./gradlew :demos:tornadovm:run
# GPU version (auto-downloads TornadoVM SDK)
./demos/tornadovm/scripts/run-tornado.shcd cyfra-demo
./scripts/run-cyfra-llama.sh --model ~/.llama/models/Llama-3.2-1B-Instruct-f16.gguf --prompt "Hello"Demo-specific findings:
- demos/graalpy/Findings.md - GraalPy technical analysis and ctypes limitations
- demos/valhalla/FINDINGS.md - Float16 and Vector API research
- demos/tensorflow-ffm/Findings.md - FFM vs JNI analysis
- demos/java-llama-cpp/Findings.md - JNI performance deep dive
- demos/jcuda/Findings.md - JCuda vs alternatives
- demos/llama3-java/Findings.md - Vector API 40x performance mystery
- demos/babylon/Findings.md - Code Reflection and HAT
- demos/tornadovm/Findings.md - TornadoVM technical analysis