본문 바로가기
MLOps/Template

[pytorch] Template - CLI options (argparse) [5편]

by Finn# 2023. 7. 11.
728x90

argparse란?

 argparse는 프로그램에 필요한 인자를 User-friendly한 CLI로 쉽게 작성하도록 돕는 라이브러리이다.

위 라이브러리를 사용하여 CLI options을 정의하여 저장하면, CLI(shell) 환경에서 해당 명령어들을 통해 원하는 기능을 구현할 수 있다.

 

 Windows 환경이라 가정하고 정리해보자면 CMD를 통해 내가 작성한 프로그램에 기능을 정희하고 해당 기능을 실행하고 싶은데 이를 argparse 라이브러리를 활용하여 정의해주고 CLI 환경에서 간편하게 활용할 수 있게 도와준다고 이해하면 좋을 것 같다.


CLI options

CLI는 Command Line Interface의 약자로 shell에서 제공하는 text interface이자 UI이다.

이런 CLI는 보통 다음의 구조로 이해할 수 있다.

 

  1. command(명령어)
  2. flag( '-' or '--')
    • short : -a
    • long : --all
  3. argument(값 또는 노드)
[예시]
command + long flag
>>> ls --all

command + short flag
>>> ls -a

command + short flag + argument
>>> tar -f archive.tar

command + long flag + argument
>>> git log --pretty oneline

argparse의 동작 흐름

argparse는 크게 아래와 같은 흐름에서 동작한다.

  1. parser 생성
  2. parser에 flag argument 추가
  3. parser 저장 ( 변수에 할당 )

1. parser 생성

args = argparse.ArgumentParser(description='string')

 parser 생성은 argparse 라이브러리에서 제공하는 ArgumentParser() 모듈을 활용하여 생성합니다.

이때 아래 파라미터들을 사용하여 CLI 환경에서 앞으로 정의할 flag에 대한 설명과 프로그램에 대한 설명을 기술할 수 있습니다.

  • prog = '프로그램 이름'
  • description = '인자 도움말(help) 전에 기술될 내용)
  • epilog = '인자 도움말(help)이후에 기술될 내용)

 

2. parser에 flag arguments 추가

parser.add_argument('-d', '--device', required=T/F, default=value, type='데이터타입', 
		   help='인자 도움말(help) 시 출력할 내용')

 프로그램에 대한 frame을 interface를 만들었다면 실제로 사용할 flag를 정의하는 과정이 필요하다.

기본적으로 자주 사용되는 파라미터들에 대해서 소개하겠다.

  • short flag : '-d'
  • long flag : '--device'
  • required = 필수 flag 결정
  • type = 데이터 타입
  • default = 기본으로 넣을 값 설정
  • help = 인자도움말 호출 시 출력할 내용

 

3. parser 저장

parser.parse_args()

 add_argument() 함수를 통해서 정의한 flag 값에서 '선택인자'와 '위치인자'를 식별하는 용도로 parse_args를 사용할 수 있다.

해당 함수를 사용하면 기본적으로 name을 지정해주지 않을 경우 ( '--' ) 접두사를 제외한 단어를 위치인자로 식별하고 -나 --를 포함하여 선택인자로 식별하게 된다.

 

 이는 python 상에서 저장된 parser의 method로 arguments를 받아서 해당 인자에 저장된 내용을 호출하는 기능을 활용할 수 있다.

args.device

본 게시글에서 다루는 Template에서도 해당 개념이 활용되고 있으니 꼭 기억해두자. 기타 더 자세한 파라미터에 대해서 공부하고 싶다면 아래 reference를 참고바란다.


코드 정리

 - args 생성

