PyTorch torch.no_grad Funktion
PyTorch torch-Referenzhandbuch
torch.no_gradist ein Kontextmanager in PyTorch, der verwendet wird, um die Gradientenberechnung zu deaktivieren. Inno_gradTensoren, die innerhalb des Blocks erstellt werden, berechnen keine Gradienten, was den Speicherverbrauch erheblich reduzieren und die Inferenzgeschwindigkeit verbessern kann.
Dies ist während der Modellinferenz- und Evaluierungsphasen unerlässlich, wodurch die Leistung erheblich verbessert und Speicher gespart wird.
Funktionsdefinition
torch.no_grad()
Parameters:
- Keine Parameter. Dies ist ein Kontextmanager.
Rückgabewert:
- Gibt einen Kontextmanager zurück, der die Gradientenberechnung in diesem Kontext deaktiviert.
Anwendungsbeispiele
Beispiel 1: Grundlegende Verwendung
Beispiel
import torch
# Erstelle einen Tensor, der Gradienten benötigt
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# Innerhalb des no_grad-Kontexts berechnen
with torch.no_grad():
y = x * 2
print("Innerhalb von no_grad:", y.requires_grad)
# Außerhalb von no_grad
z = x * 2
print("Außerhalb von no_grad:", z.requires_grad)
# Erstelle einen Tensor, der Gradienten benötigt
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# Innerhalb des no_grad-Kontexts berechnen
with torch.no_grad():
y = x * 2
print("Innerhalb von no_grad:", y.requires_grad)
# Außerhalb von no_grad
z = x * 2
print("Außerhalb von no_grad:", z.requires_grad)
Die Ausgabe ist:
在 no_grad 中: False 在 no_grad 外: True
Beispiel 2: Modellinferenz
Beispiel
import torch
import torch.nn as nn
# Ein einfaches Modell definieren
model = nn.Linear(10, 2)
# Eingabedaten erstellen
x = torch.randn(1, 10)
# Verwende no_grad während der Inferenz
with torch.no_grad():
output = model(x)
print("Ausgabe:", output)
# Keine Gradientenberechnung erforderlich
# Oder verwenden Sie den Decorator
# @torch.no_grad()
# def predict(x):
# return model(x)
import torch.nn as nn
# Ein einfaches Modell definieren
model = nn.Linear(10, 2)
# Eingabedaten erstellen
x = torch.randn(1, 10)
# Verwende no_grad während der Inferenz
with torch.no_grad():
output = model(x)
print("Ausgabe:", output)
# Keine Gradientenberechnung erforderlich
# Oder verwenden Sie den Decorator
# @torch.no_grad()
# def predict(x):
# return model(x)
Die Ausgabe ist:
输出: tensor([[0.0920, 0.3557]])
Beispiel 3: Evaluierungsmodus
Beispiel
import torch
import torch.nn as nn
model = nn.Sequential(
nn.Linear(10, 5),
nn.ReLU(),
nn.Linear(5, 2)
)
# In den Evaluierungsmodus wechseln
model.eval()
# Testdaten vorbereiten
test_input = torch.randn(5, 10)
# Gradienten während der Evaluierung deaktivieren
with torch.no_grad():
predictions = model(test_input)
print("Form des Vorhersageergebnisses:", predictions.shape)
import torch.nn as nn
model = nn.Sequential(
nn.Linear(10, 5),
nn.ReLU(),
nn.Linear(5, 2)
)
# In den Evaluierungsmodus wechseln
model.eval()
# Testdaten vorbereiten
test_input = torch.randn(5, 10)
# Gradienten während der Evaluierung deaktivieren
with torch.no_grad():
predictions = model(test_input)
print("Form des Vorhersageergebnisses:", predictions.shape)
Die Ausgabe ist:
预测结果形状: torch.Size([5, 2])
Beispiel 4: Speicherverbrauch vergleichen
Beispiel
import torch
import torch.nn as nn
model = nn.Linear(1000, 1000)
# Eine große Menge an Eingaben erstellen
inputs = [torch.randn(100, 1000) for _ in range(100)]
# Ohne no_grad (Gradientenverlauf wird aufgezeichnet)
print("Ohne no_grad:")
for inp in inputs[:5]:
_ = model(inp)
# no_grad verwenden (zeichnet keinen Gradientenverlauf auf)
print("Mit no_grad:")
with torch.no_grad():
for inp in inputs[:5]:
_ = model(inp)
import torch.nn as nn
model = nn.Linear(1000, 1000)
# Eine große Menge an Eingaben erstellen
inputs = [torch.randn(100, 1000) for _ in range(100)]
# Ohne no_grad (Gradientenverlauf wird aufgezeichnet)
print("Ohne no_grad:")
for inp in inputs[:5]:
_ = model(inp)
# no_grad verwenden (zeichnet keinen Gradientenverlauf auf)
print("Mit no_grad:")
with torch.no_grad():
for inp in inputs[:5]:
_ = model(inp)
Verwendungno_gradkann den Speicherverbrauch erheblich reduzieren, da keine Gradienteninformationen für Zwischenvariablen gespeichert werden müssen.
Verwandte Funktionen
torch.enable_grad(): Ermöglicht die Gradientenberechnung (im Gegensatz zuno_graddas Gegenteil).torch.set_grad_enabled(grad): Aktiviert oder deaktiviert die Gradientenberechnung basierend auf Parametern.torch.inference_mode(): Ein strengerer Inferenzmodus, der sowohl die Gradientenberechnung als auch autograd deaktiviert.
Hinweise
- Verwenden Sie während der Modellinferenz und -evaluierung immer
torch.no_grad()um Speicher zu sparen und die Geschwindigkeit zu verbessern. - Wenn
no_gradVariablen, die innerhalb des Blocks erstellt werden, müssen außerhalb des Blocks verwendet werden; sie müssen manuell herauskopiert werden. - und
model.eval()Für beste Ergebnisse in Kombination verwenden.
Andere Erweiterungen