ollama/x/imagegen/mlx
Daniel Hiltgen 630882621b
llama-server followups (#16353)
* llama-server followups

Misc fixes for #16031
- Add back dropped ROCm build flag for multi-GPU support on windows
- Fix amdhip64_*.dll version detection for "latest" selection
- Fix embeddings API for consistent normalize behavior with prior versions

* ci: set up for automated llama.cpp update testing

* reduce batch for fa-disabled, and constrained vram

* mlx: fix v3 load bug on m5

Imagegen was incorrectly loading v3 first.  This DRYs out the loading code so imagegen gets the same new v4/v3 selection logic.

* fix reload bug on embedding models

* bump version

* steer user how to enable iGPU when disabled
2026-06-01 10:44:21 -07:00
..
CMakeLists.txt runner: Remove CGO engines, use llama-server exclusively for GGML models (#16031) 2026-05-29 13:35:47 -07:00
compile.go runner: Remove CGO engines, use llama-server exclusively for GGML models (#16031) 2026-05-29 13:35:47 -07:00
doc.go MLX: add header vendoring and remove go build tag (#14642) 2026-03-09 17:24:45 -07:00
generate_wrappers.go MLX: add header vendoring and remove go build tag (#14642) 2026-03-09 17:24:45 -07:00
mlx.c Update MLX and MLX-C with threading fixes (#15845) 2026-05-03 10:03:14 -07:00
mlx.go llama-server followups (#16353) 2026-06-01 10:44:21 -07:00
mlx.h Update MLX and MLX-C with threading fixes (#15845) 2026-05-03 10:03:14 -07:00
mlx_dynamic.c MLX: add header vendoring and remove go build tag (#14642) 2026-03-09 17:24:45 -07:00
mlx_dynamic.h MLX: add header vendoring and remove go build tag (#14642) 2026-03-09 17:24:45 -07:00
mlx_error_handler.c MLX: harden for init failures (#14777) 2026-03-10 22:52:23 -07:00
mlx_error_handler.h MLX: harden for init failures (#14777) 2026-03-10 22:52:23 -07:00
mlx_test.go runner: Remove CGO engines, use llama-server exclusively for GGML models (#16031) 2026-05-29 13:35:47 -07:00
README.md Add experimental MLX backend and engine with imagegen support (#13648) 2026-01-08 16:18:59 -08:00

MLX Memory Management

| This package will get consolidated with x/ml/backend/mlx in the future.

Automatic Tracking

All arrays are automatically tracked when created. On Eval(), non-kept arrays are freed.

API

result := mlx.Matmul(x, w) // arrays automatically tracked
mlx.Eval(result)           // free non-kept, eval result (auto-kept)

Key Functions

  • mlx.Eval(outputs...) - free non-kept arrays, then evaluate (outputs auto-kept)
  • mlx.AsyncEval(outputs...) - async version of Eval (outputs auto-kept)
  • mlx.Keep(arrays...) - mark arrays to survive cleanup (for weights, caches)
  • array.Free() - mark array for cleanup on next Eval

Loop Pattern

for step := 0; step < maxTokens; step++ {
    logits := model.Forward(token, caches)
    oldToken := token
    token = sample(logits)

    // Keep cache state across iterations
    for _, c := range caches {
        mlx.Keep(c.State()...)
    }

    oldToken.Free()       // mark for cleanup
    mlx.AsyncEval(token)  // frees old, evals new
}

Notes

  • Eval() and AsyncEval() auto-keep their outputs
  • Free() marks for cleanup - actual free happens during next Eval
  • Use Keep() for weights and cache state that must survive multiple Eval cycles
  • Arrays created inside compiled closures are managed by MLX, not tracked