Fonction torch.no_grad de PyTorch


Pytorch torch 参考手册Manuel de référence PyTorch torch

torch.no_gradest un gestionnaire de contexte dans PyTorch utilisé pour désactiver le calcul des gradients. Dansno_gradLes tenseurs créés à l'intérieur du bloc ne calculent pas de gradients, ce qui peut réduire considérablement la consommation de mémoire et améliorer la vitesse d'inférence.

Ceci est essentiel pendant les étapes d'inférence et d'évaluation du modèle, ce qui améliore grandement les performances et économise de la mémoire.

Définition de fonction

torch.no_grad()

Parameters:

  • Aucun paramètre. C'est un gestionnaire de contexte.

Valeur de retour:

  • Renvoie un gestionnaire de contexte qui désactive le calcul des gradients dans ce contexte.

Exemples d'utilisation

Exemple 1 : Utilisation de base

Exemple

import torch

# Créer un tenseur qui nécessite des gradients
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)

# Calculer à l'intérieur du contexte no_grad
with torch.no_grad():
    y = x * 2
    print("À l'intérieur de no_grad :", y.requires_grad)

# En dehors de no_grad
z = x * 2
print("En dehors de no_grad :", z.requires_grad)

La sortie est :

在 no_grad 中: False
在 no_grad 外: True

Exemple 2 : Inférence du modèle

Exemple

import torch
import torch.nn as nn

# Définir un modèle simple
model = nn.Linear(10, 2)

# Créer les données d'entrée
x = torch.randn(1, 10)

# Utiliser no_grad pendant l'inférence
with torch.no_grad():
    output = model(x)
    print("Sortie :", output)
    # Aucun calcul de gradient requis

# Ou utilisez le décorateur
# @torch.no_grad()
# def predict(x):
# return model(x)

La sortie est :

输出: tensor([[0.0920, 0.3557]])

Exemple 3 : Mode d'évaluation

Exemple

import torch
import torch.nn as nn

model = nn.Sequential(
    nn.Linear(10, 5),
    nn.ReLU(),
    nn.Linear(5, 2)
)

# Passer en mode d'évaluation
model.eval()

# Préparer les données de test
test_input = torch.randn(5, 10)

# Désactiver les gradients pendant l'évaluation
with torch.no_grad():
    predictions = model(test_input)
    print("Forme du résultat de prédiction :", predictions.shape)

La sortie est :

预测结果形状: torch.Size([5, 2])

Exemple 4 : Comparaison de l'utilisation de la mémoire

Exemple

import torch
import torch.nn as nn

model = nn.Linear(1000, 1000)

# Créer une grande quantité d'entrée
inputs = [torch.randn(100, 1000) for _ in range(100)]

# Sans no_grad (l'historique des gradients sera enregistré)
print("Sans no_grad:")
for inp in inputs[:5]:
    _ = model(inp)

# Utiliser no_grad (n'enregistre pas l'historique des gradients)
print("Avec no_grad:")
with torch.no_grad():
    for inp in inputs[:5]:
        _ = model(inp)

Utilisationno_gradpeut réduire considérablement la consommation de mémoire car il n'est pas nécessaire de stocker les informations de gradient pour les variables intermédiaires.


Fonctions associées

  • torch.enable_grad(): Active le calcul du gradient (par opposition àno_gradl'inverse).
  • torch.set_grad_enabled(grad): Active ou désactive le calcul du gradient en fonction des paramètres.
  • torch.inference_mode(): Un mode d'inférence plus strict qui désactive à la fois le calcul du gradient et autograd.

Notes

  • Lors de l'inférence et de l'évaluation du modèle, utilisez toujourstorch.no_grad()pour économiser la mémoire et améliorer la vitesse.
  • Sino_gradles variables créées à l'intérieur du bloc doivent être utilisées à l'extérieur du bloc, elles doivent être copiées manuellement à l'extérieur.
  • etmodel.eval()À utiliser en combinaison pour de meilleurs résultats.

Pytorch torch 参考手册Manuel de référence PyTorch torch

Autres extensions