torch.no_grad() & torch.inference_mode() pentru Evaluare în PyTorch & Deep Learning Practic

Tensori, Hardware & Autograd Nivel: începător

Dezactivarea grafului Autograd în timpul inferenței și al evaluării pentru reducerea la jumătate a consumului de VRAM și accelerarea vitezei de răspuns.

Sintaxă & invocare Python
# Modul clasic (compatibilitate universală):
with torch.no_grad():
    iesiri = model(intrari)

# Modul modern ultra-rapid (PyTorch 1.9+):
with torch.inference_mode():
    iesiri = model(intrari)

Descriere & Utilizare

În timpul antrenării, PyTorch păstrează în memoria GPU toate activările intermediare ale fiecărui strat pentru a le putea folosi la calculul gradienților în timpul loss.backward(). Acest lucru dublează sau triplează consumul de memorie.

Însă în timpul inferenței (când un utilizator trimite o cerere către model într-un API sau când calculezi acuratețea pe setul de validare), nu ai nevoie de gradienți. Blocul de context with torch.no_grad(): instruiește PyTorch să nu construiască graful Autograd.

În versiunile moderne de PyTorch, a fost introdus with torch.inference_mode():: acesta oferă cele mai agresive optimizări C++, dezactivând complet mecanismele de urmărire a versiunilor tensorilor și fiind cu până la 10-15% mai rapid decât torch.no_grad().

Cum să o reții ușor

💡 Este ca diferența între a merge la cumpărături notând pe carnet fiecare preț și calculând fiecare cent (antrenare cu Autograd) și a merge pur și simplu la casă fără să iei notițe când ești doar în vizită (inference mode).

Opțiuni și parametri tehnici

  • torch.no_grad(): context manager sau decorator de funcție (@torch.no_grad()) care dezactivează calculul gradienților.
  • torch.inference_mode(): variantă optimizată de performanță maximă, recomandată pentru orice cod de producție de tip inferență.
  • model.eval(): comută straturile Dropout și BatchNorm în modul de testare (trebuie folosit ÎNTOTDEAUNA împreună cu torch.no_grad()!).

Exemple practice și cazuri de utilizare

  • Decorator de funcție pe endpoint-ul FastAPI: @torch.inference_mode()ndef prezice(text: str): ...
  • Salvare masivă de VRAM: un model care dă eroare de CUDA out of memory la evaluare va rula fără probleme în torch.inference_mode().
  • Conversie sigură la NumPy după inferență: probabilitati = torch.softmax(iesiri, dim=-1).cpu().numpy() (fără eroare de requires_grad).

Sfaturi de configurare & capcane

Nu confunda model.eval() cu torch.no_grad(): model.eval() doar schimbă comportamentul matematic al straturilor de Dropout și BatchNorm, dar nu dezactivează Autograd! Pentru inferență corectă, ai nevoie de ambele: model.eval() urmat de with torch.inference_mode():.

Comenzi și ghiduri înrudite