Функция PyTorch torch.is_inference_mode_enabled
Справочное руководство PyTorch torch
torch.is_inference_mode_enabled— это функция в PyTorch, используемая для проверки, включён ли в данный момент режим инференса. Она возвращает, находится ли текущий контекст вinference_modeлогическое значение контекста.
Это полезно при написании кода, которому нужно выполнять различную логику в зависимости от состояния режима инференса.
Определение функции
torch.is_inference_mode_enabled()
Parameters:
- Нет параметров.
Возвращаемое значение:
- Возвращает логическое значение: если режим инференса в данный момент включён, возвращает
True; в противном случае возвращаетFalse。
Примеры использования
Пример 1: Базовое использование
Пример
import torch
# По умолчанию режим инференса отключён
print("Состояние по умолчанию:", torch.is_inference_mode_enabled())
# Внутри контекста inference_mode
with torch.inference_mode():
print("Внутри inference_mode:", torch.is_inference_mode_enabled())
# Восстановлено после выхода
print("После выхода:", torch.is_inference_mode_enabled())
# По умолчанию режим инференса отключён
print("Состояние по умолчанию:", torch.is_inference_mode_enabled())
# Внутри контекста inference_mode
with torch.inference_mode():
print("Внутри inference_mode:", torch.is_inference_mode_enabled())
# Восстановлено после выхода
print("После выхода:", torch.is_inference_mode_enabled())
Результат вывода:
默认状态: False 在 inference_mode 中: True 退出后: False
Пример 2: Сравнение is_grad_enabled и is_inference_mode_enabled
Пример
import torch
# Внутри no_grad
with torch.no_grad():
print("Внутри no_grad:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# Внутри inference_mode
with torch.inference_mode():
print("Внутри inference_mode:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# Состояние по умолчанию
print("Состояние по умолчанию:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# Внутри no_grad
with torch.no_grad():
print("Внутри no_grad:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# Внутри inference_mode
with torch.inference_mode():
print("Внутри inference_mode:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
# Состояние по умолчанию
print("Состояние по умолчанию:")
print(" is_grad_enabled:", torch.is_grad_enabled())
print(" is_inference_mode_enabled:", torch.is_inference_mode_enabled())
Результат вывода:
在 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
Пример 3: Использование в условных проверках
Пример
import torch
import torch.nn as nn
def forward_pass(x, model):
"""Выполняет различные оптимизации в зависимости от режима вывода"""
if torch.is_inference_mode_enabled():
print("Использование оптимизации режима вывода")
# Оптимизированные вычисления в режиме инференса
return model(x)
elif torch.is_grad_enabled():
print("Режим обучения")
return model(x)
else:
print("Режим оценки")
return model(x)
model = nn.Linear(10, 5)
x = torch.randn(5, 10)
# Проверка различных состояний
print("=== Режим обучения ===")
with torch.enable_grad():
result = forward_pass(x, model)
print("n=== Режим инференса ===")
with torch.inference_mode():
result = forward_pass(x, model)
print("n=== Режим оценки ===")
with torch.no_grad():
result = forward_pass(x, model)
import torch.nn as nn
def forward_pass(x, model):
"""Выполняет различные оптимизации в зависимости от режима вывода"""
if torch.is_inference_mode_enabled():
print("Использование оптимизации режима вывода")
# Оптимизированные вычисления в режиме инференса
return model(x)
elif torch.is_grad_enabled():
print("Режим обучения")
return model(x)
else:
print("Режим оценки")
return model(x)
model = nn.Linear(10, 5)
x = torch.randn(5, 10)
# Проверка различных состояний
print("=== Режим обучения ===")
with torch.enable_grad():
result = forward_pass(x, model)
print("n=== Режим инференса ===")
with torch.inference_mode():
result = forward_pass(x, model)
print("n=== Режим оценки ===")
with torch.no_grad():
result = forward_pass(x, model)
Результат вывода:
=== 训练模式 === 训练模式 === 推理模式 === 使用推理模式优化 === eval 模式 === eval 模式
Пример 4: Обнаружение в пользовательских модулях
Пример
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):
# Обнаружить режим инференса и применить оптимизацию
if torch.is_inference_mode_enabled():
# Режим инференса: использовать более эффективные вычисления
return torch.mm(x, self.weight)
elif torch.is_grad_enabled():
# Режим обучения: сохранять вычисление градиентов
return torch.mm(x, self.weight)
else:
# Режим оценки: градиенты не нужны, но оптимизация может использоваться
with torch.no_grad():
return torch.mm(x, self.weight)
layer = OptimizedLayer()
x = torch.randn(5, 10)
print("=== Режим обучения ===")
with torch.enable_grad():
_ = слой(x)
print("n=== Режим инференса ===")
with torch.inference_mode():
_ = слой(x)
print("n=== Режим оценки ===")
with torch.no_grad():
_ = слой(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):
# Обнаружить режим инференса и применить оптимизацию
if torch.is_inference_mode_enabled():
# Режим инференса: использовать более эффективные вычисления
return torch.mm(x, self.weight)
elif torch.is_grad_enabled():
# Режим обучения: сохранять вычисление градиентов
return torch.mm(x, self.weight)
else:
# Режим оценки: градиенты не нужны, но оптимизация может использоваться
with torch.no_grad():
return torch.mm(x, self.weight)
layer = OptimizedLayer()
x = torch.randn(5, 10)
print("=== Режим обучения ===")
with torch.enable_grad():
_ = слой(x)
print("n=== Режим инференса ===")
with torch.inference_mode():
_ = слой(x)
print("n=== Режим оценки ===")
with torch.no_grad():
_ = слой(x)
Результат вывода:
=== 训练模式 === 训练模式 === 推理模式 === 推理模式:使用更高效的计算方式 === eval 模式 === eval 模式
Связанные функции
torch.inference_mode(): Контекстный менеджер, который включает режим инференса.torch.no_grad(): Контекстный менеджер, который отключает вычисление градиентов.torch.is_grad_enabled(): Проверяет, включено ли вычисление градиентов.
Примечания
is_inference_mode_enabledЭто функция только для чтения, и она не изменяет никакое состояние.- Она специально используется для обнаружения
inference_mode, а неno_grad。 - В
inference_modeКогда вis_grad_enabledтакже возвращаетFalse, но обратное неверно. - При написании обобщённого кода можно использовать эту функцию для различения разных режимов выполнения.
Другие расширения