Training on CPU with Trainer
This guide explains how to train models on CPU using Trainer from qadence.ml_tools, covering single-process and multi-processing setups.
Understanding Arguments
- nprocs: Number of processes to run. To enable multi-processing and launch separate processes, set nprocs > 1.
- compute_setup: The computational setup used for training. Options include
cpu,gpu, andauto.
For more details on the advanced training options, please refer to TrainConfig Documentation
Configuring TrainConfig for CPU Training
By adjusting TrainConfig, you can seamlessly switch between single and multi-core CPU training. To enable CPU-based training, update these fields in TrainConfig:
Single-Process Training Configuration:
backend="cpu": Ensures training runs on the CPU.nprocs=1: Uses one CPU core.
Multi-Processing Configuration
backend="gloo": Uses the Gloo backend for CPU multi-processing.nprocs=4: Utilizes 4 CPU cores.
Examples
Single-Process CPU Training Example
Single-Process Training: Simple and suitable for small datasets. Use backend="cpu".
import torch
from torch import nn, optim
from torch.utils.data import DataLoader, TensorDataset
from qadence.ml_tools import TrainConfig, Trainer
from qadence.ml_tools.optimize_step import optimize_step
Trainer.set_use_grad(True)
# Dataset, Model, and Optimizer
x = torch.linspace(0, 1, 100).reshape(-1, 1)
y = torch.sin(2 * torch.pi * x)
dataloader = DataLoader(TensorDataset(x, y), batch_size=16, shuffle=True)
model = nn.Sequential(nn.Linear(1, 16), nn.ReLU(), nn.Linear(16, 1))
optimizer = optim.SGD(model.parameters(), lr=0.01)
# Single-Process Training Configuration
train_config = TrainConfig(compute_setup="cpu", max_iter=5, print_every=1)
# Training
trainer = Trainer(model, optimizer, train_config, loss_fn="mse", optimize_step=optimize_step)
trainer.fit(dataloader)
Multi-Processing CPU Training Example
Multi-Processing Training: Best for large datasets, utilizes multiple CPU processes. Use backend="gloo" and set nprocs.
import torch
from torch import nn, optim
from torch.utils.data import DataLoader, TensorDataset
from qadence.ml_tools import TrainConfig, Trainer
from qadence.ml_tools.optimize_step import optimize_step
Trainer.set_use_grad(True)
# __main__ is recommended.
if __name__ == "__main__":
x = torch.linspace(0, 1, 100).reshape(-1, 1)
y = torch.sin(2 * torch.pi * x)
dataloader = DataLoader(TensorDataset(x, y), batch_size=16, shuffle=True)
model = nn.Sequential(nn.Linear(1, 16), nn.ReLU(), nn.Linear(16, 1))
optimizer = optim.SGD(model.parameters(), lr=0.01)
# Multi-Process Training Configuration
train_config = TrainConfig(
compute_setup="cpu",
backend="gloo",
nprocs=4,
max_iter=5,
print_every=1)
trainer = Trainer(model, optimizer, train_config, loss_fn="mse", optimize_step=optimize_step)
trainer.fit(dataloader)