CPU เร็วกว่า GPU โดยใช้ xgb และ XGBclassifier
ฉันต้องขออภัยล่วงหน้าเนื่องจากฉันเป็นมือใหม่ ฉันกำลังลองทดสอบ 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 หรือไม่
ความช่วยเหลือใด ๆ จะได้รับการชื่นชมมาก ขอบคุณมาก!
คำตอบ
คำถามที่น่าสนใจ เช่นเดียวกับที่คุณทราบมีตัวอย่างบางส่วนที่ระบุไว้ใน 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 จะทำให้ประสิทธิภาพเพิ่มขึ้นอย่างมีนัยสำคัญเมื่อข้อมูลของคุณรองรับและดูเหมือนว่าอาจไม่ใช่กรณีตามขนาดและรูปร่างของข้อมูลที่คุณ มี.