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.

TokensDuréeRésultat
Sous contrainte8 192140 sJSON tronqué
Sans contrainte70813,8 sJSON 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

Cette compétence intervient dans

BuildRetainer

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.