多GPU、Parallel|用語および概念単純コード[PyTorch]


今回は,マルチgpuを用いた場合に出現する用語と概念を整理した.
複数のGPUの並列をデータとモデルで整理した.
コード#コード#

Multi-GPU


以前、GPUを少なくするにはどうすればいいかずっと考えていました.
最近、性能に重点を置き、GPUを大量に使用している.

クリーンアップ用語


シングル:1つの使用と複数の使用:複数の使用
GPU VS Node:Nodeはコンピュータを指します.
シングルノードシングルGPU:1台のコンピュータ上で1つのGPUを使用する
シングルノードマルチGPU:1台のコンピュータ上で複数のGPUを使用する
マルチノードマルチGPU:サーバルームで複数のGPUを使用

Model parallel


学習を
  • 多GPUに分散する2つの方法
  • モデル分割/データ分割
  • alexnetからモデル並列化が研究されている.
  • 型ボトルネックラインの困難などは,高難度の課題とされている.
  • class ModelParallelResNet(ResNet):
    	def __init__():
    		...
    		self.seq1 = nn.Sequential(
    			self.conv2,...
    		).to('cuda:0') # cuda0에 할당
    
    		self.seq2 = nn.Sequential(
    			self.conv2,...
    		).to('cuda:1') # cuda1에 할당
    
    		...
    	def forward(self,x):
    		x = self.seq2(self.seq1(x).to('cuda:1')) # cuda0에서 cuda1로 복사한다
    
    		

    Data parallel


    いわゆるData Parallel


    minbatchとはあまり差がないような気がします.
    minbatchのようにデータをスライス並列処理し、
    これは後で加算して平均値を求める方法です.

    Forwardレッスン

  • データは各GPUに配信される.
  • 並列演算.
  • が全て完了した後、1 GPUで結果を収集する.
  • バックアッププロセス

  • を持って1つの場所に集中した各損失は、それぞれ勾配を求める.
  • は、これらの勾配を再び各GPUに送り返す.
  • は、各GPU上で並列に後方に実行される.
  • が再収集され、GPUに送信され、それらの平均値が更新される.
  • 特長

  • は単純なデータ配分と平均によりGPUの使用が不均衡になる.
  • GIL(Global Interpreter Lock)
  • PyTorchコード

    parallel_model = torch.nn.DataParallel(model)
    ...
    # backward 할 때 Average GPU-losses + backward pass
    loss.mean().backward()

    Distributed Data Parallel


    CPUも各GPUに割り当てられ、各CPUはプロセスを生成し、各GPUに割り当てられる.
    ◆基本的にはDataParallelで1つの演算の平均値を個別に与える.
    train_sampler = torch.utils.data.distributed.DistributedSampler(data)
    
    loader = torch.utils.data.DataLoader(data,batch_size=20,shuffle = False,
    	pin_memory = True,sampler=train_sampler)
    
    def main():
    	n_gpus = torch.cuda.device_count()
    	torch.multiprocessing.spawn(main_worker,nprocs=n_gpus,args=(n_gpus,)
    
    def main_worker(gpu,n_gpus):
    	...
    	# 멀티프로세싱 통신 규약 정의
    	torch.distributed.init_process_group(backend='nccl',
    	init_method='tcpL//~',world_size=n_gpus,rank=gpu)
    	
    	# Distributed DataParallel 정의
    	torch.nn.parallel.DistributedDataParallel(model,device_idx=[gpu])
    
    またnum workersではGPU x 4がよく使われています.