PyTorch를 C++에서 사용할 때 torch::jit::Module
등이 프로그램 종료 시 crash를 유발하는 이유는 무엇일까요? 그 중심엔 싱글톤(Singleton) 패턴과 전역 리소스 소멸 순서가 있습니다. 이 글에서는 싱글톤 개념부터 PyTorch의 내부 구조(libtorch), 그리고 crash 발생 원인까지 간결하게 정리합니다.
싱글톤 패턴은 프로그램 전체에서 하나의 인스턴스만 존재하도록 보장하는 설계 방식입니다. 어디서든 접근할 수 있으면서도 중복 생성을 방지하여 리소스 효율성과 일관성을 확보할 수 있습니다.
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
private:
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
PyTorch(C++ 라이브러리인 libtorch)는 내부적으로 다음과 같은 요소를 전역 리소스로 초기화합니다:
이들은 모두 싱글톤 구조로 구성되어 있으며, at::Tensor
, torch::jit::Module
같은 객체가 동작할 때 이 전역 리소스를 필요로 합니다.
Crash는 PyTorch 내부 전역 리소스의 소멸이 사용자 객체보다 먼저 발생할 때 발생합니다.
torch::jit::Module
같은 객체가 소멸되면서즉, 객체의 생명주기 관리 문제이며, 싱글톤의 단점 중 하나입니다.
한 줄 요약:
싱글톤은 유일한 전역 상태를 관리하는 데 효과적이지만, 종속성 관리 및 생명주기 통제가 어렵기 때문에 PyTorch(libTorch) 같은 프레임워크와 함께 사용할 때 주의가 필요합니다.