GPU का एक्सपीबी और XGBclassifier का उपयोग करके सीपीयू की तुलना में तेजी से
मैं पहले से माफी माँगता हूँ क्योंकि मैं एक शुरुआती हूँ। मैं XGBoost के साथ Xgb और XGBclassifier का उपयोग करके GPU बनाम CPU परीक्षणों की कोशिश कर रहा हूं। परिणाम इस प्रकार हैं:
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
मैं सोच रहा हूं कि सीपीयू GPU से बेहतर नहीं है तो सीपीयू क्यों प्रदर्शन कर रहा है। यह मेरा सेटअप है:
- अजगर 3.6.1
- ओएस: विंडोज 10 64 बिट
- GPU: NVIDIA RTX 2070 सुपर 8gb विक्रम (ड्राइवर नवीनतम संस्करण में अपडेट किया गया)
- CUDA 10.1 स्थापित
- सीपीयू i7 10700 2.9Ghz
- जुपिटर नोटबुक पर चल रहा है
- पाइप के माध्यम से xgboost 1.2.0 के रात के निर्माण को स्थापित किया
** पाइप के उपयोग से पूर्व-निर्मित बाइनरी व्हील से स्थापित xgboost के संस्करण का उपयोग करने की भी कोशिश की गई: एक ही मुद्दा
यहाँ परीक्षण कोड का उपयोग कर रहा हूँ ( यहाँ से उठाया गया ):
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))
मैंने यह देखने के लिए एक स्केलेर ग्रिड खोज को शामिल करने की कोशिश की है कि क्या मुझे 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 का उपयोग करने से एक speedup नहीं मिल रहा है? क्या GPU का उपयोग करने से लाभ प्राप्त करने के लिए डेटासेट बहुत छोटा है?
कोई भी सहायताकाफी प्रशंसनीय होगी। आपका बहुत बहुत धन्यवाद!
जवाब
दिलचस्प सवाल। जैसा कि आप ध्यान दें, इसके कुछ उदाहरण हैं जो गितूब और अधिकारी पर नोट किए गए हैं xgboost site:
- https://github.com/dmlc/xgboost/issues/2819
- https://discuss.xgboost.ai/t/no-gpu-usage-when-using-gpu-hist/532
ऐसे अन्य लोग भी हैं जिन्होंने इसी तरह के प्रश्न पोस्ट किए हैं:
- GPU समर्थन के साथ XGBClassifier का उपयोग करके कोई स्पीडअप नहीं
आधिकारिक xgboostप्रलेखन को देखते हुए , GPU समर्थन पर एक व्यापक खंड है ।
जांच करने के लिए कुछ चीजें हैं। प्रलेखन नोट:
वृक्ष निर्माण (प्रशिक्षण) और भविष्यवाणी CUDA- सक्षम GPU के साथ त्वरित की जा सकती है।
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 Parameters पेज को देखते हैं , तो आप अतिरिक्त क्षेत्र पा सकते हैं जो आपके समय को बेहतर बनाने में मदद कर सकते हैं। उदाहरण के लिए, updater
सेट किया जा सकता है grow_gpu_hist
, जो (ध्यान दें, यह आपके द्वारा tree_method
सेट किए जाने के बाद से , लेकिन नोट्स के लिए लूट है):
grow_gpu_hist: GPU के साथ पेड़ उगाएं।
पैरामीटर पृष्ठ के निचले भाग में gpu_hist
सक्षम के लिए अतिरिक्त पैरामीटर हैं , विशेष रूप से deterministic_histogram
(ध्यान दें, यह इस चूक के बाद से लूट है True
):
GPU पर हिस्टोग्राम का निर्माण निर्धारक रूप से करें। फ्लोटिंग पॉइंट योग के गैर-साहचर्य पहलू के कारण हिस्टोग्राम बिल्डिंग नियतात्मक नहीं है। हम समस्या को कम करने के लिए एक पूर्व-गोल दिनचर्या को नियोजित करते हैं, जिससे थोड़ी सटीकता कम हो सकती है। इसे अक्षम करने के लिए गलत पर सेट करें।
4. डेटा
मैंने कुछ आंकड़ों के साथ कुछ दिलचस्प प्रयोग किए। जब से मैं अपने डेटा तक पहुँच नहीं था, मैं प्रयोग किया जाता sklearn
है make_classification, जो डेटा उत्पन्न करता है एक नहीं बल्कि मजबूत रास्ते में ।
मैंने आपकी स्क्रिप्ट में कुछ बदलाव किए, लेकिन कोई बदलाव नहीं देखा: मैंने जीपीयू बनाम सीपीयू के उदाहरणों पर हाइपरपरमेटर्स को बदल दिया, मैंने इसे 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
- जीपीआर सपोर्ट के साथ हाई-डायमेंशनल डेटा पर तेजी से बढ़ रहा है
- https://link.springer.com/article/10.1007/s11063-014-9383-4
यद्यपि हम आपके डेटा तक पहुँच के बिना निश्चित रूप से नहीं कह सकते हैं, ऐसा लगता है कि GPU की हार्डवेयर क्षमताएं महत्वपूर्ण प्रदर्शन को सक्षम करती हैं जब आपका डेटा इसका समर्थन करता है, और ऐसा प्रतीत होता है कि हो सकता है कि आपके द्वारा दिए गए डेटा का आकार और आकार ऐसा न हो। है।