GPU (Graphics Processing Unit)
Una GPU è un processore con migliaia di core progettato per i calcoli paralleli, che la rende l'hardware principale per addestrare ed eseguire modelli di deep learning.
Un'unità di elaborazione grafica (GPU) è un processore con migliaia di core semplici, capaci di eseguire contemporaneamente la stessa operazione su molti dati. Le GPU sono state progettate per renderizzare grafica 3D, un'attività che comporta il calcolo parallelo di milioni di pixel e vertici, e sono diventate l'hardware principale del deep learning perché l'addestramento e l'inferenza delle reti neurali si basano soprattutto su moltiplicazioni di matrici, parallelizzabili allo stesso modo. La piattaforma CUDA di NVIDIA, rilasciata nel 2007, ha reso le sue GPU programmabili per il calcolo generico e nel 2012 la rete AlexNet, addestrata per cinque o sei giorni su due GPU NVIDIA GTX 580, ha vinto la sfida ImageNet con un errore top-5 del 15.3%, contro il 26.2% del secondo classificato. Oggi PyTorch, TensorFlow e JAX funzionano sulle GPU NVIDIA tramite CUDA, sulle GPU AMD tramite ROCm e sui chip Apple tramite Metal; cluster composti da migliaia di GPU addestrano i più grandi modelli di base.
Come le GPU accelerano il deep learning#
Una CPU dedica gran parte della superficie del chip a cache e logica di controllo, così che pochi core possano eseguire rapidamente codice con diramazioni. Una GPU usa quella superficie per l'aritmetica: una GPU NVIDIA è suddivisa in multiprocessori streaming, ognuno dei quali esegue gruppi di 32 thread, chiamati warp, che svolgono la stessa istruzione su dati diversi. Mentre alcuni warp attendono i dati dalla memoria, altri eseguono calcoli, così il chip resta occupato finché c'è abbastanza lavoro parallelo. Dalla generazione Volta del 2017, le GPU NVIDIA includono anche i Tensor Core, unità che moltiplicano piccole matrici in un unico passaggio a precisione ridotta, ora anche in FP8 e, da Blackwell, in FP4. Una NVIDIA A100 raggiunge un picco di 19.5 TFLOPS nei calcoli standard FP32 e 312 TFLOPS in BF16 sui Tensor Core: per questo la maggior parte dell'addestramento su GPU usa la precisione mista. Questo codice misura il tempo della stessa moltiplicazione di matrici su CPU e GPU:
import time
import torch
gpu = torch.accelerator.current_accelerator() # cuda, mps, or xpu device on this machine
a = torch.randn(4096, 4096)
b = torch.randn(4096, 4096)
for device in (torch.device("cpu"), gpu):
x, y = a.to(device), b.to(device)
x @ y # warm-up run
torch.accelerator.synchronize()
start = time.perf_counter()
for _ in range(10):
x @ y
torch.accelerator.synchronize() # GPU calls return immediately, so wait for them to finish
seconds = (time.perf_counter() - start) / 10
print(f"{device.type}: {seconds * 1000:.1f} ms per multiply, {2 * 4096**3 / seconds / 1e12:.1f} TFLOPS")Su un portatile Apple M5 Pro stampa cpu: 80.0 ms per multiply, 1.7 TFLOPS e mps: 18.3 ms per multiply, 7.5 TFLOPS, quindi la GPU integrata del portatile è circa 4.4 volte più veloce in FP32. Le GPU dei data center ampliano ulteriormente il divario, grazie sia a un maggior numero di core sia alla memoria ad ampia larghezza di banda (HBM), che fornisce diversi terabyte al secondo e mantiene i core riforniti di pesi e attivazioni. La memoria GPU, spesso chiamata VRAM, determina anche le dimensioni del modello e del batch size che possono entrare in un singolo dispositivo; tecniche come il gradient checkpointing e l'addestramento distribuito servono a superare questo limite.
Addestrare e distribuire modelli sulle GPU#
Un processo di addestramento mantiene la GPU occupata solo se il resto della pipeline riesce a stare al passo: i worker CPU devono decodificare e aumentare le immagini abbastanza rapidamente, i batch devono essere sufficientemente grandi da saturare i core e i calcoli dovrebbero usare precisione ridotta sui Tensor Core. Un utilizzo basso della GPU indica solitamente uno di questi problemi:
Ultralytics YOLO si addestra per impostazione predefinita sulla prima GPU CUDA disponibile, accetta device=[0, 1] per l'addestramento multi-GPU e con batch=-1 esegue AutoBatch, che misura la memoria libera della GPU e sceglie una dimensione del batch che ne utilizza circa il 60%. I team che non dispongono di hardware locale possono scegliere una GPU cloud su Ultralytics Platform per ogni esecuzione di addestramento. Per l'inferenza, un modello YOLO26n esportato in TensorRT elabora un'immagine da 640 pixel in 1,7 ms su una GPU NVIDIA T4, rispetto ai 38,9 ms con ONNX su CPU. Questo codice addestra YOLO26 sulla prima GPU con AutoBatch:
from ultralytics import YOLO
# Carica il modello YOLO26 di rilevamento più piccolo
model = YOLO("yolo26n.pt")
# Addestra sulla GPU 0 e lascia che AutoBatch scelga la dimensione del batch in base alla memoria della GPU
results = model.train(data="coco8.yaml", epochs=3, imgsz=640, device=0, batch=-1)GPU, CPU, TPU e NPU a confronto#
- CPU: pochi core potenti per codice generico con diramazioni. Nella maggior parte delle pipeline di addestramento, le CPU gestiscono il caricamento e la pre-elaborazione dei dati, oltre all'inferenza quando non è disponibile un acceleratore.
- GPU: migliaia di core programmabili e Tensor Core. Le GPU eseguono quasi tutti i modelli e framework, sono prodotte da diversi fornitori e sono disponibili su tutti i principali cloud.
- TPU: chip di Google specifico per le applicazioni, progettato attorno a grandi unità di moltiplicazione di matrici. Le TPU sacrificano la flessibilità delle GPU in cambio di efficienza nei carichi di lavoro con grandi matrici dense e sono disponibili tramite Google Cloud.
- NPU: acceleratore di reti neurali a basso consumo presente in telefoni, portatili e dispositivi edge, usato per l'inferenza anziché per l'addestramento.
Applicazioni nel mondo reale#
- Addestramento di modelli di grandi dimensioni: i modelli linguistici e di visione con miliardi di parametri vengono addestrati su cluster di migliaia di GPU per data center, connesse tramite collegamenti ad alta velocità come NVLink e InfiniBand.
- Analisi video in tempo reale: una singola GPU può eseguire contemporaneamente il rilevamento e il tracking degli oggetti su molti flussi delle telecamere, per il monitoraggio del traffico, l'analisi del commercio al dettaglio o l'ispezione in fabbrica.
- Robotica e veicoli autonomi: moduli GPU integrati come NVIDIA Jetson eseguono modelli di percezione a bordo, dove inviare i dati delle telecamere a un server comporterebbe un ritardo eccessivo.
- Imaging medico: le GPU elaborano grandi volumi 3D di TC e MRI e segmentano organi e tumori in pochi secondi anziché in minuti.










