x/imagegen/mlx/README.md
| This package will get consolidated with x/ml/backend/mlx in the future.
All arrays are automatically tracked when created. On Eval(), non-kept arrays are freed.
result := mlx.Matmul(x, w) // arrays automatically tracked
mlx.Eval(result) // free non-kept, eval result (auto-kept)
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 Evalfor 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
}
Eval() and AsyncEval() auto-keep their outputsFree() marks for cleanup - actual free happens during next EvalKeep() for weights and cache state that must survive multiple Eval cycles