AI engineer: inferenza LLM su GPU consumer e datacenter, kernel CUDA, contributi open source.
Faccio inferenza di LLM: kernel CUDA e patch minime per far girare i modelli su GPU consumer e su una sola Blackwell, con ogni modifica verificata contro l'output di riferimento. Faccio anche ricerca applicata sul comportamento dei modelli open-weight. Tutto open source: due mie PR sono state integrate, una è aperta in llama.cpp e un mio fix è stato adottato in vLLM.
Un assistente locale che mette insieme un modello linguistico sulla scheda video, fonti aperte per capire cosa succede nel mondo e un'interfaccia che le tiene insieme. Interroga da solo le fonti quando la domanda lo richiede: notizie per soggetto e luogo, mercati, contratti militari, movimenti degli insider, mappe, archivio storico degli eventi. Lavora sul computer (file, terminale, browser, documenti) e ricorda: memorie, documenti indicizzati, procedure che impara e riusa.
Nessuna chiave API verso fornitori di AI e nessuna conversazione che esce dal computer. Pensato per macchine modeste: modello predefinito LFM2.5-2.6B con drafter speculativo DSpark su una GTX 1080 con 8 GB. Un controllo contro le invenzioni verifica che numeri e nomi della risposta compaiano nei risultati degli strumenti. Integra Odysseus (assistente) e ShadowBroker (fonti).1
1Il repository include come submodule due progetti di terzi, Odysseus (assistente) e ShadowBroker (intelligence da fonti aperte), con licenza AGPL-3.0: sono dipendenze, non lavoro originale.
Patch piccole inviate ai repository originali. Due sono integrate, una è aperta e un mio commit è stato adottato in una PR di vLLM.
leejet/stable-diffusion.cppintegrata il 24/10/2026
PR #2202: fix, ignora l'alpha dei metadati nei LoRA con baked_scale.
PrismML-Eng/llama.cppintegrata il 19/10/2026
PR #368: Pascal (sm_61), mat-vec PQ2_0 per 1-4 colonne, +17% su Ternary-Bonsai-2-9B con output identico bit per bit.
ggml-org/llama.cppaperta dal 25/08/2026
PR #27721: CUDA Graphs su Pascal (sm_61), +40% sui modelli MoE, +7% sui modelli densi, nessuna regressione.
vllm-project/vllmadottato, PR ancora aperta
PR #58863: il commit esatto del replay GDN di RecoverSSM, proposto da me e adottato nella PR (commit 514102a).
CUDA Graphs su sm_61 in llama.cpp, PR #27721 · tempo per token, relativo
+40%MoE
+7%denso
MoE
un lancio per kernel1×
CUDA graph0,71×
denso
un lancio per kernel1×
CUDA graph0,93×
Schema, non traccia di profilazione: stessi kernel, un solo lancio del grafo al posto di uno per kernel. Il tempo per token scende a 1/1,40 sui modelli MoE (+40% misurato) e a 1/1,07 sui densi (+7%).
02Implementazioni
Dalla GTX 1080 alla RTX PRO 6000
Kernel e configurazioni di inferenza per una GTX 1080 e per una RTX PRO 6000 Blackwell. Ogni modifica è confrontata con l'output di riferimento e ogni numero ha il suo benchmark riproducibile.
Qwen3.8 Flash-Next e il fine-tune Swift 1.5 in NVFP4 su una sola RTX PRO 6000 Blackwell con vLLM: 4 utenti con 227k token di contesto ciascuno, circa 100 tok/s per utente, picco di 186,5 tok/s con un utente solo. I kernel sono esatti, con output identico bit per bit al riferimento: top-k QSA deterministico e replay GDN esatto. Il top-k deterministico corregge anche un bug di determinismo che c'era già.
video e audio generativi su 8 GB · codice in uscita
GPU
GTX 1080, 8 GB
Stack
stable-diffusion.cpp · CUDA
Clip di prova
320x576, 39 fotogrammi
MiniMax-H3 è un transformer a diffusione che genera video con audio sincronizzato. Qui solo testo e numeri: nessun fotogramma generato. Sulla clip di prova da 39 fotogrammi il tempo scende da 674,5 a 175,5 s (−74%): pesi letti dal disco in sovrapposizione al calcolo, VAE a gruppi di tile, ricetta Q3 con turbo.
Il kernel di attention int8 con DP4A passa da 1875 a 944 ms (2,0x), senza differenze visibili da f32 su più seed.
L'attention sparsa a blocchi ha due misure distinte:
su una clip da 15 s, senza il prefisso: 1,65x sui passi turbo (da 397-404 a 240-245 s per passo);
il prefisso di condizionamento, sempre visibile, conserva il parlato. Misurato a parte su clip più corte (56 fotogrammi): errore sulle parole 0 a 544x960 e 0,2 a 384x672, contro 1,0 con la sola attention sparsa.
Il fix LoRA baked_scale è integrato (PR #2202 di stable-diffusion.cpp). Il resto del codice è in uscita.
MiniCPM5-2B su una GTX 1080 da 33 a 83 tok/s: slot cancellati a fine conversazione, kernel Pascal con output identico bit per bit, KV cache in f16 e un drafter FR-Spec con vocabolario da 32k. Ogni passo ha il suo controllo di qualità.
Ternary Bonsai 2 9B su GTX 1080: +51% in decode (da 55,9 a 84,4 tok/s) con output identico bit per bit. Cinque modifiche CUDA al fork llama.cpp di PrismML; la mat-vec PQ2_0 è già dentro il fork (PR #368).
LLM2Vec (Llama-3-8B) su una GPU da 8 GB via offload in RAM; batching senza alterare gli embedding: il padding li sposta (similarità coseno 0,76 contro il riferimento), il fix li riporta a 0,999956.
PythonPyTorchencoder testuale per Kimodo
Embedding di LLM2Vec calcolati in batch, distanza dal riferimento
≈ 5.500volte più vicino
padding · cos 0,761 − cos = 0,24
fix · cos 0,9999561 − cos = 4,4·10−5
110−110−210−310−410−5
1 − coseno, scala logaritmica
Distanza degli embedding di LLM2Vec calcolati in batch dal riferimento calcolato senza batch, su scala logaritmica di 1 − coseno: con il padding 1 − cos = 0,24 (coseno 0,76), con il fix 4,4·10−5 (coseno 0,999956), circa 5.500 volte più vicino.
Kimodo genera movimento umano da un testo, ma si aspetta un vettore di LLM2Vec su Llama-3-8B: 15 GB di pesi e 90-190 secondi a frase. Ho sostituito quel pezzo con LFM2.5-Embedding-350M e una mappa lineare da 1024 a 4096 dimensioni: 0,7 s a frase e 700 MB. In uscita file npz e bvh, da aprire in Blender o Unity.
Root cause analysis del decoder VAE tiled di Bonsai-Image 4B in WebGPU su GPU prive di shader-f16: patch da 1,4 KB che abilita 512px e oltre su Pascal e precedenti, senza perdita di qualità sui dispositivi f16.
Converto un LLM autoregressivo (Qwen3-0.6B) in un modello a diffusione discreta con la ricetta LLaDA 2.1, con un backend di training e inferenza eseguibile su Pascal.
PythonPyTorchdiffusion LM
03Ricerca
Replica del test Cohere su Qwen3.8
Cohere ha segnalato che Qwen3.8-Flash-Next, durante un compito da analista di sicurezza in un sandbox, ha provato a caricare un file su un bucket di storage Alibaba. Ho rifatto il test il 27 e 28 ottobre 2026 su due build servite nello stesso modo su una RTX PRO 6000: la base NVIDIA in NVFP4 e il fine-tune Swift 1.5.
Con il prefisso https://rout, host routify-file-proxy-sg completo
base247/256
Swift253/256
Comando scritto dal modello, host Alibaba, su 1024 prove
base0,7%
Swift0,3%
Sessioni da agente con strumenti simulati, compiti di coding
base0/18
Swift0/20
Sessioni da agente, crawl con pagine rotte: URL inventati
base2/5
Swift2/5
L'URL memorizzato è nella base NVIDIA e il fine-tune lo conserva. Compare quando un agente continua a incontrare pagine rotte; nei compiti di coding ordinari nessuna delle due build ha prodotto un indirizzo Alibaba o di metadati. Negare l'egress e bloccare *.aliyuncs.com e gli indirizzi di metadati nell'harness copre entrambe.
Teste MTP in BF16 e FP8 per il fine-tune Swift 1.5, più una versione GGUF per llama.cpp. Sono le teste che uso nel serving della sezione Implementazioni.
Plugin per Claude Code e Codex. Il principale, chatroom, mette più agenti in una stanza condivisa: chat dal vivo senza turni, bacheca dei compiti e un ufficio voxel 3D che mostra chi scrive codice, chi legge e chi aspetta. Sotto c'è un harness imposto dal codice: chiusura con prove, scadenza dei compiti, rilevatori di errori. La modalità ricerca aggiunge ruoli fissi, fasi con cancelli e un kernel che controlla ogni proposta.
Vergilius su GTX 1080, dentro un recinto: nessuna chiamata esce dalla macchina (127.0.0.1). A sinistra la velocità di decodifica, 64 tok/s e 78-100 tok/s con il drafter; a destra i turni con cifre non supportate dai risultati degli strumenti, da 3 su 35 a 1 su 36.
Applicazione Windows per trascrizione vocale locale basata su faster-whisper (CTranslate2, int8 su CUDA): registrazione, trascrizione e incolla nel campo attivo.
Python
05Progetti sperimentali
Language model su un connettoma reale
Quanto del contesto lo tiene l'attention e quanto un nucleo ricorrente? Banco di prova: il connettoma completo del sistema nervoso di Drosophila (male-cns:v1.0, 166.700 neuroni, 2,75 M sinapsi a soglia 10)2 come nucleo ricorrente LIF di un language model: segni sinaptici fissati dal neurotrasmettitore, magnitudini inizializzate dal conteggio di sinapsi, gradiente surrogato, CUDA Graph FP32. Protocollo con null model a gradi conservati, baseline a pari token e lesioni in silico.
2Connettoma male-cns:v1.0 (Janelia FlyEM · Google Research, licenza CC-BY): 25,6 M connessioni in totale, 2.753.975 sopra la soglia di 10 sinapsi.
porte d'ingresso (sensoriali)
neuroni, per salti dalle porte
lettura (discendenti)
Illustrazione generata in questa pagina dentro la sagoma del sistema nervoso centrale (cervello, lobi ottici, cordone ventrale): ogni punto vale circa 260 neuroni. I punti coralli, più grandi, sono le porte d'ingresso, sul bordo dei lobi ottici e sul dorso del cervello; da lì un'onda avanza un salto alla volta e la luce segue la distanza in salti. I quadratini sono il readout: nel connettoma vero sta a 2 salti dalle porte, per questo la profondità 4+4 basta.
Ingresso del testo tramite i 17.937 neuroni sensoriali reali, lettura dai 2.241 neuroni discendenti e motori, attention causale esterna (4 teste, cache 128) che rientra dalle stesse porte. Risultati riportati con i controlli: a pari dati il grafo rimescolato batte il cablaggio anatomico; il lobo ottico intero è rimovibile senza variazione di cross-entropy; la profondità 4+4 è sufficiente per raggiungibilità misurata (readout a 2 salti dalle porte).3
34+4 sottopassi per token, TBPTT 8, CUDA Graph FP32: 0,65 s per update su GTX 1080, 0,38 s con il kernel fuso; 5,46 M parametri.
Sistema decisionale per l'asta del fantacalcio: modello di prezzo con forchetta d'incertezza, ottimizzazione della rosa al tavolo sotto vincoli di budget e slot, valutazione su campionati simulati (75-91% vinti contro strategie di riferimento). Con arena interattiva per sfidarlo.4
4Il 75-91% viene dai campionati simulati del repository, contro strategie di riferimento: una misura del modello, non una promessa sul tavolo vero. Il tetto d'asta non supera mai il massimo spendibile, per vincolo della formula; ponte con FantaAsta Live, 43 assegnazioni su 44; 250 martelletti rigiocati contro il server, 0 errori, al massimo 354 ms.
Python; predizione · ottimizzazione · Monte Carlo
martelletti rigiocati contro il server · una cella ciascuno
250/250senza errori, in entrambi gli ordini dei ruoli
tempo di risposta a ogni martelletto, in millisecondi
ordine 1media 102,7 · p95 249,1 · max 354,3
ordine 2media 95,6 · p95 254,0 · max 348,6
0100200300400 ms
ponte FantaAsta Live · assegnazioni identiche
43/44
FantaOracle alla prova del proprio server. In alto 250 martelletti rigiocati, una cella ciascuno: 0 errori, in entrambi gli ordini dei ruoli. Al centro il tempo di risposta a ogni martelletto, con media, p95 e massimo. In basso il ponte con FantaAsta Live su un'asta di prova: 43 assegnazioni su 44 identiche. Dati dai report pubblici del repository.
Pipeline supervisionata e non supervisionata su fatture aperte: apprendimento dei pattern di pagamento e ranking del rischio per la gestione del credito.
Pythoncredit risk
05.2Ambienti RL
Game engine e ambienti per reinforcement learning
Ambienti simulati costruiti da zero come banco di prova per agenti.
Idle RPG nel browser con Phaser 3 e Three.js: loop di progressione, prestigio e rendering 3D.
JavaScriptThree.js
06Appendice · 21 voci · 7 aree
Indice dei repository
Repository pubblici raggruppati per area; ogni nome linkato porta al codice. Sotto lo stack, la quota del linguaggio principale nel codice del repository (GitHub, ottobre 2026).
I grafici sono disegnati in questa pagina con HTML, CSS e canvas, senza immagini. La scena 3D in testa, fatta con three.js, è un'illustrazione di token che attraversano le unità di calcolo di una GPU: non è una misura e non parte con la riduzione del movimento attiva. Anche la figura di FlyToLLM è un'illustrazione: i punti nascono da un seme fisso (166700, il numero di neuroni), quindi ogni lettore vede lo stesso disegno. Il grafico dei CUDA Graphs è uno schema; quelli su LLM2Vec, Vergilius e FantaOracle riportano numeri misurati. I numeri nei testi vengono dai repository e dalle pagine delle PR.
L'autore
Adrian Ciprian Iancu
AI engineer: inferenza LLM su GPU consumer e datacenter, kernel CUDA, contributi open source.
Inferenza LLMkernel CUDACUDA GraphsGPU Pascal (sm_61) e Blackwelldecoding speculativoquantizzazione (NVFP4, pesi ternari)llama.cppvLLMGGMLsicurezza dei modelli open-weightsistemi multi-agenteML applicato