Функция PyTorch torch.no_grad
Справочное руководство PyTorch torch
torch.no_grad— это контекстный менеджер в PyTorch, используемый для отключения вычисления градиентов. Вno_gradТензоры, созданные внутри блока, не вычисляют градиенты, что может значительно уменьшить потребление памяти и повысить скорость инференса.
Это важно на этапах инференса и оценки модели, значительно повышая производительность и экономя память.
Определение функции
torch.no_grad()
Parameters:
- Нет параметров. Это контекстный менеджер.
Возвращаемое значение:
- Возвращает контекстный менеджер, который отключает вычисление градиентов в этом контексте.
Примеры использования
Пример 1: Базовое использование
Пример
import torch
# Создайте тензор, требующий вычисления градиентов
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# Выполните вычисления внутри контекста no_grad
with torch.no_grad():
y = x * 2
print("Внутри no_grad:", y.requires_grad)
# Вне no_grad
z = x * 2
print("Вне no_grad:", z.requires_grad)
# Создайте тензор, требующий вычисления градиентов
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# Выполните вычисления внутри контекста no_grad
with torch.no_grad():
y = x * 2
print("Внутри no_grad:", y.requires_grad)
# Вне no_grad
z = x * 2
print("Вне no_grad:", z.requires_grad)
Вывод:
在 no_grad 中: False 在 no_grad 外: True
Пример 2: Инференс модели
Пример
import torch
import torch.nn as nn
# Определим простую модель
model = nn.Linear(10, 2)
# Создайте входные данные
x = torch.randn(1, 10)
# Используйте no_grad во время инференса
with torch.no_grad():
output = model(x)
print("Вывод:", output)
# Вычисление градиента не требуется
# Или используйте декоратор
# @torch.no_grad()
# def predict(x):
# return model(x)
import torch.nn as nn
# Определим простую модель
model = nn.Linear(10, 2)
# Создайте входные данные
x = torch.randn(1, 10)
# Используйте no_grad во время инференса
with torch.no_grad():
output = model(x)
print("Вывод:", output)
# Вычисление градиента не требуется
# Или используйте декоратор
# @torch.no_grad()
# def predict(x):
# return model(x)
Вывод:
输出: tensor([[0.0920, 0.3557]])
Пример 3: Режим оценки
Пример
import torch
import torch.nn as nn
model = nn.Sequential(
nn.Linear(10, 5),
nn.ReLU(),
nn.Linear(5, 2)
)
# Переключиться в режим оценки
model.eval()
# Подготовка тестовых данных
test_input = torch.randn(5, 10)
# Отключить градиенты во время оценки
with torch.no_grad():
predictions = model(test_input)
print("Размер результата предсказания:", predictions.shape)
import torch.nn as nn
model = nn.Sequential(
nn.Linear(10, 5),
nn.ReLU(),
nn.Linear(5, 2)
)
# Переключиться в режим оценки
model.eval()
# Подготовка тестовых данных
test_input = torch.randn(5, 10)
# Отключить градиенты во время оценки
with torch.no_grad():
predictions = model(test_input)
print("Размер результата предсказания:", predictions.shape)
Вывод:
预测结果形状: torch.Size([5, 2])
Пример 4: Сравнение использования памяти
Пример
import torch
import torch.nn as nn
model = nn.Linear(1000, 1000)
# Создать большой объем входных данных
inputs = [torch.randn(100, 1000) for _ in range(100)]
# Без no_grad (история градиентов будет записана)
print("Без no_grad:")
for inp in inputs[:5]:
_ = model(inp)
# Используйте no_grad (не записывает историю градиентов)
print("С no_grad:")
with torch.no_grad():
for inp in inputs[:5]:
_ = model(inp)
import torch.nn as nn
model = nn.Linear(1000, 1000)
# Создать большой объем входных данных
inputs = [torch.randn(100, 1000) for _ in range(100)]
# Без no_grad (история градиентов будет записана)
print("Без no_grad:")
for inp in inputs[:5]:
_ = model(inp)
# Используйте no_grad (не записывает историю градиентов)
print("С no_grad:")
with torch.no_grad():
for inp in inputs[:5]:
_ = model(inp)
Использованиеno_gradможет значительно снизить потребление памяти, поскольку нет необходимости хранить информацию о градиентах для промежуточных переменных.
Связанные функции
torch.enable_grad(): Включает вычисление градиентов (в отличие отno_gradпротивоположного).torch.set_grad_enabled(grad): Включает или отключает вычисление градиентов в зависимости от параметров.torch.inference_mode(): Более строгий режим вывода, который отключает как вычисление градиентов, так и autograd.
Примечания
- Во время вывода и оценки модели всегда используйте
torch.no_grad()чтобы сэкономить память и повысить скорость. - Если
no_gradпеременные, созданные внутри блока, должны использоваться вне блока, их нужно вручную скопировать наружу. - и
model.eval()Используйте в сочетании для достижения наилучших результатов.
Другие расширения