CPU เร็วกว่า GPU โดยใช้ xgb และ XGBclassifier

Aug 17 2020

ฉันต้องขออภัยล่วงหน้าเนื่องจากฉันเป็นมือใหม่ ฉันกำลังลองทดสอบ GPU กับ CPU กับ XGBoost โดยใช้ xgb และ XGBclassifier ผลลัพธ์มีดังนี้:

   passed time with xgb (gpu): 0.390s
   passed time with XGBClassifier (gpu): 0.465s
   passed time with xgb (cpu): 0.412s
   passed time with XGBClassifier (cpu): 0.421s

ฉันสงสัยว่าทำไม CPU ถึงทำงานได้ดีถ้าไม่ดีกว่า GPU นี่คือการตั้งค่าของฉัน:

  • Python 3.6.1
  • ระบบปฏิบัติการ: Windows 10 64bit
  • GPU: NVIDIA RTX 2070 Super 8gb vram (ไดรเวอร์อัปเดตเป็นเวอร์ชันล่าสุด)
  • ติดตั้ง CUDA 10.1 แล้ว
  • ซีพียู i7 10700 2.9Ghz
  • ทำงานบน Jupyter Notebook
  • ติดตั้ง xgboost 1.2.0 ทุกคืนผ่าน pip

** ยังได้ลองใช้ xgboost เวอร์ชันที่ติดตั้งจากวงล้อไบนารีที่สร้างไว้ล่วงหน้าโดยใช้ pip: ปัญหาเดียวกัน

นี่คือรหัสทดสอบที่ฉันใช้ (ยกมาจากที่นี่ ):

param = {'max_depth':5, 'objective':'binary:logistic', 'subsample':0.8, 
              'colsample_bytree':0.8, 'eta':0.5, 'min_child_weight':1,
              'tree_method':'gpu_hist'
              }

num_round = 100

dtrain = xgb.DMatrix(X_train2, y_train)
tic = time.time()
model = xgb.train(param, dtrain, num_round)
print('passed time with xgb (gpu): %.3fs'%(time.time()-tic))

xgb_param = {'max_depth':5, 'objective':'binary:logistic', 'subsample':0.8, 
         'colsample_bytree':0.8, 'learning_rate':0.5, 'min_child_weight':1,
         'tree_method':'gpu_hist'}
model = xgb.XGBClassifier(**xgb_param)
tic = time.time()
model.fit(X_train2, y_train)
print('passed time with XGBClassifier (gpu): %.3fs'%(time.time()-tic))

param = {'max_depth':5, 'objective':'binary:logistic', 'subsample':0.8, 
         'colsample_bytree':0.8, 'eta':0.5, 'min_child_weight':1,
         'tree_method':'hist'}
num_round = 100

dtrain = xgb.DMatrix(X_train2, y_train)
tic = time.time()
model = xgb.train(param, dtrain, num_round)
print('passed time with xgb (cpu): %.3fs'%(time.time()-tic))

xgb_param = {'max_depth':5, 'objective':'binary:logistic', 'subsample':0.8, 
         'colsample_bytree':0.8, 'learning_rate':0.5, 'min_child_weight':1,
         'tree_method':'hist'}
model = xgb.XGBClassifier(**xgb_param)
tic = time.time()
model.fit(X_train2, y_train)
print('passed time with XGBClassifier (cpu): %.3fs'%(time.time()-tic))

ฉันได้ลองรวมการค้นหากริด Sklearn เพื่อดูว่าฉันจะได้รับความเร็วที่เร็วขึ้นบน GPU หรือไม่ แต่มันก็ช้ากว่า CPU มาก:

passed time with XGBClassifier (gpu): 2457.510s
Best parameter (CV score=0.490):
{'xgbclass__alpha': 100, 'xgbclass__eta': 0.01, 'xgbclass__gamma': 0.2, 'xgbclass__max_depth': 5, 'xgbclass__n_estimators': 100}


passed time with XGBClassifier (cpu): 383.662s
Best parameter (CV score=0.487):
{'xgbclass__alpha': 100, 'xgbclass__eta': 0.1, 'xgbclass__gamma': 0.2, 'xgbclass__max_depth': 2, 'xgbclass__n_estimators': 20}

ฉันใช้ชุดข้อมูลที่มีการสังเกตการณ์ 75k มีความคิดว่าทำไมฉันถึงไม่ได้รับการเร่งความเร็วจากการใช้ GPU? ชุดข้อมูลเล็กเกินไปที่จะได้รับประโยชน์จากการใช้ GPU หรือไม่

ความช่วยเหลือใด ๆ จะได้รับการชื่นชมมาก ขอบคุณมาก!

คำตอบ

6 wundermahn Jan 11 2021 at 19:47

