ML(머신러닝) 처리 과정에서는 많은 연산 과정을 필요로 하는데, 이 때문에 많은 시간과 메모리를 필요로 한다. CPU가 단독으로 처리 과정들을 수행하기에는 버거워서 GPU나 TPU 그리고 이런 과정들에 특화된 NPU을 활용하기도 한다. 이런 Accelerator들을 동일 과정을 효과적으로 처리해준다.

Kaggle에서 기본적으로 제공하는 Accelerator의 종류에는 GPU T4 x2 GPU P100 TPU VM v3-8가 있다. Kaggle - Regression with a Crab Age Dataset에서 Fine-Tuning & Optimization 과정에서 시간이 너무 오래 걸리길래 GPU을 활용해서 해결해보기로 했다.

GPU을 이용하지 않은 경우(위)와 이용한 경우(아래)를 비교해보면 시간 측면에서 확연한 차이를 확인할 수 있다. 기존 1017.1s이었던 과정은 GPU을 이용해서 145.4s로 줄었는데 거의 85%의 시간 감소라 놀라웠다.

다만, 이런 GPU을 활용하기 위해서는 XGBoost 모델에 명시적으로 GPU을 사용하도록 설명을 해주어야 한다. Kaggle Accelerator 설명은 다음과 같다.

Turning on GPU T4 x2 will reduce the number of CPUs available and will only speed up image processing and neural networks.

##################################
# ----FINE-TUNE & OPTIMIZATION----
##################################

from sklearn.model_selection import RandomizedSearchCV

params = { 'max_depth': [7, 8, 9],
           'learning_rate': np.arange(0.005, 0.011, 0.001),
           'subsample': [0.6],
           'colsample_bytree': [0.8],
           'colsample_bylevel': [0.9],
           'gamma': [0, 1, 2, 3],
           'n_estimators': np.arange(100, 350, 50)}

xgbr = XGBRegressor(seed = 20, tree_method='gpu_hist')
clf = RandomizedSearchCV(estimator=xgbr,
                         param_distributions=params,
                         scoring='neg_mean_absolute_error',
                         n_iter=25,
                         verbose=1)
clf.fit(X_train_scaled, y_train)

print("Best parameters:", clf.best_params_)
print("Lowest MAE: ", -clf.best_score_)

예를 들어 Fine-tune & Optimzation과정에서 모델에 GPU을 활용하고 싶다면 xgbr = XGBRegressor(seed = 20, tree_method='gpu_hist') 처럼 gpu_hist parameter을 추가해줘야한다. XGBoost documentation 상에는 이 부분이 모호하게 적혀있어서 다른 사람들의 코드를 분석해가면서 알게 되었다.

Reference

  • https://www.kaggle.com/code/coolsciguy/xgboost-randomizedsearch-with-gpu-a-tutorial
  • https://www.kaggle.com/code/hamditarek/market-prediction-xgboost-with-gpu-fit-in-1min