본문 바로가기

부스트캠프 AI Tech/Pytorch

[16] Hyperparameter Tuning

성능 개선 방법


  • 모델 변경(성능이 좋은 모델로...)
  • 데이터 변경(추가, 오류 확인, 증량)
  • 하이퍼 파라미터 튜닝

Hyperparameter Tuning


  • 모델 스스로 학습하지 않는 값으로 사람이 지정
    • learning rate, 모델의 크기, optimizer 등
    • 단, 요즘 이 하이퍼파라미터도 NAS(nueral architecture search)나 AutoML 등을 활용하여 선택 가능..
  • 하이퍼 파라미터에 의해서 값이 크게 좌우 될 때도 있음(요즘은 그닥 없음)
  • 마지막 0.01을 쥐어짜야 할 때 도전

grid search


  • 가장 기본적인 방법 - grid vs random
    • grid search : 특정 파라미터에 대해 몇 가지 탐색할 값들을 정해놓고 차례대로 확인
    • random search : 특정 범위 내에서 랜덤하게 파라미터 값 선택
    • 큰 범위에서 random search을 통해 성능이 잘 나오는 구간을 파악 후 grid search 진행
  • 최근에는 베이지안 기반 기법들이 주도
    • BOHB(bayesian optimization hyperband, 2018)

Ray Tune 사용하기


  • Multi-node multi processing 지원 모듈
  • ML/DL의 병렬 처리를 위해 개발된 모듈
  • 기본적으로 현재의 분산벙렬 ML/DL 모듈의 표준
  • Hyperparameter Search를 위해 다양한 모듈 제공
  • 사이트 참고
  • Search Algorithms (tune.suggest) — Ray 2.0.0.dev0
 

Search Algorithms (tune.suggest) — Ray 2.0.0.dev0

space (list[dict]) – Parameters in the experiment search space. Required elements in the dictionaries are: “name” (name of this parameter, string), “type” (type of the parameter: “range”, “fixed”, or “choice”, string), “bounds” fo

docs.ray.io

Install Ray

print("Install ray")
!pip uninstall -y -q pyarrow
!pip install -q -U ray[tune]
!pip install -q ray[debug]

Tune을 사용할 때에는 2가지 progress로 나누어 생각하면 좋다

  1. Tuning의 목적 정하기 (종속변인)
    • Hyper Parameter Tuning을 할 때에, 사용자가 정한 Objective가 존재해야 해당 값을 최대/최소화하는 값을 찾을 수 있다.
  2. Tuning할 Hyper Parameter 정하기 (조작변인, 통제변인)
    • 조작변인 : Epoch과 BatchSize, Learning Rate 등
    • 통제변인 : 모델 구조. ex) ImageNet Pretrained Resnet18, All Not-Freeze Fine Tuning

코드

from ray import tune

# config 설정
config_space = {
    "NUM_EPOCH" : tune.choice([4,5,6,7,8,9]),
    "LearningRate" : tune.uniform(0.0001, 0.001),
    "BatchSize" : tune.choice([32,64,128]),
}

'''
...
train model
...
'''

# epoch 종료후
tune.report(accuracy=best_test_accuracy.item(), loss=best_test_loss)

from ray.tune.suggest.hyperopt import HyperOptSearch

# accuracy를 max하는 것을 목표로 search
optim = HyperOptSearch(
    metric='accuracy',
    mode="max",
)

from ray.tune import CLIReporter
import ray

NUM_TRIAL = 10 # Hyper Parameter를 탐색할 때에, 실험을 최대 수행할 횟수를 지정

reporter = CLIReporter( # jupyter notebook을 사용하기 때문에 중간 수행 결과를 command line에 출력
    parameter_columns=["NUM_EPOCH", "LearningRate", "BatchSize"],
    metric_columns=["accuracy", "loss"])

ray.shutdown() # ray 초기화 후 실행

analysis = tune.run(
    training,
    config=config_space,
    search_alg=optim,
    #verbose=1,
    progress_reporter=reporter,
    num_samples=NUM_TRIAL,
    resources_per_trial={'gpu': 1}
)

# 결과출력
best_trial = analysis.get_best_trial('accuracy', 'max')
print(f"최고 성능 config : {best_trial.config}")
print(f"최고 test accuracy : {best_trial.last_result['accuracy']}")

'부스트캠프 AI Tech > Pytorch' 카테고리의 다른 글

[17] Troubleshooting  (0) 2022.01.24
[15] Multi-GPU 학습  (0) 2022.01.24
[14] monitoring tool - wandb  (0) 2022.01.24
[13] Monitoring tool - Tensorboard  (0) 2022.01.24
[12] 전이학습 tansfer learning  (0) 2022.01.24