Optimisation MLX sur Apple Silicon
Quel modèle tuer pour charger le suivant ?
Le problème réel
MLX rend l'inférence locale rapide sur Apple Silicon. Il ne résout pas la question d'orchestration : plusieurs applications veulent plusieurs modèles, la machine n'en tient que deux ou trois.
Sans plan de contrôle, chaque application charge ses propres poids. Neuf applications, neuf copies : environ 208 Go de poids redondants pour une machine qui en a 128.
Comment je le résous
Un gateway compatible OpenAI qui possède les modèles, avec :
- Éviction LRU sous budget, un modèle épinglable, comptabilité honnête de la mémoire en vol
- Ordonnanceur hexagonal : la logique de décision est pure et testable, les effets de bord (processus, sockets) sont à la frontière
- Nettoyage garanti des requêtes en vol par
BackgroundTask— zéro fuite de réservation quand un client se déconnecte - Sortie structurée par décodage contraint quand le schéma le permet
Un piège appris sur le terrain
Le contre-exemple le plus utile que j'aie mesuré : forcer un décodage contraint sur une génération de paroles l'a cassée.
| Tokens | Durée | Résultat | |
|---|---|---|---|
| Sous contrainte | 8 192 | 140 s | JSON tronqué |
| Sans contrainte | 708 | 13,8 s | JSON valide |
Cause : le schéma n'était borné nulle part — objets et listes ouverts. Sous contrainte dure, le modèle n'a aucune raison de s'arrêter et boucle jusqu'au plafond de tokens.
Règle retenue et verrouillée par un test : le décodage contraint ne compense pas un schéma non borné. Il l'amplifie.
Piège voisin, sur un autre projet : xgrammar impose l'ordre alphabétique des clés. Un prompt rédigé dans l'ordre logique produit silencieusement un résultat désaligné du schéma.
Ce que ça donne, mesuré
- ~208 Go de poids redondants supprimés par la mutualisation
- 37 Go rendus en décommissionnant un modèle résident que rien ne consommait
- Latences annoncées à froid comme à chaud : 5–7 s à chaud, ~2 min au premier appel après éviction — c'est la seconde qu'il faut dimensionner
- 295 tests sur l'ordonnanceur seul
Où c'est en production
- Klody Core — Plan de contrôle
- local-suno — Génération musicale
- KlodMetrics — Text-to-SQL & couche sémantique
Vos données ne peuvent pas sortir ?
C'est exactement le problème que je résous. Un appel de 30 minutes suffit à cadrer un audit.