คำถามที่น่าสนใจ เช่นเดียวกับที่คุณทราบมีตัวอย่างบางส่วนที่ระบุไว้ใน Github และอย่างเป็นทางการxgboost site:

  • https://github.com/dmlc/xgboost/issues/2819
  • https://discuss.xgboost.ai/t/no-gpu-usage-when-using-gpu-hist/532

นอกจากนี้ยังมีคนอื่น ๆ ที่โพสต์คำถามที่คล้ายกัน:

  • ไม่มีการเร่งความเร็วโดยใช้ XGBClassifier ที่รองรับ GPU

มองไปที่อย่างเป็นทางการxgboostเอกสาร , มีส่วนอย่างกว้างขวางในการสนับสนุน GPU

มีบางสิ่งที่ต้องตรวจสอบ เอกสารประกอบบันทึกว่า:

การสร้างต้นไม้ (การฝึกอบรม) และการทำนายสามารถเร่งได้ด้วย GPU ที่รองรับ CUDA

1. GPU CUDA ของคุณเปิดใช้งานอยู่หรือไม่?

ใช่มันเป็น

2. คุณใช้พารามิเตอร์ที่อาจได้รับผลกระทบจากการใช้งาน GPU หรือไม่?

โปรดทราบว่ามีเพียงพารามิเตอร์บางตัวเท่านั้นที่ได้รับประโยชน์จากการใช้ GPU นั่นคือ:

ใช่คุณเป็น สิ่งเหล่านี้ส่วนใหญ่รวมอยู่ในชุดไฮเปอร์พารามิเตอร์ซึ่งเป็นสิ่งที่ดี

{subsample, sampling_method, colsample_bytree, colsample_bylevel, max_bin, gamma, gpu_id, predictor, grow_policy, monotone_constraints, interaction_constraints, single_precision_histogram}

3. คุณกำหนดค่าพารามิเตอร์เพื่อใช้รองรับ GPU หรือไม่?

หากคุณดูที่หน้าพารามิเตอร์ XGBoostคุณจะพบพื้นที่เพิ่มเติมที่อาจช่วยปรับปรุงเวลาของคุณได้ ตัวอย่างเช่นupdaterสามารถตั้งค่าเป็นgrow_gpu_histซึ่ง (หมายเหตุนี่คือการสงสัยเนื่องจากคุณได้tree_methodตั้งค่าไว้ แต่สำหรับบันทึกย่อ):

grow_gpu_hist: ปลูกต้นไม้ด้วย GPU

ที่ด้านล่างของหน้าพารามิเตอร์มีพารามิเตอร์เพิ่มเติมสำหรับgpu_histเปิดใช้งานโดยเฉพาะdeterministic_histogram(โปรดทราบว่านี่คือการสงสัยเนื่องจากค่าเริ่มต้นนี้เป็นTrue):

สร้างฮิสโตแกรมบน GPU อย่างกำหนด การสร้างฮิสโตแกรมไม่ได้ถูกกำหนดเนื่องจากลักษณะที่ไม่เชื่อมโยงของการสรุปจุดลอยตัว เราใช้กิจวัตรก่อนการปัดเศษเพื่อลดปัญหาซึ่งอาจทำให้ความแม่นยำลดลงเล็กน้อย ตั้งค่าเป็นเท็จเพื่อปิดใช้งาน

4. ข้อมูล

ฉันทำการทดลองที่น่าสนใจกับข้อมูลบางอย่าง เนื่องจากผมไม่ได้มีการเข้าถึงข้อมูลของคุณผมใช้sklearn's make_classificationซึ่งจะสร้างข้อมูลในทางที่ค่อนข้างแข็งแกร่ง

ฉันได้ทำการเปลี่ยนแปลงสคริปต์ของคุณเล็กน้อย แต่ไม่สังเกตเห็นการเปลี่ยนแปลง: ฉันเปลี่ยนไฮเปอร์พารามิเตอร์ในตัวอย่าง gpu เทียบกับ cpu ฉันวิ่ง 100 ครั้งและได้ผลลัพธ์เฉลี่ย ฯลฯ ดูเหมือนว่าฉันจะไม่มีอะไรโดดเด่น ฉันจำได้ว่าครั้งหนึ่งฉันเคยใช้XGBoostความสามารถของ GPU เทียบกับ CPU เพื่อเพิ่มความเร็วในการวิเคราะห์บางอย่างอย่างไรก็ตามฉันกำลังทำงานกับชุดข้อมูลที่ใหญ่กว่ามาก

