국문과 유목민

[일일리포트] Day 09 본문

IT 견문록/2022_부스트캠프 AITech 3기(100일)

[일일리포트] Day 09

논곰 2022. 1. 26. 22:54

해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수는 없기에 핵심 이론과 코드를 요약해서 올리고 있기에 내용이 부족할 수 있습니다.

▶ Today I Learned (핵심 요약 정리)

Multi-GPU

 GPU를 여러 대 사용해서 학습을 진행하는 것을 의미한다. GPU를 얘기할 때, Node라는 것도 같이 말이 많이 나오는데 Node는 시스템 즉 1대의 컴퓨터를 의미한다. 따라서 Single Node Multi GPU라는 것은 한 대의 컴퓨터에 여러 개의 GPU를 사용한다는 의미이고, Multi Node Multi GPU는 여러 대의 컴퓨터에서 여러 개의 GPU를 사용하는 서버실과 같은 의미이다.

다중 GPU에 학습을 분산하는 두 가지 방법으로 Model Parallel(모델 나누기)와 Data Parallel(데이터 나누기)가 존재한다. 

  • ModelParallel: 모델 나누는 것은 AlexNet에서부터 사용된 방법이었지만, 모델의 병목 문제나 파이프라인 설정의 어려움 등으로 인해 모델 병렬화는 고난이도 난제였다.
  • DataParallel: 데이터를 GPU에 나눠서 할당한 후 결과의 평균을 취하는 방법이다. 미니 배치 수식과 유사하지만, 동시에 여러 GPU에서 계산이 수행하게 된다. DataParrel도 그냥 DataParrel과 DistributedDataParallel이 존재한다. DataParrel은 단일 프로세스에서 입력 데이터를 미니 배치 단위로 여러 GPU에 나눕니다. DistributedDataParallel은 독립적인 여러개의 프로세스를 생성해 개별 GPU에 할당합니다. DataParallel에 대한 조금 더 자세한 설명은 다음 사이트를 참조해보자.

Ray-Tune

 모델을 개선하는 방법에는 여러가지가 있다. 모델의 구조를 변경하는 방법, 데이터를 더 추가하는 방법, 하이퍼파라미터를 튜닝하는 방법 총 3가지가 있다. 그 중에서도 가장 성능향상을 기대할 수 있는 방법은 데이터를 추가하는 방법이다. 하지만 데이터를 추가하는 방법의 경우 현실적으로 힘든 경우가 많기에 이때 사용할 수 있는 방법이 바로 하이퍼 파라미터 튜닝이다. 

  • Hyper Parameter Tuning: 하이퍼 파라미터 튜닝의 방법으로, Grid-Search나 Random search의 방법이 존재했다. 하지만 최근에는 베이지안 기반의 기법들이 주도하기 시작했다고 한다. (ex BOHB-Bayesian Optimization and Hyperband)
  • Ray-Tune: Multi-node Multi-processing을 지원하며, ML/DL의 병렬 처리를 위해 개발된 모듈이다. 기본적으로 현재 분산병렬 ML/DL모듈의 표준이라고 한다. Hyperparameter Search를 위한 다양한 모듈을 제공한다. Ray-tune을 사용하려면 하이퍼 파라메터 값을 사용하는 변수를 함수화 해줘야 한다. 간단하게 Ray-Tune은 4가지 단계를 통해 하이퍼파라미터 세팅을 진행한다. 자세한 사용방법은 아래 링크를 참조
  1. config에 search_space 지정
  2. 학습 스케줄링 알고리즘 지정
  3. 결과 출력 양식 지정
  4. 병렬 처리 양식으로 학습 시행
# 설치방법
!pip install ray
!pip install tensorboardX # ray에서 사용하는 Tensorboard

def main(num_samples=10, max_num_epochs=10, gpus_per_trial=2):
    data_dir = os.path.abspath("./data")
    load_data(data_dir)
    config = {                 # [1] config에 search_space 지정
        "l1": tune.sample_from(lambda _: 2 ** np.random.randint(2, 9)),
        "l2": tune.sample_from(lambda _: 2 ** np.random.randint(2, 9)),
        "lr": tune.loguniform(1e-4, 1e-1),
        "batch_size": tune.choice([2, 4, 8, 16])
    }

    scheduler = ASHAScheduler( # [2] 학습 스케줄링 알고리즘 지정
        metric="loss",
        mode="min",
        max_t=max_num_epochs,
        grace_period=1,
        reduction_factor=2)
    reporter = CLIReporter (   # [3] 결과 출력 양식 지정
        # parameter_columns=["l1", "l2", "lr", "batch_size"], 
        metric_columns=["loss", "accuracy", "training_iteration"])
    

    result = tune.run(         # [4] 병렬 처리 양식으로 학습 시행
        partial(train_cifar, data_dir=data_dir),
        resources_per_trial={"cpu": 2, "gpu": gpus_per_trial},
        config=config,
        num_samples=num_samples,
        scheduler=scheduler,
        progress_reporter=reporter)

Trouble shooting

 이전에 파이토치 모델을 돌려봤을 때 가장 시간을 많이 쓰는 부분이 바로 Trouble shootting이 아닐까 생각한다. 그래서 해당 부분이 강의로 들어가 있어 꽤나 집중해서 들었다. 해당 강의에서 나왔던 에러 상황들은 추후 충분히 내가 겪을 수 있을 것이라고 생각이 들었다. 그런 의미에서 해당 파트는 별도의 포스팅(Pytorch Trobule Shooting )으로 다루었다.

▶ Review (생각)

 오늘은 심화과제도 다 끝내고 나머지 강의도 다 끝내서 뭔가 홀가분한 느낌인 것 같다. 오늘 들었던 강의는 당장에 사용하지는 않을 거 같은 느낌의 내용들이라고 느껴졌지만, 예전에 파이토치에 살짝 발을 담궈봤던 입장에서 나중에 사용하게 되는 부분들이라는 것을 알아 좀 집중해서 들었다. 그 중에서 특히, Trouble Shooting은 훗날 모델 작성 시간의 80%을 잡아먹게 될 부분이라는 생각에 더 집중해서 들었고, 별도로 포스팅을 해서 나중에 볼 수 있게 해뒀다.

 

 오늘 피어세션에서 많은 얘기가 오갔고, 새로운 것을 알게된 부분도 있고 심화과제를 풀면서 생각했던 부분도 있는데 해당 부분들은 내일 멘토링 이후에 제대로 정리해서 올리는 게 낫다는 생각을 했다. 그래서 내일은 피어세션과 멘토링 위주로 내용을 정리해볼 계획이다. 그리고 멘토님께서 추천해주셨던 사이트나 케글 코드 등을 좀 살펴볼 생각이고, 시간이 된다면 명절이기도 하니까 추천해주신 책도 찾아서 볼 계획이다. 뭔가 내일 강의랑 과제를 미리 끝내서 다른 공부를 할 수 있다는 (그래봤자 파이토치 공부) 생각에 설레는 것 같다. 

'IT 견문록 > 2022_부스트캠프 AITech 3기(100일)' 카테고리의 다른 글

[2주차] 학습 정리 및 회고  (1) 2022.01.28
[일일리포트] Day 10  (0) 2022.01.28
[일일리포트] Day 08  (0) 2022.01.26
[일일리포트] Day 07  (0) 2022.01.25
[일일리포트] Day 06  (0) 2022.01.24
Comments