성능 개선 방법
- 모델 변경(성능이 좋은 모델로...)
- 데이터 변경(추가, 오류 확인, 증량)
- 하이퍼 파라미터 튜닝
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
Install Ray
print("Install ray")
!pip uninstall -y -q pyarrow
!pip install -q -U ray[tune]
!pip install -q ray[debug]
Tune을 사용할 때에는 2가지 progress로 나누어 생각하면 좋다
- Tuning의 목적 정하기 (종속변인)
- Hyper Parameter Tuning을 할 때에, 사용자가 정한 Objective가 존재해야 해당 값을 최대/최소화하는 값을 찾을 수 있다.
- 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 |