Why
#115 added arm64 code paths (arch detection, AMD-on-aarch64 -> vulkan fallback, doctor check_arch) but CI still only runs on ubuntu-latest which is x86_64. Means any future regression in the arm64 code path (a stray if arch == 'x86_64' somewhere, an apt package that doesn't exist on arm64, a python wheel without arm64 build) won't be caught until someone with arm64 hardware reports it.
The Dockerfiles that work on arm64 today:
Dockerfile.vulkan — ubuntu + mesa, fully multi-arch ready
Dockerfile.v31 — needs the sbsa/l4t base image swap, harder to test in CI without paying for arm64 runners
Dockerfile.rocm — permanently x86_64 only (no AMD arm64 release)
so the right scope is: add linux/arm64 to the buildx matrix for Dockerfile.vulkan only, leaving the others alone.
Scope
- Add
platforms: linux/amd64,linux/arm64 to the build-push-action call for the llama service in .github/workflows/build-images.yml IF a separate Dockerfile.vulkan job exists (currently it doesn't... build-images.yml only builds Dockerfile.v31)
- Probably easier: add a new matrix entry for the vulkan image so it gets published as a separate
atlas-llama-vulkan:dev / :latest tag, then make THAT one multi-arch
- Use QEMU emulation on the free GH runners (slow but free) OR opt into ARM64-native GH runners (
ubuntu-24.04-arm, fast but paid)
- Update
docs/SETUP.md#arm64 to point at the prebuilt arm64 image once it's published
Tradeoffs
- QEMU build time for arm64 llama image is going to be painful... probably 60-90min vs 30min for native amd64. The cmake compile is the bottleneck and QEMU adds 3-5x overhead on it.
- arm64 native runners would be ~10min but they're not free.
- A reasonable compromise: only build arm64 on tag pushes (releases), not on every dev push. Dev iteration stays fast, releases get the full matrix.
Dependencies
Why
#115 added arm64 code paths (arch detection, AMD-on-aarch64 -> vulkan fallback, doctor check_arch) but CI still only runs on
ubuntu-latestwhich is x86_64. Means any future regression in the arm64 code path (a strayif arch == 'x86_64'somewhere, an apt package that doesn't exist on arm64, a python wheel without arm64 build) won't be caught until someone with arm64 hardware reports it.The Dockerfiles that work on arm64 today:
Dockerfile.vulkan— ubuntu + mesa, fully multi-arch readyDockerfile.v31— needs the sbsa/l4t base image swap, harder to test in CI without paying for arm64 runnersDockerfile.rocm— permanently x86_64 only (no AMD arm64 release)so the right scope is: add
linux/arm64to the buildx matrix forDockerfile.vulkanonly, leaving the others alone.Scope
platforms: linux/amd64,linux/arm64to the build-push-action call for the llama service in.github/workflows/build-images.ymlIF a separateDockerfile.vulkanjob exists (currently it doesn't... build-images.yml only builds Dockerfile.v31)atlas-llama-vulkan:dev/:latesttag, then make THAT one multi-archubuntu-24.04-arm, fast but paid)docs/SETUP.md#arm64to point at the prebuilt arm64 image once it's publishedTradeoffs
Dependencies
docs/SETUP.md#arm64