ฉันแก้ไขสคริปต์ของคุณเล็กน้อยเพื่อใช้ข้อมูลนี้และเริ่มเปลี่ยนจำนวนsamplesและfeaturesในชุดข้อมูล (ผ่านn_samplesและn_featuresพารามิเตอร์) เพื่อสังเกตผลกระทบบนรันไทม์ ดูเหมือนว่า GPU จะช่วยปรับปรุงเวลาในการฝึกอบรมสำหรับข้อมูลมิติสูงได้อย่างมีนัยสำคัญแต่ข้อมูลจำนวนมากที่มีตัวอย่างจำนวนมากไม่ได้รับการปรับปรุงอย่างมาก ดูสคริปต์ของฉันด้านล่าง:

import xgboost as xgb, numpy, time
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

xgb_gpu = []
xgbclassifier_gpu = []
xgb_cpu = []
xgbclassifier_cpu = []

n_samples = 75000
n_features = 500

for i in range(len(10)):
    n_samples += 10000
    n_features += 300
    # Make my own data since I do not have the data from the SO question
    X_train2, y_train = make_classification(n_samples=n_samples, n_features=n_features*0.9, n_informative=n_features*0.1,
                                            n_redundant=100, flip_y=0.10, random_state=8)

    # Keep script from OP intact
    param = {'max_depth':5, 'objective':'binary:logistic', 'subsample':0.8, 
                'colsample_bytree':0.8, 'eta':0.5, 'min_child_weight':1,
                'tree_method':'gpu_hist', 'gpu_id': 0
                }
    num_round = 100

    dtrain = xgb.DMatrix(X_train2, y_train)
    tic = time.time()
    model = xgb.train(param, dtrain, num_round)
    print('passed time with xgb (gpu): %.3fs'%(time.time()-tic))
    xgb_gpu.append(time.time()-tic)

    xgb_param = {'max_depth':5, 'objective':'binary:logistic', 'subsample':0.8, 
            'colsample_bytree':0.8, 'learning_rate':0.5, 'min_child_weight':1,
            'tree_method':'gpu_hist', 'gpu_id':0}
    model = xgb.XGBClassifier(**xgb_param)
    tic = time.time()
    model.fit(X_train2, y_train)
    print('passed time with XGBClassifier (gpu): %.3fs'%(time.time()-tic))
    xgbclassifier_gpu.append(time.time()-tic)

    param = {'max_depth':5, 'objective':'binary:logistic', 'subsample':0.8, 
            'colsample_bytree':0.8, 'eta':0.5, 'min_child_weight':1,
            'tree_method':'hist'}
    num_round = 100

    dtrain = xgb.DMatrix(X_train2, y_train)
    tic = time.time()
    model = xgb.train(param, dtrain, num_round)
    print('passed time with xgb (cpu): %.3fs'%(time.time()-tic))
    xgb_cpu.append(time.time()-tic)
    xgb_param = {'max_depth':5, 'objective':'binary:logistic', 'subsample':0.8, 
            'colsample_bytree':0.8, 'learning_rate':0.5, 'min_child_weight':1,
            'tree_method':'hist'}
    model = xgb.XGBClassifier(**xgb_param)
    tic = time.time()
    model.fit(X_train2, y_train)
    print('passed time with XGBClassifier (cpu): %.3fs'%(time.time()-tic))
    xgbclassifier_cpu.append(time.time()-tic)

import pandas as pd
df = pd.DataFrame({'XGB GPU': xgb_gpu, 'XGBClassifier GPU': xgbclassifier_gpu, 'XGB CPU': xgb_cpu, 'XGBClassifier CPU': xgbclassifier_cpu})
#df.to_csv('both_results.csv')

ฉันเรียกใช้การเปลี่ยนแปลงนี้ (ตัวอย่างคุณสมบัติ) แยกกันและรวมกันบนชุดข้อมูลเดียวกัน ดูผลลัพธ์ด้านล่าง:

