PyTorch
Facebook PyTorch
Facebook의 딥러닝 프레임워크. 동적 계산 그래프. 연구 분야에서 가장 인기.
Facebook PyTorch
Facebook의 딥러닝 프레임워크. 동적 계산 그래프. 연구 분야에서 가장 인기.
PyTorch는 Facebook(현 Meta) AI Research 팀이 2016년에 공개한 오픈소스 딥러닝 프레임워크입니다. Python의 직관적인 문법과 NumPy 스타일의 텐서 연산을 결합하여, 기존 딥러닝 프레임워크의 복잡함을 크게 줄였습니다. "Pythonic"한 설계 철학 덕분에 연구자와 개발자 모두에게 빠르게 채택되어, 현재 학계에서 가장 인기 있는 딥러닝 프레임워크로 자리잡았습니다.
PyTorch의 핵심 특징은 동적 계산 그래프(Dynamic Computational Graph)입니다. TensorFlow 1.x가 정적 그래프를 사용해 먼저 전체 모델을 정의한 후 실행하는 방식이었다면, PyTorch는 코드가 실행될 때 즉시 그래프가 생성됩니다. 이를 "Define-by-Run" 방식이라고 하며, 디버깅이 쉽고 조건문이나 반복문을 자유롭게 사용할 수 있어 복잡한 모델 구현에 유리합니다. GPU 가속은 CUDA 백엔드를 통해 지원되며, `.to('cuda')` 한 줄로 텐서를 GPU에 올릴 수 있습니다.
PyTorch 생태계는 매우 풍부합니다. TorchVision(컴퓨터 비전), TorchText(자연어 처리), TorchAudio(음성 처리) 등 도메인별 라이브러리가 있고, Hugging Face Transformers의 기본 백엔드로 채택되어 LLM 시대에 더욱 중요해졌습니다. PyTorch Lightning은 학습 루프 보일러플레이트를 줄여주고, PyTorch Geometric은 그래프 신경망을, torchserve는 모델 서빙을 지원합니다. 2022년 PyTorch 2.0에서 도입된 `torch.compile()`은 모델을 자동 최적화하여 20-30% 속도 향상을 제공합니다.
프로덕션 환경에서 PyTorch 모델을 배포하는 방법도 다양합니다. TorchScript는 Python 의존성 없이 모델을 C++에서 실행할 수 있게 해주고, ONNX 형식으로 내보내 다른 프레임워크에서 추론할 수 있습니다. 최근에는 ExecuTorch가 등장하여 모바일 및 엣지 디바이스 배포를 간소화했습니다. 학습에서 배포까지 전 주기를 커버하는 완성도 높은 프레임워크로서, PyTorch는 AI/ML 엔지니어의 필수 기술이 되었습니다.
PyTorch로 간단한 신경망을 정의하고 학습하는 전체 파이프라인입니다:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
# 1. 디바이스 설정 (GPU 가용시 자동 사용)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")
# 2. 간단한 신경망 정의
class SimpleNet(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super().__init__()
self.layers = nn.Sequential(
nn.Linear(input_size, hidden_size),
nn.ReLU(),
nn.Dropout(0.2),
nn.Linear(hidden_size, hidden_size),
nn.ReLU(),
nn.Linear(hidden_size, num_classes)
)
def forward(self, x):
return self.layers(x)
# 3. 데이터 준비 (예시: 랜덤 데이터)
X = torch.randn(1000, 20) # 1000개 샘플, 20 features
y = torch.randint(0, 3, (1000,)) # 3 classes
dataset = TensorDataset(X, y)
train_loader = DataLoader(dataset, batch_size=32, shuffle=True)
# 4. 모델, 손실함수, 옵티마이저 설정
model = SimpleNet(input_size=20, hidden_size=64, num_classes=3).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 5. 학습 루프
for epoch in range(10):
model.train()
total_loss = 0
for batch_x, batch_y in train_loader:
batch_x, batch_y = batch_x.to(device), batch_y.to(device)
optimizer.zero_grad()
outputs = model(batch_x)
loss = criterion(outputs, batch_y)
loss.backward()
optimizer.step()
total_loss += loss.item()
print(f"Epoch {epoch+1}/10, Loss: {total_loss/len(train_loader):.4f}")
# 6. 추론
model.eval()
with torch.no_grad():
sample = torch.randn(1, 20).to(device)
prediction = model(sample)
predicted_class = prediction.argmax(dim=1).item()
print(f"Predicted class: {predicted_class}")
# 7. 모델 저장 및 로드
torch.save(model.state_dict(), "model.pt")
# 로드: model.load_state_dict(torch.load("model.pt"))
# 8. PyTorch 2.0 torch.compile() 최적화 (선택적)
# compiled_model = torch.compile(model) # 20-30% 속도 향상
PyTorch Lightning으로 더 깔끔하게 구현하는 방법:
import pytorch_lightning as pl
from torch.utils.data import DataLoader
class LitModel(pl.LightningModule):
def __init__(self):
super().__init__()
self.model = SimpleNet(20, 64, 3)
self.criterion = nn.CrossEntropyLoss()
def training_step(self, batch, batch_idx):
x, y = batch
logits = self.model(x)
loss = self.criterion(logits, y)
self.log("train_loss", loss, prog_bar=True)
return loss
def configure_optimizers(self):
return optim.Adam(self.parameters(), lr=0.001)
# 학습 (GPU/TPU 자동 지원, 체크포인트 자동 저장)
trainer = pl.Trainer(max_epochs=10, accelerator="auto")
trainer.fit(LitModel(), train_dataloaders=train_loader)
| 항목 | 요구사항 / 비용 |
|---|---|
| 라이선스 | BSD-3-Clause (완전 무료, 상업적 사용 가능) |
| CPU 학습 | 가능 (소규모 모델/데이터셋) |
| GPU 권장 (Vision) | RTX 3060 이상 (8GB VRAM) |
| GPU 권장 (LLM) | RTX 4090 / A100 (24-80GB VRAM) |
| 클라우드 비용 (A100) | $1.5~3/hr (AWS, GCP, Azure) |
| 클라우드 비용 (RTX 4090) | $0.4~0.8/hr (Lambda Labs, Vast.ai) |
| Apple Silicon | MPS 백엔드 지원 (M1/M2/M3) |
Tip: 학습 비용 절감을 위해 Mixed Precision (fp16/bf16), Gradient Checkpointing, 그리고 DeepSpeed/FSDP 분산 학습을 활용하세요. Google Colab 무료 티어도 간단한 실험에 충분합니다.
"이번 프로젝트는 PyTorch로 진행하려고 합니다. Hugging Face 모델들이 기본으로 PyTorch 지원하고, 팀원들도 익숙해서 온보딩 비용이 적을 것 같아요."
"PyTorch의 동적 계산 그래프 덕분에 디버깅할 때 일반 Python처럼 breakpoint 찍고 텐서 shape 확인할 수 있어서 개발 생산성이 높습니다. 2.0의 torch.compile()로 production 성능도 많이 개선됐습니다."
"대규모 모델 학습할 때 PyTorch FSDP가 DeepSpeed 대비 설정이 간단합니다. 다만 메모리 프로파일링은 torch.cuda.memory_stats()보다 Nsight Systems가 더 정확해요."