Jerry's Log

PyTorch

contents

1. 개요 (High-Level Overview)

파이토치는 주로 Meta AI (FAIR - Facebook AI Research) 가 개발하여 2016년에 출시한 오픈소스 머신러닝 라이브러리입니다. 2022년에는 특정 기업 종속성을 탈피하기 위해 리눅스 재단 산하의 PyTorch Foundation으로 이관되었습니다.


2. 핵심 개념 ("무엇"인가)

파이토치는 n차원 텐서(Tensors)자동 미분(Automatic Differentiation) 이라는 두 가지 기둥 위에 구축되었습니다.

A. 텐서 (Tensors)

텐서플로우와 마찬가지로 파이토치도 텐서를 사용합니다.

B. Autograd (마법 같은 기능)

신경망이 학습할 수 있게 해주는 엔진입니다.

C. 동적 계산 그래프 (Dynamic Computational Graphs)

이것이 텐서플로우의 "정적 그래프"(TF 2.0은 이를 모방함)와 근본적으로 다른 점입니다.


3. 아키텍처 ("어떻게" 작동하는가)

파이토치는 두꺼운(기능이 많은) C++ 코어와 얇은(가벼운) 파이썬 래퍼(Wrapper)로 구성됩니다.

  1. 프론트엔드 (Python):
    • 사용자가 사용하는 API입니다. torch.nn(신경망), torch.optim(최적화)과 같은 클래스를 제공합니다.
    • 명령형(Imperative) 방식이므로, 에러가 발생하면 모호한 "그래프 실행 오류"가 아니라 실패한 파이썬 코드 라인을 정확히 지적해 줍니다.
  2. 내부 컴파일러 (JIT):
    • 파이토치는 동적이지만, TorchScript라는 JIT(Just-In-Time) 컴파일러를 포함하고 있습니다. 이를 통해 동적인 파이썬 코드를 고성능 배포를 위한 정적 표현으로 고정(Freeze)할 수 있습니다.
  3. 백엔드 (LibTorch):
    • 핵심 C++ 라이브러리입니다. 메모리 관리를 처리하고 하드웨어 드라이버(CUDA, cuDNN, MKL)와 상호작용합니다.

4. 생태계

파이토치는 모듈식입니다. 하나의 거대한 설치 파일 대신 도메인을 별도의 라이브러리로 나눕니다.


5. 코드 예제 ("객체 지향" 스타일)

텐서플로우 예제와 얼마나 다른지 주목하세요. 파이토치에서는 객체 지향 프로그래밍(OOP)을 사용하여 클래스를 정의합니다.

import torch
import torch.nn as nn
import torch.optim as optim

# 1. 신경망을 클래스로 정의 (Java의 클래스 상속과 유사)
class SimpleNet(nn.Module):
    def __init__(self):
        super(SimpleNet, self).__init__()
        # 레이어 정의
        self.flatten = nn.Flatten()
        self.fc1 = nn.Linear(28*28, 128)  # 입력 -> 은닉
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(128, 10)     # 은닉 -> 출력

    # 데이터의 흐름 정의 (순전파, Forward Pass)
    def forward(self, x):
        x = self.flatten(x)
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        return x

# 2. 모델 인스턴스화 및 하드웨어 설정
device = "cuda" if torch.cuda.is_available() else "cpu"
model = SimpleNet().to(device)

# 3. 손실 함수 및 옵티마이저 정의
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 4. 수동 학습 루프 (파이토치의 특징)
# 텐서플로우/Keras에서는 이 부분이 model.fit() 안에 숨겨져 있음
def train(dataloader, model, loss_fn, optimizer):
    model.train()
    for batch, (X, y) in enumerate(dataloader):
        X, y = X.to(device), y.to(device)

        # A. 예측 계산
        pred = model(X)
        loss = loss_fn(pred, y)

        # B. 역전파 (Backpropagation - "마법의" 3단계)
        optimizer.zero_grad()   # 1. 이전 단계의 기울기 초기화
        loss.backward()         # 2. 새로운 기울기 계산
        optimizer.step()        # 3. 가중치(Weights) 업데이트

6. PyTorch vs. TensorFlow (다시 비교)

텐서플로우를 아신다는 가정하에 개념을 직접 번역해 보겠습니다.

기능 TensorFlow / Keras PyTorch
모델 정의 model = Sequential([...]) 또는 함수형 API class MyModel(nn.Module):
학습 model.fit() (고수준) for epoch in range... (수동 루프)
기울기 tf.GradientTape() loss.backward()
서빙 (배포) TensorFlow Serving (성숙함, 산업 표준) TorchServe (최신, 빠르게 발전 중)
모바일 TF Lite (매우 성숙함) PyTorch Mobile / Executorch (따라잡는 중)

7. 배포: "약점"의 해결

역사적으로 사람들은 "연구용으로는 파이토치, 실무(Production)용으로는 텐서플로우를 써라" 라고 말해왔습니다. 하지만 더 이상 전적으로 맞는 말은 아닙니다.


8. 요약: 개발자들이 파이토치를 선택하는 이유

장점

  1. 디버깅 용이성: 파이썬처럼 작동합니다. 쉐이프(Shape) 불일치가 발생하면, 에러 메시지가 정확히 어디가 문제인지 알려줍니다.
  2. 유연성: 학습 도중에 아키텍처를 변경하는 것(예: 동적 드롭아웃)이 매우 쉽습니다.
  3. 커뮤니티: 연구자들이 사용하기 때문에, 최신 모델(LLaMA, Stable Diffusion 등)은 텐서플로우로 포팅되기 몇 달 전에 파이토치로 먼저 나옵니다.

단점

  1. 상용구(Boilerplate) 코드: Keras에 비해 더 많은 코드(루프, 상태 관리 등)를 직접 작성해야 합니다.
  2. 모바일 지원: 개선되고 있지만, TF Lite에 비해 엣지 디바이스 최적화가 덜 되어 있고 조금 더 무겁습니다.

references