PyTorch torch.no_grad Funktion


Pytorch torch 参考手册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)

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)

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)

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)

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 immertorch.no_grad()um Speicher zu sparen und die Geschwindigkeit zu verbessern.
  • Wennno_gradVariablen, die innerhalb des Blocks erstellt werden, müssen außerhalb des Blocks verwendet werden; sie müssen manuell herauskopiert werden.
  • undmodel.eval()Für beste Ergebnisse in Kombination verwenden.

Pytorch torch 参考手册PyTorch torch-Referenzhandbuch

Andere Erweiterungen