본문 바로가기
Artificial Intelligence/21. PyTorch

[PYTORCH] nn.Module 상속 시 super().__init__() 호출 필수 이유 2가지와 속성 에러 해결 방법 7가지

by Papa Martino V 2026. 3. 24.
728x90

nn.Module 상속
nn.Module 상속

 

파이토치(PyTorch)를 활용해 딥러닝 모델을 설계할 때 가장 먼저 작성하는 코드는 class MyModel(nn.Module):일 것입니다. 그리고 그 생성자 안에는 관습처럼 super().__init__()이 등장합니다. 많은 개발자들이 이를 단순한 파이썬의 문법적 절차로 치부하지만, 파이토치 프레임워크 내에서 이 한 줄이 생략되었을 때 발생하는 비극은 단순히 부모 클래스를 초기화하지 못하는 수준을 넘어섭니다. 모델의 파라미터가 등록되지 않거나, GPU 이동이 불가능해지는 등 프레임워크의 핵심 기능을 마비시키기 때문입니다. 본 가이드에서는 시니어 프레임워크 엔지니어의 관점에서 nn.Module의 내부 소스 코드를 해부하고, super().__init__()이 수행하는 '매직'과 이를 누락했을 때 발생하는 치명적인 에러를 해결하는 7가지 실전 시나리오를 제시합니다.


1. super().__init__()이 수행하는 내부 초기화의 결정적 차이

파이토치의 nn.Module은 단순한 클래스가 아니라 텐서와 서브 모듈을 관리하는 상태 관리 엔진입니다. super().__init__()을 호출하지 않으면 부모 클래스에 정의된 8가지 이상의 내부 딕셔너리가 생성되지 않습니다.

초기화 항목 super().__init__() 호출 시 호출 누락 시 (AttributeError 발생 원인)
_parameters 학습 가능한 가중치(Weights) 등록 가능 가중치 등록 시 AttributeError 발생
_modules nn.Linear 등 자식 모듈 관리 자식 모듈을 찾지 못해 순전파 불가능
_buffers BN의 이동평균 등 비학습 상태 저장 상태 저장 및 GPU 이동 불가
training 학습/추론 모드 스위칭 활성화 모드 변경(eval, train) 명령 무시됨
Hooks 전/후처리 훅 등록 시스템 준비 디버깅용 훅 등록 시스템 마비

2. 왜 반드시 이 순서여야 하는가? (독창적인 가치 분석)

  • __setattr__의 마법: 파이토치는 __setattr__을 오버라이딩하여, 사용자가 self.conv = nn.Conv2d(...)라고 쓰는 순간 이를 감지해 _modules 딕셔너리에 넣습니다. 이 딕셔너리가 super().__init__()에서 생성되지 않으면, 파이토치는 해당 객체가 모델의 일부인지 알 방법이 없습니다.
  • 재귀적 장치 이동(Device Transfer): model.to('cuda')를 호출할 때 파이토치는 내부 딕셔너리를 순회합니다. 초기화되지 않은 모델은 내부를 순회할 수 없어 GPU를 전혀 활용하지 못하게 됩니다.
  • 직렬화(Serialization): 모델 가중치를 저장하는 state_dict() 기능 역시 초기화 과정에서 생성된 관리 테이블을 기반으로 작동합니다.

3. 실무 해결을 위한 핵심 Sample Examples (7가지)

개발자가 실무에서 super().__init__()과 관련해 마주할 수 있는 문제들과 그에 대한 전문적인 해결 코드입니다.

Example 1: 표준적인 초기화 해결 방법

import torch.nn as nn

class StandardModel(nn.Module):
    def __init__(self):
        # 반드시 최상단에 위치하여 내부 딕셔너리를 먼저 생성해야 함
        super().__init__()
        self.layer = nn.Linear(10, 1)

    def forward(self, x):
        return self.layer(x)
    

Example 2: 누락 시 발생하는 AttributeError 해결

누락된 상태에서 nn.Linear를 할당하려 하면 다음과 같은 에러를 보게 됩니다: cannot assign module before nn.Module.__init__() call.

class ErrorModel(nn.Module):
    def __init__(self):
        # super().__init__() 누락
        self.fc = nn.Linear(10, 5) # 여기서 에러 발생

# 해결: super().__init__()을 추가하십시오.
    

Example 3: 다중 상속 상황에서의 초기화 해결

class Base(nn.Module):
    def __init__(self):
        super().__init__()

class ComplexModel(Base):
    def __init__(self):
        # 부모인 Base뿐만 아니라 nn.Module까지 체인을 통해 초기화됨
        super().__init__()
    

Example 4: 래퍼(Wrapper) 클래스 설계 시 해결

class ModuleWrapper(nn.Module):
    def __init__(self, original_module):
        super().__init__()
        # 내부 모듈로 등록하여 gradient flow 보장
        self.inner = original_module
    

Example 5: 파라미터 수동 등록 시 에러 해결

import torch

class CustomParamModel(nn.Module):
    def __init__(self):
        super().__init__()
        # 초기화가 되어 있어야 _parameters 딕셔너리에 안전하게 담김
        self.w = nn.Parameter(torch.randn(5, 5))
    

Example 6: 동적 모듈 생성(List/Dict) 시 해결

nn.ModuleList 등을 사용할 때도 기반 초기화는 필수입니다.

class DynamicModel(nn.Module):
    def __init__(self, num_layers):
        super().__init__()
        self.layers = nn.ModuleList([nn.Linear(10, 10) for _ in range(num_layers)])
    

Example 7: 초기화 순서에 따른 조건부 로직 해결

class ConditionalModel(nn.Module):
    def __init__(self, use_batchnorm=True):
        super().__init__() # 먼저 초기화 후
        if use_batchnorm: # 조건부로 모듈 등록
            self.bn = nn.BatchNorm1d(10)
    

4. 시니어의 조언: super(MyClass, self).__init__() 구식 표현에 대하여

많은 예제에서 super(MyModel, self).__init__()과 같은 Python 2 방식의 코드를 볼 수 있습니다. 최신 파이토치 환경(Python 3.x 이상)에서는 단순하게 super().__init__()으로 충분합니다. 가독성을 높이고 실수를 줄이려면 최신 문법을 따르되, 프레임워크가 내부적으로 self를 부모의 초기화 루틴에 전달하여 인스턴스 딕셔너리를 채우고 있다는 사실을 잊지 마십시오.


5. 결론 및 요약

파이토치에서 super().__init__()은 선택이 아닌 프레임워크와의 계약입니다.

  • 필수 이유 1: _parameters, _modules 등 내부 상태 관리 시스템을 활성화하기 위해.
  • 필수 이유 2: 가중치 등록, GPU 이동, 모델 저장을 가능하게 하는 프레임워크의 매직(Magic)을 실행하기 위해.
  • 해결책: 생성자의 가장 첫 줄에 반드시 호출하여 이후의 모듈 등록 과정에서 AttributeError가 발생하지 않도록 하십시오.

참조 및 출처 (Sources)

  • PyTorch GitHub Repository.
  • Official PyTorch Documentation: Extending torch.nn
  • "Deep Learning with PyTorch" (Eli Stevens et al., Manning Publications)
728x90