Fonction torch.no_grad de PyTorch
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)
# 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)
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)
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)
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 toujours
torch.no_grad()pour économiser la mémoire et améliorer la vitesse. - Si
no_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. - et
model.eval()À utiliser en combinaison pour de meilleurs résultats.
Autres extensions