liminfo

PyTorch Reference

PyTorch 딥러닝 프레임워크 레퍼런스

41개 결과

PyTorch Reference 소개

PyTorch 레퍼런스는 PyTorch 딥러닝 프레임워크를 위한 체계적이고 검색 가능한 치트 시트입니다. 텐서, 자동미분, 신경망, 옵티마이저, 데이터, 학습, GPU, 저장/로드 등 8개 핵심 카테고리로 구성되어 있으며, 각 항목에는 설명과 실제 코드 예제가 포함되어 있어 신경망 모델을 구축하고 실험하는 데 실용적으로 활용할 수 있습니다.

PyTorch는 연구 분야의 선도적인 딥러닝 프레임워크로, 컴퓨터 비전, 자연어 처리, 강화학습, 과학 컴퓨팅 분야의 팀에서 널리 사용됩니다. 동적 계산 그래프(autograd)를 통해 유연한 모델 아키텍처와 쉬운 디버깅이 가능합니다. 이 레퍼런스는 텐서 생성과 DataLoader를 통한 데이터 로딩, nn.Module로 모델 정의, 손실 함수와 옵티마이저 선택, 학습/검증 루프 실행, 체크포인트 저장까지 전체 학습 워크플로를 다룹니다.

또한 CUDA 가용성 확인, 디바이스에 모델·텐서 이동, 멀티 GPU용 nn.DataParallel, GPU 메모리 모니터링, `autocast`와 `GradScaler`를 이용한 혼합 정밀도 학습 등 GPU 가속도 다룹니다. 데이터 섹션에는 커스텀 Dataset 클래스, torchvision transforms와 내장 데이터셋, 학습/검증 분할을 위한 random_split이 포함됩니다. 저장/로드 섹션에서는 권장되는 state_dict 방식과 학습 재개를 위한 체크포인트 저장·로드 패턴을 다룹니다.

주요 기능

  • 텐서·자동미분·신경망·옵티마이저·데이터·학습·GPU·저장/로드 8개 카테고리 수록
  • 텐서 생성: torch.tensor, zeros/ones, randn, arange — shape, dtype, device 조작 포함
  • 자동미분: requires_grad, backward(), zero_grad(), detach(), torch.no_grad() 컨텍스트 매니저
  • 네트워크 레이어: nn.Linear, nn.Conv2d, nn.LSTM, nn.BatchNorm2d, nn.Dropout, nn.Sequential
  • 옵티마이저: Adam과 SGD(모멘텀), StepLR 학습률 스케줄러
  • 데이터 파이프라인: 커스텀 Dataset, DataLoader(batch_size/shuffle), torchvision transforms
  • GPU: CUDA 가용성 확인, tensor.to(device), DataParallel, 혼합 정밀도(autocast + GradScaler)
  • 저장/로드: state_dict(권장), 전체 모델, 완전한 학습 체크포인트 패턴

자주 묻는 질문

PyTorch 텐서란 무엇이고 NumPy 배열과 어떻게 다른가요?

PyTorch 텐서는 NumPy ndarray와 유사한 다차원 배열이지만, 두 가지 핵심 차이가 있습니다. 첫째, 텐서는 GPU에서 실행되어 하드웨어 가속 연산이 가능합니다. 둘째, 텐서는 자동 미분(autograd)을 지원합니다. `torch.tensor()`, `torch.zeros()`, `torch.randn()` 등으로 생성하며 `.shape`, `.dtype`, `.device` 속성을 가집니다. `.to("cuda")`로 GPU로 이동할 수 있습니다.

PyTorch의 autograd는 어떻게 동작하나요?

