Salta al contenuto

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.