뉴비에욤

PyTorch 튜토리얼 9 - 멀티 GPU 예제 본문

Machine Learning/PyTorch

PyTorch 튜토리얼 9 - 멀티 GPU 예제

초보에욤 2018. 5. 7. 18:12

2017/07/13 - [Machine Learning/PyTorch] - 윈도우 10 PyTorch 환경 구성 - 설치

2018/04/30 - [Machine Learning/PyTorch] - PyTorch 튜토리얼 1 - PyTorch란?

2018/04/30 - [Machine Learning/PyTorch] - PyTorch 튜토리얼 2 - Autograd : 자동 미분

2018/05/01 - [Machine Learning/PyTorch] - PyTorch 튜토리얼 3 - 뉴럴 네트워크(신경망)

2018/05/01 - [Machine Learning/PyTorch] - PyTorch 튜토리얼 4 - Classifier 학습

2018/05/01 - [Machine Learning/PyTorch] - PyTorch 튜토리얼 5 - 데이터 병렬 처리

2018/05/02 - [Machine Learning/PyTorch] - PyTorch 튜토리얼 7 - Autograd

2018/05/02 - [Machine Learning/PyTorch] - PyTorch 튜토리얼 8 - nn 패키지




원문 : https://pytorch.org/tutorials/beginner/former_torchies/parallelism_tutorial.html

* 17년도 07월에 초번 번역 후, 파이토치 최신 버전인 0.4.0에 맞추어 갱신 된 번역본

* 최근 갱신일 : 2018-05-07



목 차 ( 초보자 튜토리얼 )

B. Torch 사용자를 위한 PyTorch

9. 여러개의 GPU를 이용하는법  ( Multi-GPU examples )

- 데이터 병렬 ( DataParallel )

- CPU, GPU 동시 사용 ( Part of the model on CPU and part on the GPU )





여러개의 GPU를 이용하는법


데이터 병렬 처리(Data Parallelism)는 샘플의 mini-batch를 여러개의 더 작은 mini-batch로 분할하고, 분할하여 크기가 더 작아진 각각의 mini-batch 배치에 대하여 병렬로 계산을 실행하는 작업이다.


데이터 병렬 처리는 torch.nn.DataParallel를 이용하여 실행할 수 있으며 모듈을 DataParallel로 래핑 할 수 있다. 또한 일괄 처리 차원(batch dimension)에서 여러개의 GPU를 이용하여 병렬 처리 될 수 있다.



데이터 병렬 ( DataParallel )


- 코드

import torch
import torch.nn as nn


class DataParallelModel(nn.Module):

    def __init__(self):
        super().__init__()
        self.block1 = nn.Linear(10, 20)

        # wrap block2 in DataParallel
        self.block2 = nn.Linear(20, 20)
        self.block2 = nn.DataParallel(self.block2)

        self.block3 = nn.Linear(20, 20)

    def forward(self, x):
        x = self.block1(x)
        x = self.block2(x)
        x = self.block3(x)
        return x


CPU 기반의 학습을 진행하고자 할 때에도 위 코드는 전혀 변경할 필요가 없다.


데이터 병렬(DataParallel)과 관련 문서는 다음 링크에서 찾아 볼 수 있다.

https://pytorch.org/docs/stable/nn.html#dataparallel-layers-multi-gpu-distributed



데이터 병렬(DataParallel)을 구현하는 기본 요소들은 다음과 같다.


일반적으로 파이토치의 nn.parallel 기본 요소는 독립적으로 사용할 수 있다. 파이토치 개발자들은 간단한 MPI-like-primitves(기본 요소와 유사한 MPI)를 구현하였다.

  • replicate : 여러 디바이스에서 모듈을 복제함
  • scatter : 첫 번째 차원에서 입력을 분산시킴
  • gather : 첫 번째 차원의 입력을 수집하고 연결함
  • parallel_apply : 이미 분산 된 모델 집합의 입력으로 이미 분산 된 입력 집합을 적용함

좀 더 이해를 돕기 위해 위와 같은 기본 요소로 구성 된 data_parallel 코드를 보면 다음과 같다.
- 코드
def data_parallel(module, input, device_ids, output_device=None):
    if not device_ids:
        return module(input)

    if output_device is None:
        output_device = device_ids[0]

    replicas = nn.parallel.replicate(module, device_ids)
    inputs = nn.parallel.scatter(input, device_ids)
    replicas = replicas[:len(inputs)]
    outputs = nn.parallel.parallel_apply(replicas, inputs)
    return nn.parallel.gather(outputs, output_device)





CPU, GPU 동시 사용 ( Part of the model on CPU and part on the GPU )


모델의 일부는 CPU에서 동작하고, 나머지는 GPU에서 동작하는 소규모 네트워크의 실행 코드를 보면 다음과 같다.

- 코드

device = torch.device("cuda:0")

class DistributedModel(nn.Module):

    def __init__(self):
        super().__init__(
            embedding=nn.Embedding(1000, 10),
            rnn=nn.Linear(10, 10).to(device),
        )

    def forward(self, x):
        # Compute embedding on CPU
        x = self.embedding(x)

        # Transfer to GPU
        x = x.to(device)

        # Compute RNN on GPU
        x = self.rnn(x)
        return x



이번 포스팅은 파이토을 이용하여 실제 뭔가를 구현해보고자 하는 사람들을 위한 파이토치에 대한 작은 소개였다. 실제로는 더 많은 부분에 대하여 공부를 진행해야 한다.



optim 패키지, 데이터 로더 등을 소개하는 좀더 포괄적인 입문서를 살펴 보기 바란다.

- 영어 : http://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html

- 한글 : 본 블로그의 PyTorch 튜토리얼 포스팅 1~5



또한 추가적으로 다음과 같은 것들을 참고하기 바란다.

  • 비디오 게임 플레이를 위한 뉴럴 네트워크 학습
    • http://pytorch.org/tutorials/intermediate/reinforcement_q_learning.html
  • ImageNet 대상으로 최첨단 ResNet 네트워크 학습
    • https://github.com/pytorch/examples/tree/master/imagenet
  • Generative Adversarial 네트워크를 이용한 얼굴 생성기 학습
    • https://github.com/pytorch/examples/tree/master/dcgan
  • 반복적인 LSTM 네트워크를 사용하여 단어 수준 언어 모델 훈련
    • https://github.com/pytorch/examples/tree/master/word_language_model
  • 추가 예제
    • https://github.com/pytorch/examples/tree/master/word_language_model
  • 추가 튜토리얼
    • https://github.com/pytorch/examples
  • PyTorch 토론장
    • https://discuss.pytorch.org/
  • Slack에서 다른 사용자들과 채팅
    • https://pytorch.slack.com/?redir=%2Fmessages%2Fbeginner






Comments