AI/딥러닝

[AI/DL] PyTorch로 딥러닝의 흐름 이해하기

깃짱 2025. 10. 24. 22:00
반응형

🌏 인트로

딥러닝(Deep Learning) 모델을 만들고 학습시키기 위한 오픈소스 라이브러리

NumPy + GPU + 자동미분 + 신경망 모듈을 합쳐 놓은 패키지

모듈 역할
torch 기본 수학 연산, Tensor(배열) 처리
torch.nn 신경망(Neural Network) 모델 구성용 모듈
torch.optim 최적화 알고리즘 (Adam, SGD 등)
torch.autograd 자동 미분 기능
torch.utils.data 데이터셋 관리, 배치 생성(DataLoader)
torchvision / torchaudio / torchtext 이미지, 오디오, 텍스트용 확장 라이브러리
torch.distributed 분산 학습용 라이브러리 (멀티 GPU, 멀티 서버)

🌏 PyTorch 전체 구조 한눈에 보기

PyTorch는 여러 하위 모듈로 구성되어 있으며,

각 모듈이 딥러닝 파이프라인의 한 단계를 담당한다.

데이터 준비 ─▶ 모델 설계 ─▶ 손실 계산 ─▶ 역전파 ─▶ 최적화 ─▶ 학습 반복
   ↑             ↑             ↑             ↑         ↑
torch.utils.data torch.nn torch.autograd torch.optim torch

🌏 torch: 기본 수학 연산, Tensor 처리

✅ 역할

  • NumPy와 거의 같은 기능*을 제공하지만 *GPU에서 연산 가능
  • Tensor 생성, 수학 연산, 브로드캐스팅, 난수 생성 등을 수행한다.

✅ 예시

import torch

# Tensor 생성
a = torch.tensor([[1, 2], [3, 4]], dtype=torch.float32)
b = torch.rand((2, 2))  # 0~1 사이 랜덤 값

# 기본 연산
print(a + b)
print(torch.matmul(a, b))  # 행렬 곱
print(a.mean(), a.std())   # 평균, 표준편차

# GPU 전송
a = a.to("cuda")

(참고)

GPU는 CPU가 시킨 계산만 수행하는 보조 연산 장치다.
즉, CPU → GPU에 연산 명령 전달 → GPU가 계산 → 결과를 다시 CPU로 반환 구조다.
GPU는 CPU 없이 혼자 동작할 수 없다.

🌏 torch.nn: 신경망(Neural Network) 구성 모듈

✅ 역할

  • 모델의 레이어(층)와 구조를 만드는 모듈
  • nn.Linear, nn.Conv2d, nn.LSTM 같은 “층”이 여기에 포함
  • 모든 모델은 nn.Module을 상속받아서 만든다.

✅ 예시

import torch.nn as nn

class SimpleNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(10, 64)  # 입력 10 → 은닉 64
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(64, 1)   # 은닉 64 → 출력 1

    def forward(self, x):
        x = self.relu(self.fc1(x))
        return self.fc2(x)

model = SimpleNet()

CNN, Transformer, Residual Block, Attention 등 모든 구조가 이 안에서 정의된다.

🌏 torch.optim: 최적화 알고리즘

✅ 역할

  • 모델의 파라미터(가중치)를 업데이트하는 알고리즘을 담당
  • Gradient Descent, Adam, RMSProp 등이 여기에 포함

✅ 예시

import torch.optim as optim

optimizer = optim.Adam(model.parameters(), lr=0.001)

for epoch in range(100):
    optimizer.zero_grad()     # 이전 gradient 초기화
    output = model(x)         # 순전파(forward)
    loss = criterion(output, y)
    loss.backward()           # 역전파(backward)
    optimizer.step()          # 가중치 업데이트

PyTorch는 Optimizer(최적화 알고리즘) 도 전부 구현해서 제공한다.

즉, 경사하강법(Gradient Descent) 계열 알고리즘을 직접 코딩할 필요 없이 torch.optim 모듈 안에서 바로 가져다 쓸 수 있다. (매우 편리~)

🌏 torch.autograd: 자동 미분 기능

