
딥러닝 프로젝트의 연속성을 보장하는 PyTorch 모델 직렬화(Serialization)의 모든 것
1. 도입: 왜 확장자 구분이 중요한가?
PyTorch를 활용하여 딥러닝 모델을 학습시키다 보면, 결과물을 저장할 때 .pt 혹은 .pth 확장자를 마주하게 됩니다. 단순히 파일 이름의 끝자리가 다른 것이라 생각할 수 있지만, 이는 협업 프로젝트나 배포 환경에서 버전 관리와 데이터 무결성을 결정짓는 중요한 요소입니다. 본 가이드에서는 두 확장자의 기술적 배경과 실무에서 직면하는 저장 방식의 차이를 심도 있게 다룹니다.
2. .pth vs .pt 핵심 차이 분석
결론부터 말씀드리면, PyTorch 내부 로직에서 .pt와 .pth 사이의 기술적인 기능 차이는 없습니다. 둘 다 torch.save() 함수를 통해 생성되는 피클(Pickle) 기반의 직렬화 파일입니다. 하지만 커뮤니티와 관례에 따른 용도는 다음과 같이 구분됩니다.
| 구분 | .pt (PyTorch Tensor) | .pth (PyTorch Hierarchical) |
|---|---|---|
| 주요 용도 | 주로 단순 텐서(Tensor)나 모델 전체 저장 | 주로 state_dict(가중치) 저장 시 사용 |
| 인식률 | 공식 문서와 예제에서 범용적으로 사용 | 이전 버전의 PyTorch 라이브러리 관례 |
| 충돌 가능성 | 거의 없음 | Python의 Path 관련 라이브러리와 혼동 가능성 존재 |
| 권장 사항 | 최신 프로젝트 및 공식 배포용 권장 | 레거시 코드 유지보수 시 주로 발견 |
3. 실무자를 위한 모델 저장 및 로드 매커니즘
단순히 확장자를 고르는 것보다 중요한 것은 '무엇을' 저장하느냐입니다. PyTorch에서는 두 가지 방식을 지원합니다.
- 전체 모델 저장 (Full Model): 모델의 구조(Graph)와 가중치를 모두 저장합니다. 코드가 간결하지만, 모델 정의 클래스가 동일한 경로에 있어야 로드할 수 있다는 단점이 있습니다.
- state_dict 저장 (Recommended): 모델의 파라미터(Weights, Biases)만 딕셔너리 형태로 저장합니다. 가장 유연하고 권장되는 방식입니다.
4. 실무 적용 가능한 구체적 Example 7가지
Example 1: 표준적인 state_dict 저장 및 불러오기
가장 안전하게 .pt 확장자를 사용하여 가중치만 관리하는 방법입니다.
# 저장하기
torch.save(model.state_dict(), 'model_weights.pt')
# 불러오기
model = MyModel()
model.load_state_dict(torch.load('model_weights.pt'))
model.eval()
Example 2: 학습 중단 방지를 위한 체크포인트(Checkpoint) 통합 관리
에폭(Epoch), 옵티마이저 상태를 함께 저장하여 학습을 재개하는 해결 방법입니다.
checkpoint = {
'epoch': epoch,
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'loss': loss,
}
torch.save(checkpoint, 'checkpoint_epoch_10.pth')
Example 3: CPU 환경으로 모델 불러오기 (Device Mapping)
GPU에서 학습된 .pt 파일을 CPU 서버에서 서빙할 때 발생하는 오류 해결법입니다.
device = torch.device('cpu')
model.load_state_dict(torch.load('model.pt', map_location=device))
Example 4: 모델 전체 구조 저장하기 (Quick Prototype)
빠른 실험을 위해 클래스 구조까지 한 번에 저장하는 방법입니다.
# 주의: 이 방식은 클래스 정의 파일 위치가 바뀌면 에러가 발생함
torch.save(model, 'full_model.pt')
model = torch.load('full_model.pt')
Example 5: 가중치 파일에서 특정 레이어만 추출하기
전이 학습(Transfer Learning) 시 특정 레이어의 가중치만 재사용하는 기법입니다.
pretrained_dict = torch.load('pretrained.pt')
model_dict = model.state_dict()
# 매칭되는 키만 필터링
pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}
model_dict.update(pretrained_dict)
model.load_state_dict(model_dict)
Example 6: 대용량 모델을 위한 압축 저장 (Zipfile 기반)
PyTorch 1.6 버전 이후 기본 적용된 Zipfile 포맷을 활용한 효율적 관리 방법입니다.
# 최신 버전에서는 기본적으로 압축이 적용되나, 명시적으로 사용 가능
torch.save(model.state_dict(), 'model_compressed.pt', _use_new_zipfile_serialization=True)
Example 7: JIT Trace를 통한 TorchScript 변환 (.pt 사용)
Python 의존성을 제거하고 C++ 환경 등에서 실행하기 위한 직렬화 방법입니다.
example_input = torch.rand(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example_input)
traced_script_module.save("model_jit.pt")
5. SEO 최적화를 위한 핵심 요약
딥러닝 모델의 배포와 유지보수를 위해서는 .pt 확장자를 사용하고 state_dict 방식으로 저장하는 것이 현대적인 표준입니다. .pth는 여전히 널리 쓰이지만, 특정 라이브러리와의 이름 충돌 가능성을 배제하기 위해 신규 프로젝트에서는 .pt를 권장합니다.
6. 출처 및 참고 문헌
- PyTorch Official Documentation: Saving and Loading Models (pytorch.org)
- Python Pickle Module Security Guidelines (docs.python.org)
- Deep Learning Design Patterns by Andrew Ferlitsch
'Artificial Intelligence > 21. PyTorch' 카테고리의 다른 글
| [PYTORCH] 체크포인트(Checkpoint) 저장 및 불러오기 방법 7가지와 state_dict 차이 해결 (0) | 2026.04.04 |
|---|---|
| [PYTORCH] 모델 전체 저장 vs 가중치만 저장의 3가지 결정적 차이와 권장 방법 및 해결 전략 (0) | 2026.04.04 |
| [PYTORCH] 모델 학습 중 Loss NaN 발생 시 7가지 체크리스트와 즉시 해결 방법 (0) | 2026.04.04 |
| [PYTORCH] 오버피팅(Overfitting) 확인 및 해결을 위한 7가지 방지 방법과 차이 분석 (0) | 2026.04.04 |
| [PYTORCH] 다중 손실 함수(Multi-loss)를 효율적으로 합쳐서 역전파하는 3가지 방법과 해결 전략 (0) | 2026.04.04 |