`requires_grad=True`로 텐서를 생성하면 PyTorch는 모든 연산을 계산 그래프에 기록합니다. 스칼라 출력에서 `.backward()`를 호출하면 그래프를 역방향으로 순회하며 `requires_grad=True`인 모든 텐서의 그래디언트를 계산해 `.grad` 속성에 저장합니다. 학습 루프에서는 역전파 전에 `optimizer.zero_grad()`로 그래디언트를 초기화하고, `loss.backward()`로 역전파를 실행한 후 `optimizer.step()`으로 가중치를 업데이트합니다.

PyTorch에서 신경망을 어떻게 정의하나요?

`nn.Module`을 상속하는 클래스를 정의합니다. `__init__`에서 레이어를 속성으로 선언하고(예: `self.fc1 = nn.Linear(784, 256)`), `forward` 메서드에서 데이터가 레이어를 통과하는 방식을 정의합니다. 단순한 순차 구조에는 `nn.Sequential`이 편리합니다: `nn.Sequential(nn.Linear(784, 256), nn.ReLU(), nn.Linear(256, 10))`. 분기, 스킵 연결 등 비순차적 로직이 필요할 때는 커스텀 모듈이 필요합니다.

Adam과 SGD 옵티마이저의 차이는 무엇인가요?

SGD는 학습률 비율만큼 그래디언트를 빼서 가중치를 업데이트합니다. 모멘텀(`momentum=0.9`)을 추가하면 속도 벡터를 누적해 진동을 완화합니다. Adam은 그래디언트의 1차·2차 모멘트 추정치를 기반으로 파라미터별 적응 학습률을 유지합니다. Adam은 일반적으로 수렴이 빠르고 학습률 선택에 덜 민감해 좋은 기본값이 됩니다. SGD with momentum은 이미지 분류 태스크에서 일반화 성능이 더 좋을 수 있습니다.

PyTorch에서 데이터를 효율적으로 로드하려면 어떻게 하나요?

`Dataset`과 `DataLoader` 클래스를 사용합니다. `torch.utils.data.Dataset`을 상속하고 `__len__`과 `__getitem__`을 구현해 커스텀 Dataset을 만듭니다. 이를 `DataLoader`에 `batch_size`와 `shuffle=True`로 래핑합니다. 이미지 태스크에는 `torchvision.datasets`(MNIST, CIFAR10 등)과 `torchvision.transforms.Compose`로 전처리 단계를 연결해 사용합니다.

PyTorch 모델은 어떻게 저장하고 로드해야 하나요?

권장 방식은 state_dict(모델 가중치)만 저장하는 것입니다: `torch.save(model.state_dict(), "weights.pth")`. 로드할 때는 모델 아키텍처를 재생성하고 `model.load_state_dict(torch.load("weights.pth"))`를 호출한 뒤 추론을 위해 `model.eval()`을 실행합니다. 학습을 재개하기 위한 체크포인트에는 epoch, model state_dict, optimizer state_dict, loss를 딕셔너리로 저장합니다.

PyTorch에서 GPU 가속은 어떻게 사용하나요?

먼저 가용성을 확인합니다: `device = torch.device("cuda" if torch.cuda.is_available() else "cpu")`. 그런 다음 모델과 데이터를 디바이스로 이동합니다: `model.to(device)`, `data.to(device)`. 멀티 GPU 학습에는 `nn.DataParallel(model)`을 사용합니다. 혼합 정밀도 학습(속도 향상 및 메모리 절약)에는 순전파에 `torch.cuda.amp.autocast()` 컨텍스트와 역전파에 `GradScaler`를 사용합니다.

그래디언트 클리핑이란 무엇이고 언제 사용해야 하나요?

그래디언트 클리핑은 옵티마이저 스텝 전에 그래디언트 크기를 제한해 폭발 그래디언트 문제를 방지합니다. `loss.backward()` 이후, `optimizer.step()` 이전에 `torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)`을 사용합니다. 폭발 그래디언트는 긴 시퀀스를 학습할 때 여러 시간 단계에 걸쳐 그래디언트가 곱해지는 RNN, LSTM에서 흔히 발생합니다.