Come scrivere un modello AI transformer su PDP-11 in assembly

transformer

L’idea di addestrare un modello di machine learning su hardware degli anni ’70 può sembrare, a prima vista, un esercizio puramente accademico o nostalgico. Tuttavia, il progetto ATTN/11 dimostra qualcosa di più interessante: i principi alla base dei moderni modelli di intelligenza artificiale non sono legati a infrastrutture cloud o GPU avanzate, ma a concetti matematici e computazionali ben definiti, implementabili anche su sistemi estremamente limitati. Vediamo oggi come è stato implementato un transformer su un PDP-11.

ATTN/11 nasce come evoluzione naturale di Xortran, una rete neurale capace di apprendere la funzione XOR su macchine come IBM 1130 e PDP-11. Il passo successivo è stato verificare se fosse possibile addestrare un piccolo transformer su queste architetture, mantenendo tempi accettabili.

Architettura: un transformer essenziale

Uno degli aspetti più interessanti del progetto è la semplicità architetturale. Un transformer, spesso percepito come un sistema complesso e opaco, è in realtà un’estensione relativamente modesta di una rete neurale classica.

Gli elementi fondamentali sono già noti:

  • moltiplicazioni tra matrici
  • backpropagation
  • discesa del gradiente (SGD)
  • funzione di perdita cross-entropy

A questi si aggiungono tre componenti chiave:

  • self-attention
  • positional encoding
  • softmax

Nel caso di ATTN/11, il modello è ridotto all’essenziale: un singolo layer, una sola testa di attenzione, dimensione del modello pari a 16, sequenze di lunghezza 8 e un vocabolario di 10 simboli (le cifre da 0 a 9). In totale, appena 1.216 parametri.

Il flusso dei dati segue una pipeline lineare:

Token → Embedding → Self-Attention → Residual → Projection → Softmax

Non sono presenti layer normalization, feed-forward network o decoder. Per il problema scelto, questi elementi non sono necessari.

Il problema: invertire una sequenza

Il task su cui viene addestrato il modello è apparentemente banale: invertire una sequenza di cifre.

In realtà, si tratta di un problema non banale per una rete neurale. Il modello deve apprendere una trasformazione che dipende esclusivamente dalla posizione degli elementi, senza poter sfruttare scorciatoie basate sul contenuto. È proprio questo tipo di dipendenza che rende la self-attention particolarmente adatta.

Questo problema è infatti utilizzato anche come benchmark algoritmico in Tensor2Tensor, l’implementazione di riferimento del transformer proposta da Google nel 2017.

Ottimizzazione per hardware degli anni ’70

Una prima implementazione in Fortran IV mostrava limiti evidenti: circa 6,5 ore di addestramento su hardware reale. Un tempo eccessivo per macchine time-shared.

Il passaggio all’assembly e alcune ottimizzazioni mirate hanno ridotto drasticamente i tempi. Una scelta significativa è stata l’introduzione di learning rate differenziati per layer:

  • pesi dell’attenzione con learning rate più alto
  • embedding con valore intermedio
  • proiezione finale con valore più basso

Questa strategia consente una convergenza più rapida senza introdurre overhead computazionale. L’uso di un ottimizzatore più sofisticato come Adam sarebbe stato proibitivo: maggiore memoria richiesta e operazioni (divisioni e radici quadrate) troppo costose per il PDP-11.

Il risultato finale è notevole: convergenza in circa 350 step, con un tempo totale di addestramento di circa 5,5 minuti su un PDP-11/34A.

Aritmetica a punto fisso e NN11

In assenza di unità in virgola mobile, il progetto utilizza aritmetica a punto fisso, con formati diversi per forward e backward pass:

  • Q8 per il forward
  • Q15 per il backward
  • Q16 per gli accumulatori dei pesi

Questa scelta non è casuale: è ottimizzata per il set di istruzioni del PDP-11. Ad esempio, il prodotto tra un valore Q8 e uno Q15 produce un risultato direttamente gestibile con uno shift efficiente.

