PyTorch torch.is_inference_mode_enabled Funktion
PyTorch torch-Referenzhandbuch
torch.is_inference_mode_enabledist eine Funktion in PyTorch, mit der überprüft wird, ob der Inferenzmodus derzeit aktiviert ist. Sie gibt zurück, ob sich der aktuelle Kontext ininference_modeeinem booleschen Wert des Kontexts befindet.
Dies ist nützlich beim Schreiben von Code, der abhängig vom Zustand des Inferenzmodus unterschiedliche Logik ausführen muss.
Funktionsdefinition
torch.is_inference_mode_enabled()
Parameters:
- Keine Parameter.
Rückgabewert:
- Gibt einen booleschen Wert zurück: Wenn der Inferenzmodus derzeit aktiviert ist, wird zurückgegeben
True; andernfalls wird zurückgegebenFalse。
Anwendungsbeispiele
Beispiel 1: Grundlegende Verwendung
Beispiel
import torch
# Standardmäßig ist der Inferenzmodus deaktiviert
print("Standardzustand:", torch.is_inference_mode_enabled())
# Innerhalb des inference_mode-Kontexts
with torch.inference_mode():
print("Innerhalb von inference_mode:", torch.is_inference_mode_enabled())
# Nach dem Verlassen wiederhergestellt
print("Nach dem Verlassen:", torch.is_inference_mode_enabled())
# Standardmäßig ist der Inferenzmodus deaktiviert
print("Standardzustand:", torch.is_inference_mode_enabled())
# Innerhalb des inference_mode-Kontexts
with torch.inference_mode():
print("Innerhalb von inference_mode:", torch.is_inference_mode_enabled())
# Nach dem Verlassen wiederhergestellt
print("Nach dem Verlassen:", torch.is_inference_mode_enabled())
Das Ausgabeergebnis ist:
默认状态: False 在 inference_mode 中: True 退出后: False
Beispiel 2: Vergleich von is_grad_enabled und is_inference_mode_enabled
Beispiel
import torch
# Innerhalb von no_grad
with torch.no_grad():
print("Innerhalb von no_grad:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# Innerhalb von inference_mode
with torch.inference_mode():
print("Innerhalb von inference_mode:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# Standardzustand
print("Standardzustand:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# Innerhalb von no_grad
with torch.no_grad():
print("Innerhalb von no_grad:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# Innerhalb von inference_mode
with torch.inference_mode():
print("Innerhalb von inference_mode:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# Standardzustand
print("Standardzustand:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
Das Ausgabeergebnis ist:
在 no_grad 中: is_grad_enabled: False is_inference_mode_enabled: False 在 inference_mode 中: is_grad_enabled: False is_inference_mode_enabled: True 默认状态: is_grad_enabled: True is_inference_mode_enabled: False
Beispiel 3: Verwendung in bedingten Entscheidungen
Beispiel
import torch
import torch.nn as nn
def forward_pass(x, model):
"""Führe abhängig vom inference_mode unterschiedliche Optimierungen aus"""
if torch.is_inference_mode_enabled():
print("Verwendung der inference_mode-Optimierung")
# Optimierte Berechnung im Inferenzmodus
return model(x)
elif torch.is_grad_enabled():
print("Trainingsmodus")
return model(x)
else:
print("Eval-Modus")
return model(x)
model = nn.Linear(10, 5)
x = torch.randn(5, 10)
# Verschiedene Zustände testen
print("=== Trainingsmodus ===")
with torch.enable_grad():
result = forward_pass(x, model)
print("n=== Inferenzmodus ===")
with torch.inference_mode():
result = forward_pass(x, model)
print("n=== Eval-Modus ===")
with torch.no_grad():
result = forward_pass(x, model)
import torch.nn as nn
def forward_pass(x, model):
"""Führe abhängig vom inference_mode unterschiedliche Optimierungen aus"""
if torch.is_inference_mode_enabled():
print("Verwendung der inference_mode-Optimierung")
# Optimierte Berechnung im Inferenzmodus
return model(x)
elif torch.is_grad_enabled():
print("Trainingsmodus")
return model(x)
else:
print("Eval-Modus")
return model(x)
model = nn.Linear(10, 5)
x = torch.randn(5, 10)
# Verschiedene Zustände testen
print("=== Trainingsmodus ===")
with torch.enable_grad():
result = forward_pass(x, model)
print("n=== Inferenzmodus ===")
with torch.inference_mode():
result = forward_pass(x, model)
print("n=== Eval-Modus ===")
with torch.no_grad():
result = forward_pass(x, model)
Das Ausgabeergebnis ist:
=== 训练模式 === 训练模式 === 推理模式 === 使用推理模式优化 === eval 模式 === eval 模式
Beispiel 4: Erkennung in benutzerdefinierten Modulen
Beispiel
import torch
import torch.nn as nn
class OptimizedLayer(nn.Module):
def __init__(self):
super().__init__()
self.weight = nn.Parameter(torch.randn(20, 10))
def forward(self, x):
# Inferenzmodus erkennen und Optimierung anwenden
if torch.is_inference_mode_enabled():
# Inferenzmodus: effizientere Berechnung verwenden
return torch.mm(x, self.weight)
elif torch.is_grad_enabled():
# Trainingsmodus: Gradientenberechnung beibehalten
return torch.mm(x, self.weight)
else:
# Eval-Modus: Gradienten nicht erforderlich, aber Optimierung kann verwendet werden
with torch.no_grad():
return torch.mm(x, self.weight)
layer = OptimizedLayer()
x = torch.randn(5, 10)
print("=== Trainingsmodus ===")
with torch.enable_grad():
_ = Schicht(x)
print("n=== Inferenzmodus ===")
with torch.inference_mode():
_ = Schicht(x)
print("n=== Eval-Modus ===")
with torch.no_grad():
_ = Schicht(x)
import torch.nn as nn
class OptimizedLayer(nn.Module):
def __init__(self):
super().__init__()
self.weight = nn.Parameter(torch.randn(20, 10))
def forward(self, x):
# Inferenzmodus erkennen und Optimierung anwenden
if torch.is_inference_mode_enabled():
# Inferenzmodus: effizientere Berechnung verwenden
return torch.mm(x, self.weight)
elif torch.is_grad_enabled():
# Trainingsmodus: Gradientenberechnung beibehalten
return torch.mm(x, self.weight)
else:
# Eval-Modus: Gradienten nicht erforderlich, aber Optimierung kann verwendet werden
with torch.no_grad():
return torch.mm(x, self.weight)
layer = OptimizedLayer()
x = torch.randn(5, 10)
print("=== Trainingsmodus ===")
with torch.enable_grad():
_ = Schicht(x)
print("n=== Inferenzmodus ===")
with torch.inference_mode():
_ = Schicht(x)
print("n=== Eval-Modus ===")
with torch.no_grad():
_ = Schicht(x)
Das Ausgabeergebnis ist:
=== 训练模式 === 训练模式 === 推理模式 === 推理模式:使用更高效的计算方式 === eval 模式 === eval 模式
Verwandte Funktionen
torch.inference_mode(): Kontextmanager, der den Inferenzmodus aktiviert.torch.no_grad(): Kontextmanager, der die Gradientenberechnung deaktiviert.torch.is_grad_enabled(): Prüft, ob die Gradientenberechnung aktiviert ist.
Hinweise
is_inference_mode_enabledEs ist eine schreibgeschützte Funktion und ändert keinen Zustand.- Sie wird speziell verwendet, um zu erkennen
inference_mode, nichtno_grad。 - In
inference_modeWenn inis_grad_enabledgibt auch zurückFalse, aber die Umkehrung gilt nicht. - Wenn Sie generischen Code schreiben, können Sie diese Funktion verwenden, um verschiedene Ausführungsmodi zu unterscheiden.
Andere Erweiterungen