🎓 A1Learner
🔍
0 of 87 lessons completed

PyTorch Inference Mode

Inference mode is a context manager that switches autograd off completely for a block of code. Tensors created inside it are inference tensors, and strict rules guard them.

Evaluation under no_grad

no_grad stops gradient tracking for the block. The output stays a normal tensor, and it can slip into tracked maths later with no warning.

import torch

model = torch.nn.Linear(4, 2)
x = torch.randn(2, 4)
with torch.no_grad():
    out = model(x)
print(out.shape, out.requires_grad)

The same evaluation in inference mode

Inference mode runs the same forward pass. A tensor created inside the block is marked as an inference tensor.

with torch.inference_mode():
    out = model(x)
    kept = x * 2
print(out.shape)
print(kept.is_inference())

The rails bite outside the block

Using the inference tensor in tracked maths raises an error at once. The mistake surfaces at the boundary, not deep inside a training step.

w = torch.randn(4, requires_grad=True)
try:
    kept @ w
except RuntimeError:
    print("RuntimeError raised")

Clone makes a normal tensor

A clone of an inference tensor is a normal tensor. The clone can take part in tracked maths.

normal = kept.clone()
print(normal.is_inference())
print((normal @ w).shape)

Example

import torch

torch.manual_seed(0)
model = torch.nn.Sequential(
    torch.nn.Linear(4, 8),
    torch.nn.ReLU(),
    torch.nn.Linear(8, 3),
)
model.eval()
x = torch.randn(5, 4)

with torch.no_grad():
    out_no_grad = model(x)

with torch.inference_mode():
    out_inference = model(x)
    saved = x * 2

print("Output shape:", out_inference.shape)
print("Outputs equal:", torch.equal(out_no_grad, out_inference))
print("Saved tensor is inference:", saved.is_inference())

w = torch.randn(4, requires_grad=True)
try:
    y = saved @ w
    print("No error raised")
except RuntimeError as e:
    print("Error type: RuntimeError")
    print("Error message starts:", str(e).split(".")[0])

Key points

  • Inference mode: a block where autograd records nothing at all
  • Inference tensor: a tensor created inside inference mode
  • Use torch.inference_mode() around evaluation and prediction code
  • Inference tensors cannot be saved for backward in a later computation
  • In-place edits to an inference tensor outside the block raise an error too
  • Use clone() on an inference tensor to get a normal tensor
  • In short, inference mode swaps flexibility for a leaner and safer evaluation

In this example, a small Sequential model scores five rows of four values. The first pass runs under no_grad and the second under inference mode. Both passes print the same output shape, and the outputs compare equal. The tensor saved inside inference mode reports True for is_inference(). Outside the block, that tensor meets a weight that requires gradients. PyTorch raises a RuntimeError at that line. The program prints only the first sentence of the error, because later sentences add advice that can change between versions. A clone of the saved tensor would have worked, at the cost of one copy.

Note

torch.no_grad() is the softer switch. Its tensors stay normal and can rejoin tracked work later.

Try it Yourself

Edit the code, then press Run.

Running is simulated · Python Playground

Exercise

What happens when an inference tensor is used in a computation that autograd tracks?