AI Coding Agents στον Mac σου: Πώς να τους τρέξεις τοπικά χωρίς κόπο
Το τοπικό AI γίνεται σοβαρό
Όλοι το έχουμε πάθει. Είσαι βυθισμένος σε μια marathon coding session, το μυαλό δουλεύει, και ξαφνικά — blackout. Το cloud-based AI assistant γίνεται άχρηστο, και μένεις να κοιτάς τον κώδικα απορημένος.
Αυτό ακριβώς μου συνέβη πρόσφατα, και με έσπρωξε να εξερευνήσω επιτέλους την τοπική εκτέλεση ενός ικανού AI coding agent. Αυτό που ανακάλυψα με εξέπληξε: με τη σωστή ρύθμιση, η απόδοση σε Apple Silicon είναι εντυπωσιακά αξιοπρεπής, συχνά καλύτερη από εξειδικευμένες Mac-optimized λύσεις.
Η Ρύθμιση που Δουλεύει
Μετά από αρκετό testing και benchmarking, κατέληξα σε αυτή τη διαμόρφωση που έδωσε τα καλύτερα αποτελέσματα στο M1 Max με 64GB unified memory:
Βασικό Stack:
- llama.cpp compiled με Metal acceleration
- Gemma 4 26B-A4B σε GGUF format (quantized σε Q4)
- Multi-Token Prediction (MTP) draft model για speculative decoding
- Gemma 4 multimodal projector για υποστήριξη screenshots
- Pi ως terminal-based coding agent
Δεν είναι η πιο ισχυρή δυνατή ρύθμιση, αλλά είναι το sweet spot για πραγματική χρηστικότητα. Θες ταχύτητα μετρημένη σε tokens ανά δευτερόλεπτο, όχι λεπτά ανά απόκριση.
Τα Νούμερα που Μετράνε
Έτρεξα συνεπείς benchmarks χρησιμοποιώντας αυτό το prompt σε όλες τις διαμορφώσεις:
"Write a compact Python function that parses a unified diff and returns the changed file paths. Then explain two edge cases."
Κάθε test δημιουργούσε περίπου 128 tokens, δίνοντάς μας δίκαιη σύγκριση ταχύτητας generation.
Baseline Απόδοση:
Τρέχοντας το Gemma 4 απευθείας μέσω llama.cpp με Metal πήραμε 58.2 tokens ανά δευτερόλεπτο. Αυτό είναι χρηστικό, αλλά ειλικρινά; Έμοιαζε αργό σε πραγματικές coding sessions όπου κάνεις πολλαπλά tool calls και περιμένεις απαντήσεις.
Η Διαφορά του MTP:
Εδώ τα πράγματα γίνονται ενδιαφέροντα. Το Multi-Token Prediction επιτρέπει στο μοντέλο να "μαντεύει" πολλαπλά tokens μπροστά, αποδεχόμενο σωστές προβλέψεις και κάνοντας rollback σε λανθασμένες. Με το Q8 MTP draft model ενεργοποιημένο, η απόδοση εκτοξεύτηκε στα 72.2 tokens ανά δευτερόλεπτο — 24% βελτίωση χωρίς καμία αλλαγή στο κύριο μοντέλο.
Το prompt processing έμεινε ουσιαστικά ίδιο (γύρω στα 297-299 tokens/second), αλλά η generation speed είναι αυτό που έχει σημασία για agent workflows. Δεν στέλνεις συνεχώς νέα prompts — περιμένεις το μοντέλο να δημιουργήσει απαντήσεις, να πάρει αποφάσεις και να εκτελέσει εργαλεία.
Δοκίμασα draft token counts από 1 έως 6, και στο M1 Max μου, τα 3 draft tokens ήταν το ideal spot. Τιμές πάνω από 4 στην πραγματικότητα επιβράδυναν τα πράγματα, κάτι που βγάζει νόημα — περισσότερη speculation σημαίνει περισσότερη σπατάλη όταν οι προβλέψεις είναι λάθος.
llama.cpp vs. MLX: Ο Νικητής που Δεν Περίμενες
Αυτό που με εξέπληξε: περίμενα το MLX (Apple's native ML framework) να κυριαρχήσει αφού είναι ειδικά optimized για Apple Silicon. Η πραγματικότητα ήταν διαφορετική.
| Runtime | Generation tok/s | |---------|------------------| | llama.cpp Metal + MTP | 72.2 | | llama.cpp Metal | 58.2 | | MLX-LM (Unsloth 4-bit) | 45.8 | | MLX-LM (standard 4-bit) | 43.9 | | MLX-LM (OptiQ 4-bit) | 38.1 |
Το Llama.cpp με MTP ήταν περίπου 58% ταχύτερο από την καλύτερη MLX διαμόρφωση. Τα χρόνια optimization work που έχουν μπει στο llama.cpp έχουν αποδώσει — τρέχει εξαιρετικά σε macOS παρόλο που είναι cross-platform.
Προσθέτοντας Vision Capabilities
Για μια πλήρη coding agent εμπειρία, θες να μπορείς να στέλνεις screenshots. Μπορεί να θες ο agent να δει τι έφτιαξε, ή να κάνει review μια αλλαγή στο UI που μόλις έκανες.
Το catch? Μόνο το Gemma 4 12B είναι natively multimodal. Το 26B model που χρησιμοποιούμε χρειάζεται τον external multimodal projector φορτωμένο μαζί του.
Όταν πρόσθεσα το --mmproj projector στο llama.cpp, διαφήμισε σωστά τις multimodal δυνατότητες στο Pi, και τα image tool outputs άρχισαν να ρέουν σωστά. Πιο σημαντικό, αυτό δεν εισήγαγε αξιοσημείωτη επιβράδυνση — η generation speed έμεινε στα 72.2 tokens ανά δευτερόλεπτο.
Η Πραγματική Εμπειρία
Με αυτή τη ρύθμιση, κοιτάς περίπου 17GB μοντέλα (16GB για το κύριο model, συν το MTP head και τον projector). Για κάποιον με 64GB unified memory, είναι εντελώς διαχειρίσιμο.
Το Pi ως agent παρέχει ένα καθαρό terminal interface που συνδέεται με το OpenAI-compatible API που η server mode του llama.cpp εκθέτει. Αυτό σημαίνει ότι μπορείς να το χρησιμοποιήσεις με οποιοδήποτε εργαλείο που υποστηρίζει OpenAI API format, δίνοντάς σου ευελιξία χωρίς lock-in.
Το μεγαλύτερο όφελος; Όταν κόβεται το internet — και θα κοπεί, στη χειρότερη δυνατή στιγμή — συνεχίζεις να γράφεις κώδικα. Ο agent μπορεί να είναι ελαφρώς πιο αργός από cloud alternatives, αλλά είναι responsive αρκετά για να διατηρήσει το workflow σου.
Πώς να Ξεκινήσεις
Θα χρειαστεί να κάνεις build το llama.cpp με Metal support enabled. Το project έχει solid documentation για macOS builds, και μόλις compiled, η server mode σου δίνει αυτό το OpenAI-compatible endpoint.
Για models, τα Unsloth GGUF quantizations στο Hugging Face είναι well-optimized. Θες το Q4_K_XL quantization για το κύριο model και το matching Q8 MTP draft model.
Κάνε tune το --spec-draft-n-max value — ξεκίνα με 3 και δοκίμασε από 1 έως 6 για να βρεις τι λειτουργεί καλύτερα στο συγκεκριμένο hardware σου. Διαφορετικές Apple Silicon διαμορφώσεις μπορεί να έχουν διαφορετικά sweet spots.
Αξίζει τον Κόπο;
Αν γράφεις τακτικά κώδικα με AI assistants και έχεις το hardware (minimum 16GB, 32GB+ recommended), σίγουρα. Η ανεξαρτησία από τη σύνδεση internet μόνη της το αξίζει, και με το MTP να φέρνει τις generation speeds σε πραγματικά χρηστικό επίπεδο, η εμπειρία είναι εντυπωσιακά polished.
Δεν πρόκειται να φτάσεις την ευφυΐα τύπου GPT-4 με αυτά τα open models, αλλά για code completion, refactoring, debugging assistance, και γενικά coding agent tasks; Είναι πιο capable από ό,τι οι περισσότεροι περιμένουν, και είναι δικό σου — τρέχοντας τοπικά, privately, χωρίς latency spikes ή service outages.
Τα εργαλεία έχουν ωριμάσει σημαντικά. Αν έχεις δοκιμάσει τοπικά models στο παρελθόν και απογοητεύτηκες από την ταχύτητα, δοκίμασε αυτή τη ρύθμιση. Το MTP αλλάζει σημαντικά την εξίσωση.