Mentoring 240814

1. Deep Learning Process Recap

Deep learning process에서 input과 output 구조를 보면, MNIST 데이터셋의 28x28 이미지를 벡터화시키면 784가 input으로 들어가고, output으로는 10차원이 나옵니다. 데이터를 통해 자연스럽게 학습을 진행하며, 이는 0부터 9까지의 숫자를 분류하는 것일 수도 있지만, 이미지를 통해 사람을 제거하는 등의 작업에서도 모델의 구성에 대한 힌트를 얻을 수 있습니다.

2. 강의 내용 Review

회사에서는 보통 GPU가 4개 정도 주어지며, 업무 기간은 1주일입니다. A라는 사람이 1개의 GPU를 이용해서 10의 결과를 낸다면, B라는 사람은 4개의 GPU를 이용해서 100의 결과를 낼 수 있을 것입니다. 따라서 이론뿐만 아니라 주어진 자원을 얼마나 잘 활용할 수 있는지가 중요하며, GPU가 많고 실험을 많이 돌릴 수 있는 환경이 주어지면 더욱 좋습니다.

Multi-GPU 활용 및 PyTorch Lightning

1. 다중 GPU 활용의 필요성

딥러닝 모델이 점점 더 복잡해지고 대규모 데이터셋을 처리해야 할 때, 단일 GPU로는 처리 속도와 메모리 측면에서 한계가 발생할 수 있습니다. 이때 다중 GPU를 활용하면 다음과 같은 이점이 있습니다:

2. PyTorch에서 Multi-GPU 활용

2.1 DataParallel

DataParallel은 가장 기본적인 Multi-GPU 사용 방법입니다. 모델을 여러 GPU에 분산시키고, 각 GPU에서 병렬로 학습을 진행한 뒤, 결과를 집계하여 업데이트합니다.

import torch
import torch.nn as nn

# 모델 정의
model = MyModel()

# 모델을 여러 GPU에 분산
if torch.cuda.device_count() > 1:
    model = nn.DataParallel(model)

# 모델을 GPU로 이동
model = model.to('cuda')

# 이후 학습 루프에서 그대로 사용 가능

장점: 사용이 간편하며, 코드 수정이 거의 필요 없습니다.

단점: GPU 간의 통신 오버헤드가 존재하며, 성능 최적화 측면에서 제한이 있을 수 있습니다.

2.2 DistributedDataParallel

DistributedDataParallel(DDP)은 DataParallel보다 더 성능이 좋은 방법입니다. 각 GPU가 독립적으로 모델을 학습하고, 그 결과를 동기화하여 업데이트합니다.

import torch
import torch.nn as nn
import torch.distributed as dist

# DDP 설정
dist.init_process_group(backend='nccl')

# 모델 정의
model = MyModel().to('cuda')

# 모델을 DDP로 감싸기
model = nn.parallel.DistributedDataParallel(model)

# 이후 학습 루프에서 그대로 사용 가능

장점: DataParallel에 비해 성능이 우수하며, GPU 간의 통신 오버헤드가 적습니다. 대규모 분산 학습에 적합합니다.

단점: 설정이 조금 더 복잡하며, DDP에 맞춘 코드를 작성해야 할 수 있습니다.

3. PyTorch Lightning

PyTorch Lightning은 PyTorch 기반의 고수준 라이브러리로, 코드의 복잡성을 줄이고, Multi-GPU 학습을 포함한 여러 가지 학습 전략을 쉽게 구현할 수 있도록 도와줍니다.

3.1 PyTorch Lightning을 이용한 Multi-GPU 학습

PyTorch Lightning에서 Multi-GPU 학습을 위해 필요한 코드는 매우 간단합니다. 모델을 pl.LightningModule로 정의하고, 학습 시에 Trainergpus 인자를 설정하면 됩니다.

import pytorch_lightning as pl

