Skip to content

Add a Windows / Intel Core Ultra guide: which artifacts, and how to start them - #575

Merged
bernardladenthin merged 1 commit into
mainfrom
docs/windows-core-ultra
Oct 26, 2026
Merged

bernardladenthin merged 1 commit into
mainfrom
docs/windows-core-ultra

Conversation

@bernardladenthin

Copy link
Copy Markdown
Owner

Adds docs/windows-intel-core-ultra.md plus a five-line pointer in the README's "Choosing the natives jars".

Why

"Which classifier do I take?" has a different answer per CPU generation, and the answer for a modern Intel laptop part is not obvious: no AVX-512, but AVX-VNNI; an iGPU that Vulkan reaches for free; an NPU only OpenVINO can address, and that one is opt-in for a measured reason. The guide works one concrete machine through end to end — an Intel Core Ultra 7 165U (Meteor Lake-U) — and holds for any Windows x86-64 machine with an Intel iGPU.

The target environment is deliberately narrow: Maven and several JDKs in C:\Program Files\Java, nothing else. No JBang, no C++ toolchain, no checkout. Four steps, every command PowerShell, everything run out of the local Maven repository.

What it says

  • The artifacts: classes jar + cpu-windows-x86-64 + vulkan-windows-x86-64 = 29 MiB. Why alderlake is the CPU module this CPU gets, and that the variant exists only because the Windows CPU jar is built with plain clang (clang-cl cannot build it). Why SYCL costs a oneAPI 2026 install, why ggml's OpenCL backend is irrelevant here, and why llama-platform is the wrong choice on a known machine — it carries six platforms' library jars for the one that is used.
  • Two JDKs: core and both servers are Java 8+, the agent is Java 21 bytecode and fails in the compiler below that. JAVA_HOME per window; the machine-wide default stays on 8.
  • Step 2, pre-loading: mvn dependency:go-offline, per pom.
  • Step 3: the built-in C++ server with its WebUI on a port, plus the two Invoke-RestMethod calls to test /health and a chat completion.
  • Step 4: the Atmosphere agent against that server (one loaded model, driven over HTTP), its web console on 8787, and the --model variant without a server.
  • Thread count as the biggest knob on this CPU: not all 14 threads, because ggml's barrier waits for the two LP-E cores in the SoC tile.
  • What the start-up log proves, and that net.ladenthin.llama.backend is a filter rather than a switch.
  • The NPU: openvino-windows-x86-64 is the only path to it, is opt-in for the measured reason in docs/benchmarks/gpu-module-jars.md, and is explicitly flagged as unmeasured on this hardware.

Verified rather than written from the documentation

  • exec-maven-plugin 3.6.4 is compiled for Java 8 (mojo.java.target=8, prerequisite Maven 3.6.3) and maven-dependency-plugin 3.11.0 declares Java 8 — read off their poms, which is what lets the claim "a stock Maven 3.9 on a JDK 8 runs every server example" stand.
  • dependency:go-offline followed by a fully offline mvn -o exec:java on a packaging=pom project starts the server out of the m2 repository: natives extracted, [RPC, Vulkan, CPU] registered, listening on 9931. The first attempt failed with No plugin found for prefix 'exec', which is why the guide says go-offline must run per pom — that is the step that caches the plugins.
  • go-offline resolves the dependency tree without honouring <exclusions>, so the agent pom also caches the other five platforms' library jars (~113 MiB). Harmless for a pre-load, and the effective classpath still honours the exclusion.
  • Both poms declare the main class as the property exec.mainClass, not as the plugin's <mainClass>: an explicit <mainClass> wins over the command line, so -Dexec.mainClass=…Diagnose silently started the server instead — observed while checking it, then fixed and re-verified.

Sizes in the guide come from the Maven Central directory listings of 6.0.0.

Notes

  • New file, so it does not collide with concurrent edits elsewhere; inline SPDX header like docs/c-api.md, so REUSE.toml is untouched.
  • check-natives.py: 0 disagreements. reuse lint: clean. Every relative link and anchor resolves.
  • Independent of Add a post-release check: audit a published release from the outside #574 (docs/post-release-check); both branch off main and touch different files.

🤖 Generated with Claude Code

https://claude.ai/code/session_01E2h8gXyyE5UeimkL9vQv9G

…tart them

For a machine that has Maven and several JDKs in Program Files and nothing
else: no JBang, no C++ toolchain, no checkout. Four steps, every command
PowerShell, everything run out of the local Maven repository -- two small
poms, one `dependency:go-offline` up front, then `mvn exec:java` with the
JDK the window's JAVA_HOME points at.

Worked through on a Core Ultra 7 165U (Meteor Lake-U), because "which
classifier do I take" has a different answer per CPU generation and the
question keeps coming up.

What the guide says:

- Which jars: the classes jar plus cpu-windows-x86-64, and
  vulkan-windows-x86-64 for the Arc iGPU -- 29 MiB, the only GPU backend
  here that needs nothing installed. SYCL only against the oneAPI 2026
  runtime, OpenCL and the other GPU jars not at all, and not llama-platform
  on a known machine: it carries six platforms' library jars for the one
  that is used.
- Why alderlake is the CPU module here (AVX2 + AVX-VNNI, no AVX-512), and
  that the variant exists only because the Windows CPU jar is built with
  plain clang -- clang-cl cannot build it.
- The two JDKs: the core and both servers are Java 8+, the agent is Java 21
  bytecode and fails in the compiler below that. So JAVA_HOME per window,
  and the machine-wide default stays on 8.
- Step 2, pre-loading, with the two things measured about it: it must run
  per pom, because that is what caches the plugins (without it the first
  offline run fails with "No plugin found for prefix 'exec'"), and
  go-offline resolves the tree without honouring <exclusions>, so the agent
  pom also caches the other five platforms' library jars.
- Step 3: the server with its WebUI on a port, plus the two Invoke-RestMethod
  calls to test /health and a chat completion.
- Step 4: the agent against that server (one loaded model, driven over
  HTTP), its web console on 8787, and the --model variant without a server.
- Thread count as the biggest knob: not all 14 threads, because ggml's
  barrier waits for the two LP-E cores in the SoC tile.
- What the start-up log proves, and that net.ladenthin.llama.backend is a
  filter rather than a switch.
- The NPU: openvino-windows-x86-64 is the only path to it, is opt-in for the
  measured reason, and is explicitly unmeasured on this hardware.

Verified rather than written from the documentation: go-offline then a fully
offline `mvn -o exec:java` on a packaging=pom project starts the server off
the m2 repository (natives extracted, Vulkan and CPU registered, listening);
and the main class is declared as the property exec.mainClass on purpose --
an explicit <mainClass> in the plugin configuration wins over the command
line, so -Dexec.mainClass=...Diagnose would silently start the server
instead, which is what happened while checking it.

The README gets a five-line pointer in "Choosing the natives jars"; the
guide is a new file so it does not collide with other edits, and carries an
inline SPDX header like docs/c-api.md, so REUSE.toml stays untouched.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E2h8gXyyE5UeimkL9vQv9G
@coderabbitai

coderabbitai Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Caution

Review failed

The pull request is closed.

Finishing Touches
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@bernardladenthin
bernardladenthin merged commit 4ee05f6 into main Oct 26, 2026
13 of 19 checks passed
@bernardladenthin
bernardladenthin deleted the docs/windows-core-ultra branch October 26, 2026 10:12
@sonarqubecloud

Copy link
Copy Markdown

This branch had an error being deployed

1 failed and 1 active deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant