Gestiunea Dispozitivelor: GPU (CUDA), Apple Silicon (MPS) & CPU în PyTorch & Deep Learning Practic

Tensori, Hardware & Autograd Nivel: începător

Detectarea automată a acceleratorului hardware disponibil și transferul curat al modelelor și tensorilor cu metoda .to(device).

Sintaxă & invocare Python
# Detectarea automată a celui mai rapid hardware:
def get_device():
    if torch.cuda.is_available():
        return torch.device("cuda")
    elif torch.backends.mps.is_available():
        return torch.device("mps")  # Apple Silicon M1-M4
    return torch.device("cpu")

device = get_device()
tensor = tensor.to(device)
model = model.to(device)

Descriere & Utilizare

Unul dintre cele mai frecvente mesaje de eroare pentru începătorii în PyTorch este „RuntimeError: Expected all tensors to be on the same device”. Aceasta apare atunci când încerci să înmulțești un tensor aflat în memoria RAM a procesorului (cpu) cu un model aflat în memoria VRAM a plăcii video (cuda:0).

Pentru un cod portabil care funcționează identic pe un laptop Mac (prin Metal Performance Shaders / MPS), pe o stație de lucru cu placă video NVIDIA (prin CUDA) sau pe un server cloud fără GPU (pe CPU), se folosește un obiect torch.device dinamic.

Metoda .to(device) mută datele în memoria acceleratorului dorit. La modelele neuronale (nn.Module), model.to(device) mută toate greutățile și straturile interne in-place.

Cum să o reții ușor

💡 CPU-ul este biroul tău obișnuit cu un singur funcționar foarte deștept, iar GPU-ul este o hală cu 4.000 de muncitori specializați. Pentru ca muncitorii să lucreze, trebuie să le trimiți piesele în hală cu un camion (.to(device)).

Opțiuni și parametri tehnici

  • torch.cuda.is_available(): verifică dacă driverul NVIDIA și suportul CUDA sunt active.
  • torch.backends.mps.is_available(): verifică disponibilitatea GPU-ului integrat Apple Silicon (M1/M2/M3/M4 pe macOS 12.3+).
  • non_blocking=True: parametru în tensor.to(device, non_blocking=True) care permite transferul asincron prin DMA (Direct Memory Access) în paralel cu execuția CPU dacă folosești pin_memory=True în DataLoader.

Exemple practice și cazuri de utilizare

  • Aflarea numelui plăcii grafice active: print(torch.cuda.get_device_name(0)) (ex: „NVIDIA GeForce RTX 4090”).
  • Selectarea unui GPU specific într-un server multi-GPU: device = torch.device("cuda:1").
  • Sincronizarea explicită la măsurători de timp: torch.cuda.synchronize() înainte de a calcula durata unei rulări.

Sfaturi de configurare & capcane

Reține diferența: model = model.to(device) modifică modelul in-place (nu necesită neapărat reatribuire), dar la tensori trebuie obligatoriu reatribuit (x = x.to(device)), altfel tensorul rămâne pe dispozitivul vechi!

Comenzi și ghiduri înrudite