Función PyTorch torch.inference_mode


Pytorch torch 参考手册Manual de referencia de Pytorch torch

torch.inference_modeEs el administrador de contexto en PyTorch para el modo de inferencia. Es mástorch.no_gradestricto, no solo desactiva el cálculo de gradientes, sino que también desactiva todas las funciones de seguimiento del motor autograd.

Esto, durante la inferencia del modelo, es másno_gradeficiente, puede reducir aún más el uso de memoria y aumentar la velocidad de inferencia.

Definición de la función

torch.inference_mode(mode=True)

Parámetros:

  • mode(bool, opcional): si esTrue(valor predeterminado), habilita el modo de inferencia; si esFalse, se desactiva el modo de inferencia. El valor predeterminado esTrue。

Valor de retorno:

  • Devuelve un administrador de contexto en el que se desactivan los gradientes y autograd.

Ejemplos de uso

Ejemplo 1: Uso básico

Ejemplo

import torch

x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)

# En el contexto de inference_mode
with torch.inference_mode():
    y = x * 2
    print("En inference_mode:", y.requires_grad)

# En el contexto de no_grad
with torch.no_grad():
    z = x * 2
    print("En no_grad:", z.requires_grad)

La salida es:

在 inference_mode 中: False
在 no_grad 中: False

Ejemplo 2: Comparación entre no_grad e inference_mode

Ejemplo

import torch

# Crear un tensor
x = torch.randn(100, 100)

# En inference_mode
with torch.inference_mode():
    # Se realizan muchos cálculos
    for _ in range(10):
        x = torch.mm(x, x)

    # Incluso después de los cálculos, los tensores en el contexto no se pueden usar para la retropropagación
    result = x.sum()

    # Comprobar si se puede convertir a un tensor que requiere gradiente
    print("En inference_mode:", result.is_leaf)

# Hacer el mismo cálculo en 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 salida es:

在 inference_mode 中: False
在 no_grad 中: True

Ejemplo 3: Inferencia del modelo

Ejemplo

import torch
import torch.nn as nn

# Definir un modelo simple
model = nn.Sequential(
    nn.Linear(10, 20),
    nn.ReLU(),
    nn.Linear(20, 5)
)

model.eval()

# Crear datos de entrada
x = torch.randn(100, 10)

# Usar inference_mode para la inferencia
with torch.inference_mode():
    output = model(x)
    print("Forma de salida:", output.shape)
    print("Salida requires_grad:", output.requires_grad)

# También se puede usar el decorador
@torch.inference_mode()
def predict(x):
    return model(x)

result = predict(x)
print("Método con decorador - Forma de salida:", result.shape)

La salida es:

输出形状: torch.Size([100, 5])
输出 requires_grad: False
装饰器方式 - 输出形状: torch.Size([100, 5])

Ejemplo 4: Comparación de optimización de memoria

Ejemplo

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)
)

# Probar el uso de memoria en diferentes modos
x = torch.randn(50, 1000)

print("Sin usar ningún administrador de contexto:")
_ = model(x)

print("nUsar no_grad:")
with torch.no_grad():
    _ = model(x)

print("nUsar inference_mode:")
with torch.inference_mode():
    _ = model(x)

Usarinference_modepuede optimizar aún más la memoria, ya que desactiva por completo el motor autograd.


Funciones relacionadas

  • torch.no_grad(): Desactiva el cálculo de gradientes, pero conserva parte de la funcionalidad de autograd.
  • torch.enable_grad(): Habilita el cálculo de gradientes.
  • torch.is_inference_mode_enabled(): Comprueba si el modo de inferencia está habilitado.

Notas

  • inference_modeCompararno_gradEs más estricto, desactiva más funciones.
  • Eninference_modeLos tensores creados en este contexto se marcan como nodos no hoja y no se pueden utilizar para la retropropagación.
  • Se recomienda usar en la inferencia y evaluación del modeloinference_modepara obtener el mejor rendimiento.
  • inference_modeNo se puedeno_gradutilizar de forma anidada.

Pytorch torch 参考手册Manual de referencia de Pytorch torch

Otras extensiones