Fonction torch.inference_mode de PyTorch
Manuel de référence Pytorch torch
torch.inference_modeest un gestionnaire de contexte dans PyTorch utilisé pour le mode inférence. Il est plustorch.no_gradstrict, non seulement en désactivant le calcul du gradient, mais aussi en désactivant toutes les fonctions de suivi du moteur autograd.
Ceci est, lors de l’inférence du modèle, plusno_gradefficace, et peut en outre réduire l’utilisation de la mémoire et améliorer la vitesse d’inférence.
Définition de fonction
torch.inference_mode(mode=True)
Parameters:
mode(bool, facultatif) : SiTrue(valeur par défaut), active le mode d’inférence ; siFalse, quitte le mode d’inférence. Valeur par défaut :True。
Valeur de retour:
- Renvoie un gestionnaire de contexte dans lequel les gradients et autograd sont désactivés.
Exemples d'utilisation
Exemple 1 : Utilisation de base
Exemple
import torch
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# Dans le contexte inference_mode
with torch.inference_mode():
y = x * 2
print("In inference_mode:", y.requires_grad)
# Dans le contexte no_grad
with torch.no_grad():
z = x * 2
print("In no_grad:", z.requires_grad)
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# Dans le contexte inference_mode
with torch.inference_mode():
y = x * 2
print("In inference_mode:", y.requires_grad)
# Dans le contexte no_grad
with torch.no_grad():
z = x * 2
print("In no_grad:", z.requires_grad)
La sortie est :
在 inference_mode 中: False 在 no_grad 中: False
Exemple 2 : Comparaison de no_grad et inference_mode
Exemple
import torch
# Créer un tenseur
x = torch.randn(100, 100)
# Dans inference_mode
with torch.inference_mode():
# Beaucoup de calculs effectués
for _ in range(10):
x = torch.mm(x, x)
# Même après que le calcul est terminé, les tenseurs dans le contexte ne peuvent pas être utilisés pour la rétropropagation
result = x.sum()
# Vérifier s'il peut être converti en un tenseur qui nécessite des gradients
print("En inference_mode :", result.is_leaf)
# Effectuer le même calcul dans no_grad
x2 = torch.randn(100, 100)
with torch.no_grad():
for _ in range(10):
x2 = torch.mm(x2, x2)
result2 = x2.sum()
print("En no_grad :", result2.is_leaf)
# Créer un tenseur
x = torch.randn(100, 100)
# Dans inference_mode
with torch.inference_mode():
# Beaucoup de calculs effectués
for _ in range(10):
x = torch.mm(x, x)
# Même après que le calcul est terminé, les tenseurs dans le contexte ne peuvent pas être utilisés pour la rétropropagation
result = x.sum()
# Vérifier s'il peut être converti en un tenseur qui nécessite des gradients
print("En inference_mode :", result.is_leaf)
# Effectuer le même calcul dans no_grad
x2 = torch.randn(100, 100)
with torch.no_grad():
for _ in range(10):
x2 = torch.mm(x2, x2)
result2 = x2.sum()
print("En no_grad :", result2.is_leaf)
La sortie est :
在 inference_mode 中: False 在 no_grad 中: True
Exemple 3 : Inférence de modèle
Exemple
import torch
import torch.nn as nn
# Définir un modèle simple
model = nn.Sequential(
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 5)
)
model.eval()
# Créer les données d'entrée
x = torch.randn(100, 10)
# Utiliser inference_mode pour l'inférence
with torch.inference_mode():
output = model(x)
print("Forme de sortie :", output.shape)
print("requires_grad de la sortie :", output.requires_grad)
# On peut aussi utiliser le décorateur
@torch.inference_mode()
def predict(x):
return model(x)
result = predict(x)
print("Méthode décorateur - Forme de sortie :", result.shape)
import torch.nn as nn
# Définir un modèle simple
model = nn.Sequential(
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 5)
)
model.eval()
# Créer les données d'entrée
x = torch.randn(100, 10)
# Utiliser inference_mode pour l'inférence
with torch.inference_mode():
output = model(x)
print("Forme de sortie :", output.shape)
print("requires_grad de la sortie :", output.requires_grad)
# On peut aussi utiliser le décorateur
@torch.inference_mode()
def predict(x):
return model(x)
result = predict(x)
print("Méthode décorateur - Forme de sortie :", result.shape)
La sortie est :
输出形状: torch.Size([100, 5]) 输出 requires_grad: False 装饰器方式 - 输出形状: torch.Size([100, 5])
Exemple 4 : Comparaison de l'optimisation de la mémoire
Exemple
import torch
import torch.nn as nn
model = nn.Sequential(
nn.Linear(1000, 1000),
nn.ReLU(),
nn.Linear(1000, 1000),
nn.ReLU(),
nn.Linear(1000, 10)
)
# Test de l'utilisation de la mémoire des différents modes
x = torch.randn(50, 1000)
print("Sans aucun gestionnaire de contexte :")
_ = model(x)
print("\nUtilisation de no_grad :")
with torch.no_grad():
_ = model(x)
print("\nUtilisation de inference_mode :")
with torch.inference_mode():
_ = model(x)
import torch.nn as nn
model = nn.Sequential(
nn.Linear(1000, 1000),
nn.ReLU(),
nn.Linear(1000, 1000),
nn.ReLU(),
nn.Linear(1000, 10)
)
# Test de l'utilisation de la mémoire des différents modes
x = torch.randn(50, 1000)
print("Sans aucun gestionnaire de contexte :")
_ = model(x)
print("\nUtilisation de no_grad :")
with torch.no_grad():
_ = model(x)
print("\nUtilisation de inference_mode :")
with torch.inference_mode():
_ = model(x)
Utilisationinference_modepeut optimiser davantage la mémoire car il désactive complètement le moteur autograd.
Fonctions associées
torch.no_grad(): Désactive le calcul du gradient mais conserve certaines fonctionnalités d'autograd.torch.enable_grad(): Active le calcul du gradient.torch.is_inference_mode_enabled(): Vérifie si le mode d'inférence est activé.
Notes
inference_modeComparerno_gradplus strict, désactive davantage de fonctionnalités.- Dans
inference_modeLes tenseurs qui y sont créés sont marqués comme nœuds non-feuilles et ne peuvent pas être utilisés pour la rétropropagation. - Il est recommandé de l'utiliser lors de l'inférence et de l'évaluation du modèle
inference_modepour obtenir les meilleures performances. inference_modeNe peut pas êtreno_gradimbriqué.
Autres extensions