Vai al contenuto
AI.info

Guide pratiche

Implementare l’inferenza ML in tempo reale

Come costruire sistemi di inferenza ML a bassa latenza che restituiscono previsioni in pochi millisecondi. Il testo tratta l’ottimizzazione dei modelli, le architetture di serving, la cache e l’ottimizzazione delle prestazioni.

Implementare l’inferenza ML in tempo reale

AI.info Team ·

Partire dal budget di latenza, non dal modello

L’inferenza ML in tempo reale è un problema di sistemi travestito da problema di modellazione. Prima di scegliere un framework, scomponete lo SLA in un budget per ogni passaggio compiuto dalla richiesta. Per l’attribuzione di un punteggio di rischio frode e casi d’uso analoghi nel percorso di autorizzazione, il budget di latenza end-to-end al p99 è in genere di 100-200 ms; i team esperti puntano a meno di 50 ms per la sola attribuzione del punteggio, lasciando margine per il transito in rete, l’arricchimento delle feature e la logica che determina le azioni successive.

I sistemi di raccomandazione e di definizione dei prezzi sono di solito più tolleranti (100-300 ms end-to-end), ma la disciplina nel definire il budget è identica: assegnate un numero di millisecondi alla rete, al recupero delle feature, al pre-processing, al passaggio in avanti del modello, al post-processing e alla serializzazione. Trattate ogni voce come un vincolo di progettazione, non come un dettaglio a cui pensare dopo.

Budget di latenza citati per il serving ML in tempo reale, per caso d’uso.

La criticità da prevenire è la latenza di coda, non quella media. Un modello che impiega in media 8 ms ma arriva a 400 ms sotto carico violerà continuamente gli SLA, perché una singola richiesta rivolta all’utente spesso si dirama in più chiamate al modello, ognuna delle quali può essere quella lenta. Ottimizzate e monitorate il p99 (e spesso il p99,9), non la media o il p50.

Aggiornamento delle feature: il feature store online

Nei modelli per il rilevamento delle frodi, le raccomandazioni e la definizione dei prezzi, gran parte delle informazioni utili proviene da feature calcolate altrove (aggregati, embedding, contatori) e associate al momento della richiesta, non soltanto dai dati grezzi della richiesta. Di conseguenza, il collo di bottiglia è spesso il feature store, non il modello. L’infrastruttura deve fornire le feature in pochi millisecondi per lasciare al modello una parte del budget; se il recupero delle feature consuma il budget, i team sono costretti a usare modelli più semplici, con un aumento diretto delle frodi non rilevate o un peggioramento delle raccomandazioni.

Feast è il principale feature store open source per questo schema. La sua architettura si divide nettamente in:

La scelta dello store conta più di quanto molti team si aspettino. I benchmark condotti da Feast hanno individuato in Redis, servito tramite il server Java gRPC, la combinazione di gran lunga più veloce; uno studio di ottimizzazione del giugno 2026, condotto su un pod Redis autonomo, ha misurato un p99 di 4,61 ms per il recupero di una singola riga tramite il feature server REST, con 718 richieste al secondo per pod, e di 1,70 ms con vettori di feature precalcolati. DynamoDB è una ragionevole alternativa gestita per chi vuole evitare di gestire Redis, ma è prevedibile che abbia una latenza di coda superiore. Anche AWS descrive ElastiCache per Redis come un’architettura di «feature store online a latenza bassissima» proprio per questo caso d’uso.

Store Metrica Valore
Redis (feature server REST di Feast, ottimizzato) p99, recupero di una singola riga 4,61 ms
Redis (feature server REST di Feast, un pod) Throughput 718 richieste/sec
Redis (vettori di feature precalcolati) p99, recupero di una singola riga 1,70 ms

Regole pratiche:

Framework per servire i modelli

Oggi tre strumenti coprono la maggior parte dei servizi self-hosted di inferenza in tempo reale: la scelta dipende dalla varietà dei framework, dall’hardware di destinazione e dalle dimensioni del team. Un quarto figurava un tempo in questo elenco, ma ne è uscito.

NVIDIA Triton Inference Server è la scelta predefinita quando serve usare le GPU in modo efficiente con più framework (ONNX, TensorRT, PyTorch, TensorFlow e persino backend Python personalizzati) dietro un unico server. Le sue due funzionalità principali per i carichi di lavoro in tempo reale sono:

Metrica (16 richieste concorrenti, A100) Prima Dopo
Latenza p99 34,2 ms 10,7 ms
Throughput 975 inferenze al secondo 3.188 inferenze al secondo

TorchServe non è più un’opzione. Lo strumento ufficiale di PyTorch per servire i modelli recava dal 2024 un avviso di manutenzione limitata e il repository pytorch/serve è stato archiviato il 7 agosto 2025: è di sola lettura, senza aggiornamenti, correzioni di bug, nuove funzionalità o patch di sicurezza in programma, e con un’avvertenza esplicita che le vulnerabilità potrebbero non essere risolte.

Le versioni esistenti si installano ancora e continuano a gestire il traffico. Per un team che oggi usa TorchServe, quindi, la domanda non è se funzioni, ma chi lo aggiornerà quando verrà individuata una CVE in una delle sue dipendenze. Va considerato un sistema da cui migrare entro una scadenza, non una scelta predefinita. Le alternative più comuni sono il backend PyTorch di Triton, per le flotte di GPU che già richiedono il supporto di più framework, e BentoML, per i team che vogliono una gestione operativa meno complessa rispetto a Triton.

