Search
🔵

Pytorch Lightning 에서 라이트닝모듈을 구성하는 파이토치 모듈의 가중치를 학습 시에만 별도로 로드하는 방식 이해

프로젝트
🚀 prev note
♻️ prev note
🚀 next note
♻️ next note
16 more properties
라이트닝 프레임워크는 체크포인트로부터 모델 객체를 생성할 때 save_hyperparameter 로 저장되어 있는 값들 중 필요한 값들을 자동으로 생성자에 통과시켜 준다.
파이토치 모듈 클래스의 state_dict 멤버는 모델의 가중치를 포함하고 있다. 체크포인트는 이 state_dict 까지 모두 가지고 있다. 라이트닝모듈의 멤버 변수에 파이토치 모듈이 발견되면 자동으로 연동된다. 따라서 파이토치 모듈 객체의 가중치를 별도로 관리할 필요가 없다.
Transfer learning 을 위해 라이트닝모듈의 생성자에 파이토치 모듈 객체에 사용될 .pth 가중치 경로 인자를 뚫어 놓는 상황을 생각해 보자. 기본적으로 save_hyperparameter 은 생성자를 통해 넘어온 모든 인자들을 자동으로 체크포인트에 저장한다. 이러한 방식은 training phase 가 끝나고 체크포인트를 사용해 test phase 로 넘어가고자 하는 상황에서 문제가 생긴다. 생성자의 인자를 대신 통과시켜줄 때, 가중치 경로도 자동으로 체크포인트 파일로부터 가져오기 때문이다.
가중치를 가져오는 로직이 생성자와 연결되어 있고 .pth 가중치 파일 경로가 생성자를 통해 전달된다면, 체크포인트 파일을 통해 생성자를 실행할 때 파인튜닝 학습을 시작할 때 사용한 가중치를 불러오므로 가중치 파일을 언제나 학습 시 사용했던 위치에 두어야 한다.
물론 .pth 가중치 파일의 위치만 옮기지 않는다면 소스코드는 동작한다. 실질적으로 사용하는 가중치가 달라지지도 않는다. state_dict 를 체크포인트 가중치로부터 로드하는 일이 .pth 가중치 경로로부터 로드하는 일보다 늦게 일어나기 때문에, 어차피 파인튜닝 결과물인 체크포인트 가중치로 덮어써지기 때문이다. 하지만 어쨌든 이것은 우리가 의도한 동작이 아니다.
이런 복잡한 상황을 방지하려면 생성자에서 가중치를 로드하는 로직을 별도의 메소드로 작성해서, 학습 시에만 로드할 수 있도록 라이트닝 프레임워크의 생성자 로직에서 분리해 내는 것이 좋다.
parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료을 보관해 두는 영역입니다.
1.
None
from : 과거의 어떤 원자적 생각이 이 생각을 만들었는지 연결하고 설명합니다.
1.
앞의 글에서는 텐서보드와 관련하여 하이퍼파라미터를 관리하는 방법을 설명했다. 이 글에서는 학습과 평가 시 차이가 있는 대표적인 분기 중 하나인 가중치 로드 방식을 파이토치 라이트닝의 save_hyperparameter 메서드의 작동 방식과 연관지어 서술한다.
supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는지 연결합니다.
1.
None
opposite : 어떤 새로운 생각이 이 문서에 작성된 생각과 대조되는지 연결합니다.
1.
None
to : 이 문서에 작성된 생각이 어떤 생각으로 발전되거나 이어지는지를 작성하는 영역입니다.
1.
None
ref : 생각에 참고한 자료입니다.
1.
None