인공지능(AI) 훈련을 위해 강력한 서버 환경을 구축해야 합니다. 특히 대규모 데이터셋이나 복잡한 모델을 사용할 때는 하나의 GPU나 노드만으로는 충분하지 않을 수 있습니다. 이 글에서는 우분투 서버에서 다중 GPU 및 다중 노드를 활용한 분산 훈련을 설정하는 방법을 자세히 설명하겠습니다.
분산 훈련이란?
분산 훈련은 여러 개의 계산 자원을 사용하여 모델 훈련을 병렬로 수행하는 방법입니다. 이를 통해 훈련 시간을 단축하고, 더 많은 데이터를 처리할 수 있습니다. 분산 훈련은 다음과 같은 경우 유용합니다:
- 모델이 대규모 데이터셋을 필요로 할 때
- 모델이 복잡하여 훈련 시간이 오래 걸릴 때
- 훈련을 더 빠르게 완료하여 실험 주기를 단축하고 싶을 때
사전 준비 사항
우분투 서버에서 분산 훈련을 설정하기 위해서는 다음과 같은 준비가 필요합니다:
- 우분투 서버 설치
- CUDA 및 cuDNN 설치 – GPU 가속을 위해 필요
- Pytorch 또는 TensorFlow 같은 딥러닝 프레임워크 설치
- SSH 접속을 위한 설정
- 필요한 라이브러리 및 패키지 설치
1. 우분투 서버 설치
우분투 서버를 설치하고, SSH를 통해 접속합니다. 기본적인 시스템 업데이트를 진행합니다:
sudo apt update && sudo apt upgrade -y
2. CUDA 및 cuDNN 설치
GPU 가속을 위해 NVIDIA의 CUDA 및 cuDNN을 설치해야 합니다. NVIDIA의 공식 웹사이트에서 설치 방법을 확인하고, 필요한 패키지를 설치합니다. CUDA 설치 예시는 아래와 같습니다:
sudo apt install nvidia-cuda-toolkit
CUDA가 설치되면, cuDNN도 설치해야 합니다. CUDA Toolkit에 맞는 버전의 cuDNN을 NVIDIA에서 다운로드하여 설치합니다.
3. 딥러닝 프레임워크 설치
Pytorch와 TensorFlow 두 가지의 대표적인 딥러닝 프레임워크를 설치할 수 있습니다. 여기서는 Pytorch 예제를 소개하겠습니다:
pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113
4. SSH 설정
다중 노드를 사용할 경우, 서로의 노드에 SSH로 접속할 수 있어야 합니다. SSH 키를 생성하고, 클라이언트 노드의 퍼블릭 키를 각 서버 노드에 추가합니다:
ssh-keygen -t rsa
ssh-copy-id user@remote-server
5. 필요한 라이브러리 및 패키지 설치
기본적인 패키지를 설치한 후, 멀티 GPU를 활용하기 위한 패키지를 추가로 설치합니다. 가상환경을 사용하는 것이 좋습니다:
python -m venv venv
source venv/bin/activate
pip install -U pip setuptools
다중 GPU 및 다중 노드에서 분산 훈련 설정하기
이제 실제로 분산 훈련을 설정해 보겠습니다. Pytorch를 사용하여 다중 GPU에서 훈련하는 방법은 다음과 같습니다.
다중 GPU 훈련 설정 예제
Pytorch의 torch.nn.DataParallel
API를 사용하여 다중 GPU에서 모델을 훈련하는 방법입니다.
import torch
import torch.nn as nn
import torchvision.models as models
# 모델 정의
model = models.resnet50(pretrained=True)
model = nn.DataParallel(model) # 데이터 병렬 처리
model.to('cuda') # CUDA 디바이스로 이동
# 훈련 루프 (예시)
def train(model, dataloader, optimizer):
model.train()
for inputs, labels in dataloader:
inputs, labels = inputs.to('cuda'), labels.to('cuda')
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
다중 노드 훈련 설정 예제
다중 노드에서의 훈련은 torch.distributed
API를 사용하여 구현할 수 있습니다. 이를 위해 먼저 필요한 환경 변수를 설정합니다:
import os
import torch
import torch.distributed as dist
# hyperparameter
world_size = 2 # 총 노드 수
process_rank = int(os.environ['RANK']) # 현재 노드 번호
dist.init_process_group(backend='nccl', world_size=world_size, rank=process_rank)
# 모델 원격 초기화
model = models.resnet50(pretrained=True).to(process_rank)
model = nn.parallel.DistributedDataParallel(model, device_ids=[process_rank])
# 데이터로더 초기화
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)
train_loader = torch.utils.data.DataLoader(train_dataset, sampler=train_sampler)
훈련 스크립트 실행하기
훈련 과정에서 스크립트를 실행하기 위해서는 다음과 같은 명령어를 사용합니다:
python -m torch.distributed.launch --nproc_per_node=G --nnodes=N --node_rank=R train.py
여기서 G는 각 노드별 GPU 수, N은 총 노드 수, R은 현재 노드의 순번입니다.
성능 최적화
분산 훈련을 성공적으로 구현한 후, 성능을 향상시키기 위한 몇 가지 방법이 있습니다:
- Mixed Precision Training: FP16을 사용하여 메모리 사용량을 줄이고 훈련 속도를 향상시킬 수 있습니다.
- Gradient Accumulation: 큰 배치크기를 사용하기 어려운 경우, 여러 배치의 그래디언트를 누적하여 업데이트합니다.
- Improved Data Loading: DataLoader의
num_workers
를 조정하여 데이터 로딩 속도를 개선합니다.
결론
본 글에서는 우분투 서버를 구축하고, 다중 GPU 및 다중 노드에서 인공지능 모델의 분산 훈련을 설정하는 방법에 대해 설명하였습니다. 이러한 설정을 통해 보다 효율적으로 모델 훈련을 수행할 수 있습니다. 다양한 환경에서 실험해보며, 각 방법의 이점을 극대화해보세요.