BentoML punta alla rapidità di sviluppo ed è la destinazione più comune per i team che usano solo PyTorch e lasciano TorchServe: consente di impacchettare un modello insieme al codice di preprocessing in un «Bento», distribuirlo come container o su una piattaforma gestita e attivare e configurare il batching adattivo. Secondo benchmark pubblicati, BentoML sostiene oltre 1.000 richieste al secondo con una latenza p95 inferiore a 50 ms su un carico di lavoro della classe di ResNet50 con hardware di fascia contenuta: prestazioni sufficienti per la maggior parte dei servizi in tempo reale non basati su LLM e, per i piccoli team, un percorso verso la produzione molto più breve rispetto alla messa in funzione di Triton.

Ray Serve è lo strumento giusto quando il «modello» è in realtà una pipeline — trasformazione delle feature, retrieval, modello di ranking, post-elaborazione basata su regole di business — distribuita su più deployment che devono poter scalare in modo indipendente. I deployment di Ray Serve vengono eseguiti come attori Ray e il suo autoscaler regola il numero di repliche confrontando il numero medio di richieste in corso per replica con il valore configurato di target_ongoing_requests, entro i limiti fissati da min_replicas/max_replicas. Quando si compongono più modelli, ogni deployment della catena presenta in genere caratteristiche diverse di latenza e concorrenza: i parametri di autoscaling vanno quindi regolati per ciascun deployment, non a livello globale.

# Ray Serve: two-stage pipeline, each deployment autoscales independently
from ray import serve

@serve.deployment(
    autoscaling_config={
        "min_replicas": 2,
        "max_replicas": 20,
        "target_ongoing_requests": 4,
    }
)
class FeatureEnricher:
    async def __call__(self, request):
        ...  # feature-store lookups

@serve.deployment(
    autoscaling_config={"min_replicas": 4, "max_replicas": 50, "target_ongoing_requests": 2},
    ray_actor_options={"num_gpus": 0.25},
)
class Scorer:
    async def __call__(self, features):
        ...  # model.forward()

Compilazione e quantizzazione del modello

Prima di aumentare il numero di repliche, conviene ridurre il costo di ogni richiesta. Le leve sono due e di solito si usano insieme:

Esportazione in ONNX + ONNX Runtime separa il formato usato per servire il modello dal framework di addestramento e consente ottimizzazioni a livello di grafo (fusione degli operatori, constant folding) indipendenti dal backend hardware.

TensorRT (direttamente o come provider di esecuzione di ONNX Runtime) compila il grafo in un motore specifico per l’hardware. Gli incrementi di velocità riportati variano molto a seconda dell’architettura, ma sono sistematicamente elevati: per le CNN della classe di ResNet50, sono stati misurati motori TensorRT INT8 circa 3,7 volte più veloci rispetto a FP32, e la quantizzazione INT8 produce in genere incrementi tra 2 e 4 volte con una perdita minima di accuratezza, se calibrata correttamente. Per ottenere l’aumento di velocità dei Tensor Core serve hardware che supporti INT8 — tutti gli acceleratori NVIDIA per data center da Turing in poi, dal T4 a Hopper e Blackwell — e, prima del deployment, occorre una fase di calibrazione (si fanno passare dati rappresentativi nel modello FP32 per calcolare le scale di quantizzazione). Saltare la calibrazione e limitarsi a convertire i pesi peggiora l’accuratezza senza che il problema sia immediatamente evidente.

Con gli acceleratori attuali, il limite inferiore è sceso sotto INT8. I Tensor Core di quarta generazione di Hopper (H100, H200) hanno introdotto FP8; la quinta generazione di Blackwell (B200, B300) aggiunge FP4, che Hopper non supporta. Per l’hardware acquistato negli ultimi due anni, la domanda non è se quantizzare, ma per quale formato a meno di 8 bit effettuare la calibrazione. Il rigore richiesto per la calibrazione resta lo stesso.

La sequenza pratica è questa: prima esportare in ONNX e verificare su un insieme di dati tenuto da parte la parità numerica rispetto al modello nel framework di addestramento; poi quantizzare e verificare di nuovo la parità, prima di passare a TensorRT. A ogni passaggio l’accuratezza può peggiorare, e individuare la causa di un problema che combina esportazione e quantizzazione è molto più difficile che esaminare i due passaggi separatamente.

Cache, batching e riduzione del carico

Tre interventi poco costosi prima di ricorrere ad altro hardware:

Autoscaling e capacità per i picchi di traffico

Il traffico ML in tempo reale è per sua natura irregolare (vendite lampo, gruppi dediti alle frodi che testano carte a ondate, picchi di raccomandazioni legati a notizie dell’ultima ora), quindi l’autoscaling basato soltanto sull’utilizzo di CPU/GPU reagisce troppo tardi: l’utilizzo aumenta solo quando la coda si è già accumulata. È preferibile basare l’autoscaling su un indicatore anticipatore:

Sicurezza del rilascio: shadow e canary

Non indirizzare mai il 100% del traffico di produzione verso un modello appena distribuito. Due approcci complementari:

Monitorare ciò che conta davvero

Misura separatamente ogni passaggio, non solo la richiesta nel suo complesso:

Errori comuni da riconoscere

Esplora

Altri articoli