Функция torch.inference_mode в PyTorch
Справочное руководство Pytorch torch
torch.inference_modeявляется контекстным менеджером в PyTorch, используемым для режима инференса. Он болееtorch.no_gradстрогий: не только отключает вычисление градиентов, но и отключает все функции отслеживания механизма autograd.
Это, во время вывода модели, болееno_gradэффективно и может дополнительно снизить использование памяти и повысить скорость вывода.
Определение функции
torch.inference_mode(mode=True)
Parameters:
mode(bool, необязательно): ЕслиTrue(значение по умолчанию), включить режим вывода; еслиFalse, выйти из режима вывода. По умолчаниюTrue。
Возвращаемое значение:
- Возвращает контекстный менеджер, в котором градиенты и autograd отключены.
Примеры использования
Пример 1: Базовое использование
Пример
import torch
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# В контексте inference_mode
with torch.inference_mode():
y = x * 2
print("В inference_mode:", y.requires_grad)
# В контексте no_grad
with torch.no_grad():
z = x * 2
print("In no_grad:", z.requires_grad)
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# В контексте inference_mode
with torch.inference_mode():
y = x * 2
print("В inference_mode:", y.requires_grad)
# В контексте no_grad
with torch.no_grad():
z = x * 2
print("In no_grad:", z.requires_grad)
Вывод:
在 inference_mode 中: False 在 no_grad 中: False
Пример 2: Сравнение no_grad и inference_mode
Пример
import torch
# Создать тензор
x = torch.randn(100, 100)
# В inference_mode
with torch.inference_mode():
# Выполнено много вычислений
for _ in range(10):
x = torch.mm(x, x)
# Даже после завершения вычислений тензоры в контексте нельзя использовать для обратного распространения ошибки
result = x.sum()
# Проверить, можно ли его преобразовать в тензор, требующий градиентов
print("В inference_mode:", result.is_leaf)
# Выполните те же вычисления в no_grad
x2 = torch.randn(100, 100)
with torch.no_grad():
for _ in range(10):
x2 = torch.mm(x2, x2)
result2 = x2.sum()
print("В no_grad:", result2.is_leaf)
# Создать тензор
x = torch.randn(100, 100)
# В inference_mode
with torch.inference_mode():
# Выполнено много вычислений
for _ in range(10):
x = torch.mm(x, x)
# Даже после завершения вычислений тензоры в контексте нельзя использовать для обратного распространения ошибки
result = x.sum()
# Проверить, можно ли его преобразовать в тензор, требующий градиентов
print("В inference_mode:", result.is_leaf)
# Выполните те же вычисления в no_grad
x2 = torch.randn(100, 100)
with torch.no_grad():
for _ in range(10):
x2 = torch.mm(x2, x2)
result2 = x2.sum()
print("В no_grad:", result2.is_leaf)
Вывод:
在 inference_mode 中: False 在 no_grad 中: True
Пример 3: Инференс модели
Пример
import torch
import torch.nn as nn
# Определим простую модель
model = nn.Sequential(
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 5)
)
model.eval()
# Создайте входные данные
x = torch.randn(100, 10)
# Используйте inference_mode для инференса
with torch.inference_mode():
output = model(x)
print("Форма выхода:", output.shape)
print("requires_grad выхода:", output.requires_grad)
# Можно также использовать декоратор
@torch.inference_mode()
def predict(x):
return model(x)
result = predict(x)
print("Метод с декоратором - форма вывода:", result.shape)
import torch.nn as nn
# Определим простую модель
model = nn.Sequential(
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 5)
)
model.eval()
# Создайте входные данные
x = torch.randn(100, 10)
# Используйте inference_mode для инференса
with torch.inference_mode():
output = model(x)
print("Форма выхода:", output.shape)
print("requires_grad выхода:", output.requires_grad)
# Можно также использовать декоратор
@torch.inference_mode()
def predict(x):
return model(x)
result = predict(x)
print("Метод с декоратором - форма вывода:", result.shape)
Вывод:
输出形状: torch.Size([100, 5]) 输出 requires_grad: False 装饰器方式 - 输出形状: torch.Size([100, 5])
Пример 4: Сравнение оптимизации памяти
Пример
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)
)
# Проверка использования памяти в различных режимах
x = torch.randn(50, 1000)
print("Без какого-либо контекстного менеджера:")
_ = model(x)
print("\nИспользование no_grad:")
with torch.no_grad():
_ = model(x)
print("\nИспользование 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)
)
# Проверка использования памяти в различных режимах
x = torch.randn(50, 1000)
print("Без какого-либо контекстного менеджера:")
_ = model(x)
print("\nИспользование no_grad:")
with torch.no_grad():
_ = model(x)
print("\nИспользование inference_mode:")
with torch.inference_mode():
_ = model(x)
Использованиеinference_modeможет дополнительно оптимизировать память, поскольку полностью отключает движок autograd.
Связанные функции
torch.no_grad(): Отключает вычисление градиентов, но всё ещё сохраняет часть функциональности autograd.torch.enable_grad(): Включает вычисление градиентов.torch.is_inference_mode_enabled(): Проверяет, включён ли режим inference.
Примечания
inference_modeСравнениеno_gradстроже, отключает больше функциональности.- В
inference_modeТензоры, созданные в нём, помечаются как нелистовые узлы и не могут использоваться для обратного распространения. - Рекомендуется использовать во время вывода и оценки модели
inference_modeдля получения наилучшей производительности. inference_modeНе может бытьno_gradвложенным.
Другие расширения