| Interval |  XGB GPU | XGBClassifier GPU |  XGB CPU | XGBClassifier CPU |      Metric      |
|:--------:|:--------:|:-----------------:|:--------:|:-----------------:|:----------------:|
|     0    |  11.3801 |      12.00785     | 15.20124 |      15.48131     | Changed Features |
|     1    | 15.67674 |      16.85668     | 20.63819 |      22.12265     | Changed Features |
|     2    | 18.76029 |      20.39844     | 33.23108 |      32.29926     | Changed Features |
|     3    |  23.147  |      24.91953     | 47.65588 |      44.76052     | Changed Features |
|     4    | 27.42542 |      29.48186     | 50.76428 |      55.88155     | Changed Features |
|     5    | 30.78596 |      33.03594     |  71.4733 |      67.24275     | Changed Features |
|     6    | 35.03331 |      37.74951     | 77.68997 |      75.61216     | Changed Features |
|     7    | 39.13849 |      42.17049     | 82.95307 |      85.83364     | Changed Features |
|     8    | 42.55439 |      45.90751     | 92.33368 |      96.72809     | Changed Features |
|     9    | 46.89023 |      50.57919     | 105.8298 |      107.3893     | Changed Features |
|     0    | 7.013227 |      7.303488     | 6.998254 |      9.733574     |    No Changes    |
|     1    | 6.757523 |      7.302388     | 5.714839 |      6.805287     |    No Changes    |
|     2    | 6.753428 |      7.291906     | 5.899611 |      6.603533     |    No Changes    |
|     3    | 6.749848 |      7.293555     | 6.005773 |      6.486256     |    No Changes    |
|     4    | 6.755352 |      7.297607     | 5.982163 |      8.280619     |    No Changes    |
|     5    | 6.756498 |      7.335412     | 6.321188 |      7.900422     |    No Changes    |
|     6    | 6.792402 |      7.332112     |  6.17904 |      6.443676     |    No Changes    |
|     7    | 6.786584 |      7.311666     | 7.093638 |      7.811417     |    No Changes    |
|     8    |  6.7851  |      7.30604      | 5.574762 |      6.045969     |    No Changes    |
|     9    | 6.789152 |      7.309363     | 5.751018 |      6.213471     |    No Changes    |
|     0    | 7.696765 |      8.03615      | 6.175457 |      6.764809     |  Changed Samples |
|     1    | 7.914885 |      8.646722     | 6.997217 |      7.598789     |  Changed Samples |
|     2    | 8.489555 |       9.2526      | 6.899783 |      7.202334     |  Changed Samples |
|     3    | 9.197605 |      10.02934     | 7.511708 |      7.724675     |  Changed Samples |
|     4    |  9.73642 |      10.64056     | 7.918493 |      8.982463     |  Changed Samples |
|     5    | 10.34522 |      11.31103     | 8.524865 |      9.403711     |  Changed Samples |
|     6    | 10.94025 |      11.98357     | 8.697257 |      9.49277      |  Changed Samples |
|     7    | 11.80717 |      12.93195     | 8.734307 |      10.79595     |  Changed Samples |
|     8    | 12.18282 |      13.38646     | 9.175231 |      10.33532     |  Changed Samples |
|     9    | 13.05499 |      14.33106     | 11.04398 |      10.50722     |  Changed Samples |
|     0    | 12.43683 |      13.19787     | 12.80741 |      13.86206     |   Changed Both   |
|     1    | 18.59139 |      20.01569     | 25.61141 |      35.37391     |   Changed Both   |
|     2    | 24.37475 |      26.44214     | 40.86238 |      42.79259     |   Changed Both   |
|     3    | 31.96762 |      34.75215     |  68.869  |      59.97797     |   Changed Both   |
|     4    | 41.26578 |      44.70537     | 83.84672 |      94.62811     |   Changed Both   |
|     5    | 49.82583 |      54.06252     |  109.197 |      108.0314     |   Changed Both   |
|     6    | 59.36528 |      64.60577     | 131.1234 |      140.6352     |   Changed Both   |
|     7    | 71.44678 |      77.71752     | 156.1914 |      161.4897     |   Changed Both   |
|     8    | 81.79306 |      90.56132     | 196.0033 |      193.4111     |   Changed Both   |
|     9    | 94.71505 |      104.8044     | 215.0758 |      224.6175     |   Changed Both   |

ไม่มีการเปลี่ยนแปลง

การเพิ่มจำนวนคุณลักษณะเชิงเส้น

ตัวอย่างที่เพิ่มขึ้นเป็นเชิงเส้น

การเพิ่มตัวอย่างเชิงเส้น + คุณสมบัติ

เมื่อฉันเริ่มค้นคว้ามากขึ้น สิ่งนี้สมเหตุสมผล GPUs เป็นที่รู้จักกันดีขนาดที่มีข้อมูลมิติสูงและมันจะทำให้ความรู้สึกที่คุณจะเห็นการปรับปรุงเวลาการฝึกอบรมถ้าข้อมูลของคุณอยู่ในระดับสูงมิติ ดูตัวอย่างต่อไปนี้:

  • https://projecteuclid.org/download/pdfview_1/euclid.ss/1294167962
  • K หมายถึงการจัดกลุ่มข้อมูลที่มีมิติสูงเร็วขึ้นด้วยการรองรับ GPU
  • https://link.springer.com/article/10.1007/s11063-014-9383-4

แม้ว่าเราจะไม่สามารถพูดได้อย่างแน่นอนหากไม่มีการเข้าถึงข้อมูลของคุณ แต่ดูเหมือนว่าความสามารถของฮาร์ดแวร์ของ GPU จะทำให้ประสิทธิภาพเพิ่มขึ้นอย่างมีนัยสำคัญเมื่อข้อมูลของคุณรองรับและดูเหมือนว่าอาจไม่ใช่กรณีตามขนาดและรูปร่างของข้อมูลที่คุณ มี.