✅ 역할

  • 딥러닝의 핵심인 역전파(backpropagation) 를 자동으로 수행
  • 모든 Tensor의 연산 과정을 추적하고, .backward() 호출 시 미분을 계산

✅ 예시

x = torch.tensor(2.0, requires_grad=True)
y = x ** 3 + 4 * x ** 2
y.backward()        # dy/dx 자동 계산
print(x.grad)       # 3x^2 + 8x = 3*(2^2)+8*2 = 28

학습 시 “오차를 역으로 전달해 가중치를 업데이트”하는 과정을 자동화해 PyTorch는 수식으로 미분을 쓸 필요가 없다.

🌏 torch.utils.data: 데이터 관리, 배치 생성

✅ 역할

  • Dataset과 DataLoader 클래스를 통해 데이터를 효율적으로 관리
  • 데이터를 batch 단위로 나누고, shuffle(섞기), 병렬 로딩 등을 수행

Dataset은 “데이터가 어디 있고, 어떻게 꺼낼지”를 정의하는 클래스로 PyTorch에게 데이터셋이 어떤 형태로 생겼는지 알려주는 설명서 역할을 한다.

DataLoader는 Dataset을 받아서 학습할 때 배치(batch) 단위로 잘라서 공급해준다. 배치 단위로 묶어주고 (batch_size), 순서를 섞어주고 (shuffle=True), 여러 CPU 스레드를 이용해 동시에 로딩(num_workers)까지 해준다.

✅ 예시

from torch.utils.data import Dataset, DataLoader

class MyDataset(Dataset):
    def __init__(self, X, y):
        self.X = X  # 입력 데이터
        self.y = y  # 라벨 (정답)

    def __len__(self):
        return len(self.X)  # 전체 데이터 개수

    def __getitem__(self, idx):
        # 인덱스로 접근했을 때 반환할 한 샘플
        return self.X[idx], self.y[idx]

dataset = MyDataset(x, y)
loader = DataLoader(dataset, batch_size=32, shuffle=True)

for batch_x, batch_y in loader:
    output = model(batch_x)

데이터셋이 커질수록 batch 단위 학습이 필수다. 이 모듈이 데이터를 효율적으로 GPU로 전달하는 역할을 한다.

이후에 나오는 학습 루프에서는 이런 식으로 Loader를 사용한다

for batch_x, batch_y in loader:
    output = model(batch_x)
    loss = criterion(output, batch_y)
    ...

🌏 torchvision, torchaudio, torchtext: 확장 라이브러리

✅ 역할

  • 각 도메인(이미지, 음성, 텍스트)에 특화된 도구를 제공
  • 미리 학습된 모델(pretrained models), 데이터셋, 전처리(transform)를 포함

유명한 모델이나 데이터셋은 torch에서 가져올 수 있다.

✅ 예시

from torchvision import datasets, transforms, models

# 이미지 전처리
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor()
])

# 데이터셋 불러오기
train_data = datasets.CIFAR10(root="./data", train=True, download=True, transform=transform)

# 미리 학습된 모델 불러오기
resnet = models.resnet18(pretrained=True)
  • torchvision: 이미지 분류, 객체 탐지, 세그멘테이션
  • torchaudio: 음성 인식, 음성 합성
  • torchtext: 자연어 처리, 토큰화, 임베딩

🌏 torch.distributed: 분산 학습

✅ 역할

  • 여러 GPU나 여러 서버에서 병렬 학습을 수행할 수 있게 하는 모듈
  • 대형 모델(LLM, Diffusion 등)을 학습할 때 필수

✅ 예시

import torch.distributed as dist

dist.init_process_group(backend='nccl')
# 모델 병렬화
model = torch.nn.parallel.DistributedDataParallel(model)

 

한 대의 GPU로는 감당이 안 되는 대규모 모델을 수십 대의 GPU에서 나눠서 학습시킬 때 사용한다.

 

 

 

 

도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
비밀댓글과 메일을 통해 오는 개인적인 질문은 받지 않고 있습니다. 꼭 공개댓글로 남겨주세요!

 

반응형