node
Un termine usato in modo intercambiabile con system.
model parallelization
 La model parallelization era gia stata usata in AlexNet.
 Una buona GPU parallelization richiede di scrivere una struttura a pipeline in modo che le GPU vengano usate simultaneamente, come mostrato in figura.
data parallelization

- GPU1 raccoglie i dati e li distribuisce
- Ogni GPU esegue il forward pass indipendentemente
- GPU1 raccoglie i risultati del forward
- GPU1 distribuisce le informazioni sui gradienti
- Ogni GPU calcola i gradienti indipendentemente
- I gradienti vengono raccolti e calcolati
DataParallel in PyTorch
- Implementa direttamente l’approccio descritto sopra
- Semplicemente distribuisce i dati e fa la media
- Batch size ridotta a causa dell’uso sbilanciato delle GPU
DistributedDataParallel in PyTorch
Ogni GPU ottiene il proprio thread CPU e calcola i propri risultati mediati indipendentemente.
- sampler: un oggetto che determina come i dati vengono campionati dal dataloader. Fornito da torch.
train_sampler = torch.utils.data.distributed.DistributedSampler(train_data)shuffle = Falsepin_memory = True
train_loader = torch.utils.data.DataLoader(train_data, batch_size=20, shuffle=shuffle, pin_memory=pin_memory, num_workers=4, sampler=train_sampler)- num_workers: numero di thread. Tipicamente impostato a 4x il numero di GPU.
- pin_memory: i dati passano attraverso il paging in memoria, poi vengono pinnati, poi caricati sulla GPU — questa opzione li pinna direttamente.
def main(): ngpus_per_node = torch.cuda.device_count() world_size = ngpus_per_node
torch.multiprocessing.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, ))Si crea un worker e lo si passa a spawn come la funzione map di Python.