[짤막] if __name__ == "__main__" :

Jeong SeongYun·2022년 8월 27일
0

짤막

목록 보기
14/16
post-thumbnail

pytorch 코드를 보시다 보면 아래와 같은 코드를 많이 보실 겁니다.

def main(config):
    logger = config.get_logger('train')

    # setup data_loader instances
    data_loader = config.init_obj('data_loader', module_data)
    valid_data_loader = data_loader.split_validation()

    # build model architecture, then print to console

...(생략)...

if __name__ == '__main__':
    args = argparse.ArgumentParser(description='PyTorch Template')
    args.add_argument('-c', '--config', default=None, type=str,
                      help='config file path (default: None)')
    args.add_argument('-r', '--resume', default=None, type=str,
                      help='path to latest checkpoint (default: None)')
    args.add_argument('-d', '--device', default=None, type=str,
                      help='indices of GPUs to enable (default: all)')

    # custom cli options to modify configuration from default values given in json file.
    CustomArgs = collections.namedtuple('CustomArgs', 'flags type target')
    options = [
        CustomArgs(['--lr', '--learning_rate'], type=float, target='optimizer;args;lr'),
        CustomArgs(['--bs', '--batch_size'], type=int, target='data_loader;args;batch_size')
    ]
    config = ConfigParser.from_args(args, options)
    main(config)

위의 코드는 Pytorch Template의 train.py의 일부로서, Project를 Module화 시켰을 때 train.py의 기능을 담은 코드입니다.

보시면 main() 함수에 config를 받아서 그 안에 있는 Parameter에 대한 정보들을 기반으로 모델 학습을 어떻게 진행할지에 대해 적어두었습니다.

뭐 main 함수야 이해 간다 치고... 아래를 보시면 이상한 녀석이 하나 있습니다.

if __name__ == '__main__':

__name__ 은 무엇이고 __main__은 또 뭘까요? 하나씩 예시와 함께 알아보겠습니다.

__name__

모듈의 이름이 저장되는 변수. import 됐을 때 해당 모듈의 이름이 들어간다.
단, Terminal에서 Interpreter로 직접 실행시킨 경우엔 __main__ 이 들어간다.

이 두 문장만 보고 이해 가시는 분도 있을 테지만.. 대부분은 ?? 이러실 겁니다.

예시를 함께 보시겠습니다.

check.py라는 이름의 파일을 만들어 주겠습니다.
그리고 그 파일에 아래의 코드를 입력하고 그대로 디버깅 시켜봅니다.

print('check 모듈 시작')
print('check 모듈의 __name__ : ', __name__)
print('check 모듈 끝')

Output
check 모듈 시작
check 모듈의 __name__ : __main__
check 모듈 끝

check 모듈을 단순히 실행 시켰을 때는 모듈의 __name__변수에 __main__이 담겨졌음을 확인할 수 있습니다.

그럼 __main__은 무슨 뜻일까요?

__main__

현재 파일이 "시작점" 인지 확인하는지 판단

그럼 이번에는 같은 폴더에 check2.py를 만들고 아래의 코드를 작성해줍니다.

import check

print('check2의 __name__ : ', __name__)

Output
check 모듈 시작
check 모듈의 __name__ : check
check 모듈 끝

check2의 __name__ : __main__

check Module이 import 되었으므로 당연하게도 check.py의 print() 구문들이 먼저 나오고 check2.py의 코드가 실행됩니다.

그러나 좀 달라진 점이라고 한다면 이제는 import 된 check.py의 __name__변수에 check가 들어오고,

check2.py의 __name__변수에 __main__ 이 들어왔습니다.

엥? 하는 마음에 적극적이신 분들은 check를 실행시켜 봅니다. 그럼...

check를 실행시켰더니 __main__ 으로 되어있는 것을 확인했죠.

즉, main은 현재 스크립트 파일이 "시작점"인지 확인합니다.

if __name__ == '__main__' :

__name__이 모듈의 이름을 담는 변수고, __main__ 은 실행된 파일이 전체 코드의 스크립트의 시작점인지 아닌지를 판단해주는 역할이라고 했습니다.

그럼 이제 아래의 코드가 무엇을 의미하는지는 알겠죠?

if __name__ == '__main__':

지금 디버깅 시킨 파일이 가장 처음에 실행되는 파일이면 if 문 아래의 코드를 실행시키라는 얘기입니다.

예를 들어 Terminal에

python train.py --batch_size 32 --epochs 100

이면
train.py를 실행시키고 안에 if문 아래에 있는 코드들을 실행시키죠.
예시로 이 포스트 가장 위에 있던

if __name__ == '__main__':
    args = argparse.ArgumentParser(description='PyTorch Template')
    args.add_argument('-c', '--config', default=None, type=str,
                      help='config file path (default: None)')
    args.add_argument('-r', '--resume', default=None, type=str,
                      help='path to latest checkpoint (default: None)')
    args.add_argument('-d', '--device', default=None, type=str,
                      help='indices of GPUs to enable (default: all)')

    # custom cli options to modify configuration from default values given in json file.
    CustomArgs = collections.namedtuple('CustomArgs', 'flags type target')
    options = [
        CustomArgs(['--lr', '--learning_rate'], type=float, target='optimizer;args;lr'),
        CustomArgs(['--bs', '--batch_size'], type=int, target='data_loader;args;batch_size')
    ]
    config = ConfigParser.from_args(args, options)
    main(config)

이 되겠습니다.

보면 argparse로 파라미터를 조정할 수 있게 해주고 그 정보들을 config 객체에 담은 다음 main() 함수를 실행시킵니다.

다음 포스트는 argparse에 대해 쓰는 것으로 해야겠네요.

아무튼 train.py를 실행시키면 if 문 아래에 있는 코드들이 실행되고,
main()함수가 실행될 수 있는 것입니다

그럼 프로젝트를 완성하고 나서 Terminal에 간단한 코드 입력만으로도 모델의 학습과 Inference까지 모두 가능한 것이죠.

이제 미간 안 찌뿌리고 코드 볼 수 있겠죠?

profile
물어보면 대답해줄 수 있는 데이터쟁이

0개의 댓글