PyTorch
contents
1. 개요 (High-Level Overview)
파이토치는 주로 Meta AI (FAIR - Facebook AI Research) 가 개발하여 2016년에 출시한 오픈소스 머신러닝 라이브러리입니다. 2022년에는 특정 기업 종속성을 탈피하기 위해 리눅스 재단 산하의 PyTorch Foundation으로 이관되었습니다.
- 철학: "파이썬스럽다(Pythonic)." 표준 파이썬 프로그래밍(명령형 스타일)과 똑같이 느껴지도록 설계되어 직관적이며 디버깅이 쉽습니다.
- 주요 용도: 딥러닝, 컴퓨터 비전, 자연어 처리(NLP).
- 지배력: 학술 연구(Academic Research) 의 표준입니다. 최신 기술 논문(Transformers, Stable Diffusion 등)의 대부분이 파이토치로 먼저 공개됩니다.
2. 핵심 개념 ("무엇"인가)
파이토치는 n차원 텐서(Tensors) 와 자동 미분(Automatic Differentiation) 이라는 두 가지 기둥 위에 구축되었습니다.
A. 텐서 (Tensors)
텐서플로우와 마찬가지로 파이토치도 텐서를 사용합니다.
- NumPy와 유사한 다차원 배열입니다.
- 핵심 기능: GPU(NVIDIA의 경우 CUDA, Mac의 경우 MPS)를 통한 비동기 실행을 기본적으로 지원합니다.
- 상호 운용성: 메모리 복사 없이 NumPy 배열과 파이토치 텐서 간 전환이 가능합니다 (
torch.from_numpy()).
B. Autograd (마법 같은 기능)
신경망이 학습할 수 있게 해주는 엔진입니다.
- 자동 미분: 파이토치는 텐서에 수행하는 모든 연산을 기록하여 동적 그래프를 구축합니다.
- 역방향 누적 (Reverse-Mode Accumulation): 에러(손실, Loss)를 계산하고
.backward()를 호출하면, 파이토치는 이 그래프를 거꾸로 탐색하며 기울기(Gradients, 각 파라미터가 에러에 기여한 정도) 를 계산합니다. - 사용자 제어: 추론(Inference) 시 메모리를 아끼기 위해 이 기능을 끌 수 있습니다 (
with torch.no_grad():).
C. 동적 계산 그래프 (Dynamic Computational Graphs)
이것이 텐서플로우의 "정적 그래프"(TF 2.0은 이를 모방함)와 근본적으로 다른 점입니다.
- 정적 (구형 TF): 도로를 먼저 다 깔아놓고 차를 운전하는 방식입니다.
- 동적 (PyTorch): 운전하는 동시에 도로를 깝니다.
- 의미: 모델 구조 내부에서 표준 파이썬 제어문(
if,for,while)을 사용할 수 있습니다. 로직에 따라 매 반복(Iteration)마다 그래프의 모양이 바뀔 수 있습니다. 이는 순환 신경망(RNN)이나 길이가 변하는 입력을 처리할 때 매우 중요합니다.
3. 아키텍처 ("어떻게" 작동하는가)
파이토치는 두꺼운(기능이 많은) C++ 코어와 얇은(가벼운) 파이썬 래퍼(Wrapper)로 구성됩니다.
- 프론트엔드 (Python):
- 사용자가 사용하는 API입니다.
torch.nn(신경망),torch.optim(최적화)과 같은 클래스를 제공합니다. - 명령형(Imperative) 방식이므로, 에러가 발생하면 모호한 "그래프 실행 오류"가 아니라 실패한 파이썬 코드 라인을 정확히 지적해 줍니다.
- 사용자가 사용하는 API입니다.
- 내부 컴파일러 (JIT):
- 파이토치는 동적이지만, TorchScript라는 JIT(Just-In-Time) 컴파일러를 포함하고 있습니다. 이를 통해 동적인 파이썬 코드를 고성능 배포를 위한 정적 표현으로 고정(Freeze)할 수 있습니다.
- 백엔드 (LibTorch):
- 핵심 C++ 라이브러리입니다. 메모리 관리를 처리하고 하드웨어 드라이버(CUDA, cuDNN, MKL)와 상호작용합니다.
4. 생태계
파이토치는 모듈식입니다. 하나의 거대한 설치 파일 대신 도메인을 별도의 라이브러리로 나눕니다.
- TorchVision: 컴퓨터 비전을 위한 데이터셋, 변환 도구, 모델(ResNet, VGG 등).
- TorchText / TorchAudio: NLP 및 오디오 처리 라이브러리.
- PyTorch Lightning:
- 중요: 파이토치 코드는 (학습 루프를 수동으로 짜야 해서) 장황해질 수 있습니다. Lightning은 Keras와 유사한 래퍼(Wrapper)로, 코드를 구조화하고 학습 루프, 멀티 GPU 분산, 체크포인트 저장 등을 자동으로 처리해 줍니다.
- Hugging Face Transformers: 세계에서 가장 인기 있는 NLP 라이브러리는 주로 파이토치 위에 구축되어 있습니다.
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)용으로는 텐서플로우를 써라" 라고 말해왔습니다. 하지만 더 이상 전적으로 맞는 말은 아닙니다.
- TorchScript: 동적 파이썬 모델을 "추적(Trace)"하여 직렬화된 파일을 만들 수 있으며, 이는 파이썬이 설치되지 않은 C++ 환경에서도 실행 가능합니다.
- ONNX (Open Neural Network Exchange): 파이토치는 모델을 ONNX로 내보내는 것을 최우선으로 지원합니다. 이를 통해 NVIDIA TensorRT나 Microsoft의 ONNX Runtime 같은 특수 하드웨어에서 효율적으로 실행할 수 있습니다.
8. 요약: 개발자들이 파이토치를 선택하는 이유
장점
- 디버깅 용이성: 파이썬처럼 작동합니다. 쉐이프(Shape) 불일치가 발생하면, 에러 메시지가 정확히 어디가 문제인지 알려줍니다.
- 유연성: 학습 도중에 아키텍처를 변경하는 것(예: 동적 드롭아웃)이 매우 쉽습니다.
- 커뮤니티: 연구자들이 사용하기 때문에, 최신 모델(LLaMA, Stable Diffusion 등)은 텐서플로우로 포팅되기 몇 달 전에 파이토치로 먼저 나옵니다.
단점
- 상용구(Boilerplate) 코드: Keras에 비해 더 많은 코드(루프, 상태 관리 등)를 직접 작성해야 합니다.
- 모바일 지원: 개선되고 있지만, TF Lite에 비해 엣지 디바이스 최적화가 덜 되어 있고 조금 더 무겁습니다.
references