Skip to content

ci: add GitHub Actions workflow - #1

Merged
ausimian merged 1 commit into
mainfrom
ci/github-actions
Apr 14, 2026
Merged

ci: add GitHub Actions workflow#1
ausimian merged 1 commit into
mainfrom
ci/github-actions

Conversation

@ausimian

@ausimian ausimian commented Apr 14, 2026

Copy link
Copy Markdown
Owner

Summary

  • macOS arm64 runner (macos-14) — Emily is Apple-Silicon-only, so no Linux matrix
  • precommit job on every PR and push to main: mix deps.get && mix precommit
  • soak job scheduled nightly (03:17 UTC): runs mix test --only soak
  • Caches: MLX prebuilt archive (~100 MB), deps/, _build/

Test plan

  • Workflow syntax parses once pushed
  • First run on this PR shows green precommit on M0 main (base for the rebased feature-branch PRs)
  • MLX prebuilt cache hit on the second run

- precommit job on macos-14 (arm64): runs mix precommit on every PR
  and push to main. Caches deps, _build, and the MLX prebuilt archive
  (~100 MB) so subsequent runs don't re-download.
- soak job: nightly-only (17 3 UTC), runs the :soak tag.
- concurrency group cancels superseded runs on the same ref.
@ausimian
ausimian merged commit d8541aa into main Apr 14, 2026
4 checks passed
@ausimian
ausimian deleted the ci/github-actions branch April 14, 2026 01:37
ausimian added a commit that referenced this pull request Apr 14, 2026
A pure-C++ microbenchmark on MLX 0.25.1 / Apple Silicon GPU shows the
fusion win on a Qwen3-0.6B-shaped transformer block is 1.04x-1.07x
(GPU) and a regression on CPU (0.82x-0.88x) — well below the PLAN's
1.20x gate. A sanity workload (pure 8-op elementwise chain) in the
same harness shows 2.78x GPU / 1.47x CPU, so the measurement is
trustworthy — the limiting factor is that MLX compile doesn't fuse
matmul with surrounding elementwise ops, and transformer inference is
matmul-dominated. Fusion wins are confined to RMSNorm / softmax /
SwiGLU neighbourhoods, a small fraction of block runtime.

The BEAM-integrated compile path could not exceed this C++ ceiling,
so Phase 2 (approach review) and Phase 3 (implementation) were not
built.

Retained as permanent fixtures so the decision can be re-measured
against future MLX releases without rebuilding the harness:

  - bench/native/compile_microbench.cpp — transformer block + sanity
    elementwise chain, both timed compiled vs uncompiled.
  - lib/mix/tasks/bench.native.ex — `mix bench.native` invokes the
    new `bench-native` Makefile target with the same env elixir_make
    sets, reusing the project's pinned MLX without a second fetch.
    Supports --seq / --warmup / --iters via `mix bench.native -- ...`.
  - Makefile: `bench-native` target, produces
    $(BUILD_DIR)/compile_microbench and runs it.
  - bench/compile_microbench.md — results table + reproduction.

PLAN.md: M6 section rewritten to record the drop with the measurement;
core design decision #1 and the M5 footnote updated to match.
Emily.Compiler moduledoc note reframed.
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