import argparse

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)')

  parser를 사용할 때 CLI 환경에서 기본적으로 정의내린 부분들이 있는가하는 반면, 아래 option처럼 config.json 에서 설정해준 하이퍼 파라미터의 값을 할당시키기 위해 처리해준 코드부분도 살펴볼 수 있다.  이 코드에서 json의 구조를 'semicolon(;)'을 활용해서 target에 넣어주고 나중에 이를 split하여 사용하는 방식으로 접근하는 것이 신기했다.

 

- options 생성

    # 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)

- Config = ConfigParser(args, options)

    @classmethod
    def from_args(cls, args, options=''):
        """
        Initialize this class from some cli arguments. Used in train, test.
        """
        for opt in options:
            args.add_argument(*opt.flags, default=None, type=opt.type)
        if not isinstance(args, tuple):
            args = args.parse_args()

        if args.device is not None:
            os.environ["CUDA_VISIBLE_DEVICES"] = args.device
        if args.resume is not None:
            resume = Path(args.resume)
            cfg_fname = resume.parent / 'config.json'
        else:
            msg_no_cfg = "Configuration file need to be specified. Add '-c config.json', for example."
            assert args.config is not None, msg_no_cfg
            resume = None
            cfg_fname = Path(args.config)
        
        config = read_json(cfg_fname)
        if args.config and resume:
            # update new config for fine-tuning
            config.update(read_json(args.config))

        # parse custom cli options into dictionary
        modification = {opt.target : getattr(args, _get_opt_name(opt.flags)) for opt in options}
        return cls(config, resume, modification)

none과 같은 Singletone object에 대한 비교는 항상 is 나 is not 같은 연산자를 활용하여 이루어져아한다.


개념 정리

 

 코드를 해석해보면 다음과 같다. 먼저 Template의 train.py의 if__name__=='__main__' 구문 이하에서 argparse로 정의하던 내용이 parser_config.py의 ConfigParser.from_args 라는 정적메소드를 통해 최종적으로 저장되게 되고, 실제로 CLI를 통해 입력된 값들이 반영된 cls(config, resume, modification)이 train.py의 main함수에 들어가게 된다.

 

 이후 게시글에서 main함수에 대해 추가로 설명하겠지만, main함수에서는 추가로 CLI를 통해 정의한 Configuration이 없다면 앞서 정의했던 Config.json 파일에 근거하여 model에 필요한 파라미터를 받아오는 작업을 수행하고 미리 정의된 Trainer에 해당 파라미터들을 대입합으로써 모델을 학습시킨다.

 

 따라서 argparser 이후에는 실제 Configparser 작업으로 어떻게 모델에 필요한 데이터를 parsing하는지 ConfigParser 클래스를 뜯어보고, Base_Trainer -> Trainer 순으로 모델은 어떻게 학습되는지 살펴볼 예정이다.


Reference

https://supermemi.tistory.com/entry/%EB%A8%B8%EC%8B%A0-%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8%EC%97%90%EC%84%9C-argparse-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95-%EC%98%88%EC%A0%9C

 

[ python ] argparse 사용 방법. 예제.

[ python ] argparse 사용 방법. 예제. 머신러닝 모델의 하이퍼 파라미터를 쉽게 관리할 수 있다. 파이썬 3.7 기준 사용법 먼저, 다음과 같은 python file 을 만든다. import argparse # 인자값을 받을 수 있는 인

supermemi.tistory.com

 

https://velog.io/@jaeha0725/%ED%8A%B9%EC%A0%95-GPU-%EC%A7%80%EC%A0%95-os.environCUDAVISIBLEDEVICES

 

특정 GPU 지정 / os.environ["CUDA_VISIBLE_DEVICES"]

os.environ"CUDA_VISIBLE_DEVICES"= 사용하고자 하는 GPU이때 사용하고자 하는 GPU는0번 GPU의 경우 "0"1번 GPU의 경우 "1"0번 1번을 같이 쓰고 싶을 때는 "0,1"이런 식으로 지정해주면 된다.

velog.io


인스타 주소 🎗

https://www.instagram.com/f.inn_sharp/

반응형