Función PyTorch torch.inference_mode
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)
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)
# 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)
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)
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.- En
inference_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 modelo
inference_modepara obtener el mejor rendimiento. inference_modeNo se puedeno_gradutilizar de forma anidada.
Otras extensiones