Prodotto
Cose che è costato un giorno scoprire
Resoconti di difetti che non si annunciano: un caricamento che va in segfault invece di fallire, un valore predefinito invertito fra due file, e un confine dove un tipo sbagliato compila da entrambe le parti.
Aggiornato 2026-09-12
Costruire un motore di inferenza significa leggere molto codice che funziona e capire perché, e ogni tanto capirlo nel modo peggiore. Questi sono i resoconti del secondo tipo.
Hanno una cosa in comune, ed è anche il motivo per cui vale la pena scriverli: nessuno di loro ha prodotto un messaggio d'errore. Un difetto che fa crashare si corregge in un'ora. Un difetto che restituisce uscite plausibili viene spedito, e trovato settimane dopo da qualcuno che aveva dato per scontato che il modello fosse semplicemente mediocre.
Le note qui sotto parlano di MLX, dei file di configurazione che i modelli pubblicano, e del confine fra due linguaggi. Nessuna è specifica di Runlix: se stai scrivendo qualcosa che carica pesi MLX, o che chiama Rust dal C#, le incontrerai.
Perché queste e non le altre
Le note interne del motore sono un paio di dozzine, e non tutte stanno bene su una pagina pubblica. Decidono due regole.
Si pubblica ciò che appartiene alla libreria di qualcun altro. Come si comporta MLX, cosa dà
per scontato mlx-lm, cosa può contenere il config.json di un modello. Quel sapere non è nostro
da tenere: è il costo di aver letto una libreria con attenzione, e chi sbatte sullo stesso muro lo
sta cercando adesso.
Si tiene ciò che è nostro. Il disegno della cache paginata, come il campionamento materializza i candidati, la decisione di affettare prima della proiezione finale. Quelle cose sono costate misure per arrivarci, e sono il vantaggio del motore, non un fatto generale su MLX.
La linea non è segretezza fine a sé stessa. È che la prima categoria è sapere di cui hanno bisogno gli utenti di qualcun altro, e la seconda è lavoro.
Per chi sono
Tre tipi di lettore, e le note sono scritte in modo che il primo paragrafo ti dica quale sei.
Se stai portando l'architettura di un modello — da mlx-lm, o da una qualunque
implementazione di riferimento verso un qualunque linguaggio — due di queste parlano direttamente
delle trappole in cui sbatterai, e la terza parla del confine che costruirai per chiamare il tuo
lavoro da un'applicazione.
Se stai usando MLX dal C o dal Rust invece che dal Python, la nota sul caricamento ti risparmia una giornata, e quella sul confine C parla di una classe di difetti che peggiora quanto più a lungo vai avanti senza cercarla.
Se non stai facendo né l'una né l'altra cosa, una vale comunque la pena: l'argomento per cui un difetto che restituisce un valore plausibile costa più di uno che fa crashare non è specifico dei motori di inferenza, e non lo è nemmeno ciò che ne consegue.
Cosa non sono
Non sono tutorial. Qui non c'è materiale per cominciare, e nessuna spiega cos'è un transformer o come si installa qualcosa — quel materiale esiste, è scritto bene altrove, e ripeterlo aggiungerebbe pagine di cui non ha bisogno nessuno.
E non sono note di rilascio. Niente qui annuncia una funzione. Ognuna è un difetto che è costato abbastanza da trovare che scriverlo è sembrato più economico che lasciare alla prossima persona la stessa giornata.
Con che frequenza compaiono
Lentamente, ed è deliberato più che una scarsità di materiale.
Una nota esce quando il difetto è capito abbastanza bene da poter essere detto in una frase, e non prima. Metà del valore di scriverne una è la costrizione: se il resoconto ha bisogno di tre paragrafi di cautele per descrivere cosa è andato storto, l'indagine non era finita, e la risposta giusta è tornare a finirla invece di pubblicare le cautele.
Il che significa che non c'è un calendario. Se vuoi sapere quando ne compare una, l'iscrizione ha una categoria esattamente per questo e per nient'altro.
Una nota su come sono verificate
Ogni affermazione in queste note ha dietro un numero o una riproduzione, e dove compare un numero porta la data in cui è stato misurato.
È un'abitudine che questo progetto ha imparato pagando. Tre cifre scritte a mano in un documento interno, rimisurate, si sono rivelate 33 invece di 32, 26 invece di 24, e 1294 invece di 605 — l'ultima sbagliata di più del doppio. Un numero in prosa non ha nessuno che lo mantenga. Quindi i numeri qui hanno una data, e se uno di loro si è allontanato dal vero, la data è l'avviso.
Il confine dove compilano entrambe le parti e una delle due mente
Attraverso un ABI C, una funzione col nome storpiato non è un errore di compilazione e una col tipo sbagliato non la vede nemmeno nm. Una dichiarazione a 32 bit su un valore a 64 ha trasformato 23347 MB in 2,8 GB — plausibile, e sbagliato di otto volte.
Misurato 2026-09-11Il caricamento che va in segfault invece di fallire
Caricare pesi MLX sullo stream GPU non solleva un errore. Restituisce un codice diverso da zero che probabilmente non hai controllato, e poi leggere i dati fa morire il processo. Ecco perché, e cosa farci.
Misurato 2026-09-06Un valore predefinito invertito fra due file
Quando la configurazione di un modello non nomina tie_word_embeddings, phi3 assume falso e llama assume vero. Copiane uno e avrai un modello giusto su una famiglia e silenziosamente sbagliato sull'altra.
Misurato 2026-09-06