https://pytorch.org/tutorials/beginner/saving_loading_models.html (영문)
https://tutorials.pytorch.kr/beginner/saving_loading_models.html (한글)
번역본보다 영문 설명흐름이 더 나은 듯
python의 pickle 사용하여 직렬화된 객체
1 를 디스크에 저장.cf. state_dict : 모델의 학습 중 학습되는 매개변수(ex) Weight, bias) - model.parameter( ) 로 접근 가능
사용 방법등은 본 사이트의 내용을 참고 (상단)
state_dict를 활용하는 방식을 권장하고 있음
전체 모델을 save/load 하는 방식
1. python의 pickle 모듈을 사용하여 전체모듈 을 저장(?)
첫번째 모듈 : 프로그래밍 에서 말하는 일반적인 모듈
두번째 모듈 :nn.Module ? 인건가첫번째랑 개념으로 쓴 것 같음
2. 직렬화된 데이터가(=모델) 모델 저장시 사용한 특정 클래스 및 디렉토리 경로(구조)에 얽매인다는 것이 단점
3. 이런 일이 발생하는 이유 : pickle이 model class 자체를 저장하지 못해서, 해당 클래스를 갖고 있는 파일로 가는 경로를 저장하기 때문.
4. 그래서, 다른 프로젝트에 사용되거나,refactor
2 이후에 code가 여러가지 방식으로 break될 수 있음
- 그래서, 전체 저장 방식이 훨씬 직관적이고 코드도 간단함에도 state_dict방식을 추천
Pickle | JSON, YAML |
---|---|
식별불가능, 전송효율 좋음 | 사람이 식별가능, 전송효율 떨어짐 |
주의
: pickle의 경우 파이썬 버젼별로 Pickle Protocol Version이 다름
따라서, 상위 버전에서 저장 -> 하위 버전에서 역직렬화 불가능
cf. 디버깅도 리팩토링으로 볼 수 있나? (x) --> 디버깅은 프로그램 동작이 변함
직렬화, 역직렬화 : https://rfriend.tistory.com/525
리팩토링 : https://jwprogramming.tistory.com/180