class MyLightningModel(pl.LightningModule):
    def __init__(self):
        super(MyLightningModel, self).__init__()
        self.model = MyModel()

    def forward(self, x):
        return self.model(x)

    def training_step(self, batch, batch_idx):
        x, y = batch
        y_hat = self.model(x)
        loss = nn.functional.cross_entropy(y_hat, y)
        return loss

    def configure_optimizers(self):
        optimizer = torch.optim.Adam(self.parameters(), lr=1e-3)
        return optimizer

# 모델 정의
model = MyLightningModel()

# Trainer 정의 및 Multi-GPU 학습
trainer = pl.Trainer(gpus=4, accelerator='ddp')
trainer.fit(model, train_dataloader)

장점: 코드의 가독성과 유지보수성을 높여주며, 복잡한 학습 루프를 간결하게 작성할 수 있습니다.

단점: 기존 PyTorch 코드와 다소 다르기 때문에 처음에 익숙해지는 데 시간이 걸릴 수 있습니다.

4. Multi-GPU 학습 효율화

다중 GPU 학습의 효율성을 극대화하기 위해 고려해야 할 몇 가지 사항이 있습니다:

4.1 배치 크기 최적화

배치 크기는 각 GPU가 효율적으로 계산을 수행할 수 있도록 조정해야 합니다. 일반적으로 GPU의 메모리 용량에 따라 적절한 배치 크기를 설정해야 하며, 배치 크기를 늘리면 학습 속도가 빨라질 수 있습니다.

4.2 통신 오버헤드 최소화

GPU 간의 통신 오버헤드를 줄이기 위해 DistributedDataParallel을 사용하는 것이 좋습니다. 이 방법은 GPU 간의 동기화를 효과적으로 처리하며, 학습 속도를 높이는 데 유리합니다.

4.3 GPU 활용도 모니터링

학습 중에는 GPU의 사용률과 메모리 사용량을 모니터링하여 각 GPU가 최대한 효율적으로 사용되고 있는지 확인해야 합니다. 이 정보는 nvidia-smi 명령어를 사용하여 실시간으로 확인할 수 있습니다.

4.4 최적화 및 튜닝

PyTorch Lightning에서는 다양한 최적화 기법(예: 혼합 정밀도 학습, Gradient Clipping 등)을 쉽게 적용할 수 있습니다. 이를 통해 학습 속도를 더욱 향상시킬 수 있습니다.

Machine Learning Study Guide

1. 부캠에서 다루지 않는 Task들

부캠에서는 다루지 않는 몇 가지 중요한 주제들이 있습니다. 이 주제들은 별도로 공부해야 할 필요가 있습니다.

2. 새로운 분야에 접근하는 방법

새로운 연구 분야에 접근할 때는 Survey 논문을 읽는 것이 좋습니다.

3. 최신 논문 읽기

분야의 기본적인 이해가 잡힌 후에는, 검색을 통해 최신 논문을 읽는 것이 중요합니다.

논문 Review & Study 방법

컴퓨터 비전 분야 스터디

-> 일단은 기초를 다져야 할 시기! (주 1회 기준)

컴퓨터 비전 전반적인 모델에 대한 학습을 목표로 함. -> CNN 계열, RNN 계열, Transformer 모델

모델을 구현하고, 특정 데이터셋에 대해 성능을 낼 수 있도록 스터디 진행.

- https://kmhana.tistory.com/3
(조금 옛날 자료여서 논문들에 대한 중요도는 지금과는 많이 다름. 그냥 흐름에 대해서만 확인!)

논문의 구조

따라서 논문을 읽으면, 다음 항목들에 대해서는 안보고도 말할 수 있어야 함:

  1. 이 논문이 어떠한 문제를 인식했고 해결하려 했는지? (Motivation)
  2. 인식한 문제를 어떤 방식으로 해결 했는지? (Contribution) + 참신한지? (Novelty)
최신 트렌드를 팔로우 하는 방법

최신 트렌드를 팔로우 하는 방법