Introduction
Gradient accumulation helps train models with large batch sizes by splitting them into smaller steps, saving memory and keeping training stable.
optimizer.zero_grad() for i, data in enumerate(dataloader): outputs = model(data.inputs) loss = loss_function(outputs, data.labels) / accumulation_steps loss.backward() if (i + 1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad()
accumulation_steps = 4 optimizer.zero_grad() for i, (inputs, labels) in enumerate(dataloader): outputs = model(inputs) loss = criterion(outputs, labels) / accumulation_steps loss.backward() if (i + 1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad()
accumulation_steps = 2 optimizer.zero_grad() for i, batch in enumerate(dataloader): inputs, targets = batch outputs = model(inputs) loss = loss_fn(outputs, targets) / accumulation_steps loss.backward() if (i + 1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad()
import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset # Simple dataset inputs = torch.randn(20, 5) labels = torch.randn(20, 1) dataset = TensorDataset(inputs, labels) dataloader = DataLoader(dataset, batch_size=2) # Simple model model = nn.Linear(5, 1) criterion = nn.MSELoss() optimizer = optim.SGD(model.parameters(), lr=0.1) accumulation_steps = 4 optimizer.zero_grad() for i, (x, y) in enumerate(dataloader): outputs = model(x) loss = criterion(outputs, y) / accumulation_steps loss.backward() if (i + 1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad() # Handle the case where the last batch is not a multiple of accumulation_steps if (i + 1) % accumulation_steps != 0: optimizer.step() optimizer.zero_grad() # Check final loss on the dataset with torch.no_grad(): preds = model(inputs) final_loss = criterion(preds, labels).item() print(f"Final loss after gradient accumulation: {final_loss:.4f}")
optimizer.zero_grad()
for i, (inputs, labels) in enumerate(dataloader):
outputs = model(inputs)
loss = criterion(outputs, labels) / 2
loss.backward()
if (i + 1) % 2 == 0:
optimizer.step()
optimizer.zero_grad()
print(f"Batch {i+1} loss: {loss.item()}")optimizer.zero_grad()
for i, (inputs, labels) in enumerate(dataloader):
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
if i % 4 == 0:
optimizer.step()
optimizer.zero_grad()Pass the test and this pattern moves unknown