Il tutto è supportato da NN11, uno stack minimale organizzato a livelli:

  • operazioni scalari
  • operazioni vettoriali
  • operazioni matrice-vettore
  • funzioni di attivazione
  • layer completi (embedding, attenzione, proiezione)

L’approccio ricorda librerie moderne come BLAS, ma adattato a un contesto estremamente vincolato.

Lookup table al posto delle funzioni matematiche

Operazioni come exp e log sono troppo costose senza FPU. La soluzione adottata è l’uso di lookup table precomputate.

La softmax, ad esempio, utilizza una tabella da 256 valori per approssimare l’esponenziale. Allo stesso modo, la cross-entropy sfrutta una tabella per il logaritmo.

Questo approccio riduce drasticamente il costo computazionale: una lettura in memoria sostituisce operazioni matematiche complesse.

Un’ulteriore ottimizzazione deriva dalla proprietà nota della combinazione softmax–cross-entropy, che semplifica il calcolo del gradiente evitando del tutto il logaritmo durante il training.

Gestione della memoria

Il sistema utilizza circa 19,2 KB su un totale di 32 KB disponibili. I parametri del modello sono replicati in tre formati distinti (Q8, Q15, Q16), occupando la maggior parte della memoria.

Nonostante questi vincoli, il modello riesce a essere completamente funzionale e addestrabile.

Prototipazione e verifica

Prima dell’implementazione in assembly, il modello è stato prototipato e validato in Sheaf, un framework funzionale per machine learning con strumenti avanzati di tracciamento e verifica.

Questo passaggio è cruciale: lavorare direttamente in assembly senza una validazione preliminare sarebbe estremamente rischioso, soprattutto con aritmetica a punto fisso.

Una riflessione: l’AI non è una “black box”

Progetti come ATTN/11 aiutano a ridimensionare una narrativa molto diffusa: quella secondo cui l’intelligenza artificiale sarebbe una sorta di “scatola nera” incomprensibile.

È vero che sistemi come ChatGPT, Claude o Gemini sono estremamente complessi e addestrati su scala enorme, con miliardi o trilioni di parametri. Ed è altrettanto vero che replicare questi modelli da zero non è un compito alla portata del singolo sviluppatore.

Tuttavia, i principi alla base sono ben noti: layer, embedding, matrici di attenzione, moltiplicazioni tra matrici, ottimizzazione numerica e statistica. I transformer non sono magia, ma ingegneria.

ATTN/11 lo dimostra chiaramente: riducendo il problema alla sua essenza, è possibile implementare e comprendere un transformer anche su hardware estremamente limitato. Con studio e pratica, è possibile costruire versioni semplificate di questi modelli, e sono disponibili numerosi tutorial che guidano passo passo in questo percorso.

Conclusione

ATTN/11 non è solo un esercizio di retrocomputing, ma una dimostrazione concreta della natura dei modelli di deep learning. Riducendo un transformer ai suoi componenti fondamentali e implementandolo in assembly su un PDP-11, il progetto mostra che l’intelligenza artificiale moderna è costruita su basi solide, comprensibili e accessibili.

In un’epoca in cui l’AI è spesso percepita come qualcosa di distante e opaco, esperimenti come questo riportano l’attenzione sull’essenziale: algoritmi, matematica e ingegneria.

Per approfondire il progetto è possibile consultare il repository ufficiale su GitHub:
https://github.com/dbrll/ATTN-11

Iscriviti ai nostri gruppi Telegram

Link utili

Seguici per non perdere le prossime novità!

Simone Candido è un ragazzo appassionato del mondo tech nella sua totalità. Simone ama immedesimarsi in nuove esperienze, la sua filosofia si basa sulla irrefrenabile voglia di ampliare a 360° le sue conoscenze abbracciando tutti i campi del sapere, in quanto ritiene che il sapere umano sia il connubio perfetto tra cultura umanistica e scientifica.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.