CPU nhanh hơn GPU sử dụng xgb và XGBclassifier
Tôi xin lỗi trước vì tôi là người mới bắt đầu. Tôi đang thử các bài kiểm tra GPU và CPU với XGBoost bằng cách sử dụng xgb và XGBclassifier. Kết quả như sau:
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
Tôi đang tự hỏi tại sao CPU dường như hoạt động ngang bằng nếu không phải là tốt hơn GPU. Đây là thiết lập của tôi:
- Python 3.6.1
- Hệ điều hành: Windows 10 64bit
- GPU: NVIDIA RTX 2070 Super 8gb vram (trình điều khiển được cập nhật lên phiên bản mới nhất)
- CUDA 10.1 đã được cài đặt
- CPU i7 10700 2,9Ghz
- Chạy trên Máy tính xách tay Jupyter
- Đã cài đặt bản dựng hàng đêm của xgboost 1.2.0 qua pip
** cũng đã thử sử dụng phiên bản xgboost được cài đặt từ bánh xe nhị phân được tạo sẵn bằng cách sử dụng pip: cùng một vấn đề
Đây là mã kiểm tra tôi đang sử dụng (được lấy từ đây ):
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))
Tôi đã thử kết hợp tìm kiếm lưới Sklearn để xem liệu tôi có nhận được tốc độ nhanh hơn trên GPU hay không nhưng cuối cùng nó lại chậm hơn nhiều so với 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}
Tôi đang sử dụng một tập dữ liệu với 75 nghìn lần quan sát. Bất kỳ ý tưởng nào tại sao tôi không nhận được tốc độ tăng tốc khi sử dụng GPU? Tập dữ liệu có quá nhỏ để có được lợi ích từ việc sử dụng GPU không?
Bất kì sự trợ giúp nào đều được đánh giá cao. Cảm ơn rât nhiều!
Trả lời
Câu hỏi thú vị. Giống như bạn lưu ý, có một vài ví dụ về điều này đã được ghi nhận trên Github và chính thức xgboost site:
- https://github.com/dmlc/xgboost/issues/2819
- https://discuss.xgboost.ai/t/no-gpu-usage-when-using-gpu-hist/532
Cũng có những người khác đã đăng những câu hỏi tương tự:
- Không tăng tốc khi sử dụng XGBClassifier với hỗ trợ GPU
Nhìn vào tài liệu chính thứcxgboost , có một phần mở rộng về hỗ trợ GPU .
Có một số điều cần kiểm tra. Tài liệu lưu ý rằng:
Việc xây dựng cây (đào tạo) và dự đoán có thể được tăng tốc với GPU hỗ trợ CUDA.
1. GPU CUDA của bạn đã được kích hoạt chưa?
Vâng, đúng là như vậy .
2. Bạn đang sử dụng các thông số có thể bị ảnh hưởng bởi việc sử dụng GPU?
Hãy nhớ rằng chỉ một số thông số nhất định được hưởng lợi khi sử dụng GPU. Những người đang có:
Vâng, bạn đang có. Hầu hết chúng đều được bao gồm trong bộ siêu thông số của bạn, đó là một điều tốt.
{subsample, sampling_method, colsample_bytree, colsample_bylevel, max_bin, gamma, gpu_id, predictor, grow_policy, monotone_constraints, interaction_constraints, single_precision_histogram}
3. Bạn có đang cấu hình các thông số để sử dụng hỗ trợ GPU không?
Nếu bạn xem trang Thông số XGBoost , bạn có thể tìm thấy các lĩnh vực bổ sung có thể giúp cải thiện thời gian của bạn. Ví dụ: updatercó thể được đặt thành grow_gpu_hist, (lưu ý, đây là cuộc tranh luận vì bạn đã tree_methodđặt, nhưng đối với ghi chú):
grow_gpu_hist: Phát triển cây bằng GPU.
Ở cuối trang thông số, có các thông số bổ sung để gpu_histkích hoạt, cụ thể là deterministic_histogram(lưu ý, đây là phần tranh luận vì giá trị này mặc định là True):
Xây dựng biểu đồ trên GPU một cách xác định. Việc xây dựng biểu đồ không mang tính xác định do khía cạnh không liên kết của phép tính tổng dấu phẩy động. Chúng tôi áp dụng quy trình làm tròn trước để giảm thiểu vấn đề, điều này có thể dẫn đến độ chính xác thấp hơn một chút. Đặt thành false để tắt nó.
4. Dữ liệu
Tôi đã chạy một số thử nghiệm thú vị với một số dữ liệu. Vì tôi không có quyền truy cập vào dữ liệu của bạn, tôi đã sử dụng sklearn's make_classification, tạo ra dữ liệu theo một cách khá mạnh mẽ .
Tôi đã thực hiện một vài thay đổi đối với tập lệnh của bạn nhưng không nhận thấy sự thay đổi nào: Tôi đã thay đổi siêu tham số trên các ví dụ gpu và cpu, tôi đã chạy điều này 100 lần và nhận được kết quả trung bình, v.v. Dường như không có gì nổi bật với tôi. Tôi nhớ lại rằng tôi đã từng sử dụng XGBoostkhả năng của GPU và CPU để tăng tốc một số phân tích, tuy nhiên, tôi đang làm việc trên một tập dữ liệu lớn hơn nhiều.
Tôi đã chỉnh sửa một chút tập lệnh của bạn để sử dụng dữ liệu này, đồng thời cũng bắt đầu thay đổi số lượng samplesvà featurestrong tập dữ liệu (thông qua n_samplesvà n_featurestham số) để quan sát các tác động trong thời gian chạy. Có vẻ như GPU sẽ cải thiện đáng kể thời gian đào tạo cho dữ liệu chiều cao , nhưng dữ liệu hàng loạt với nhiều mẫu đó không cho thấy sự cải thiện lớn. Xem kịch bản của tôi bên dưới:
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')
Tôi đã chạy điều này thay đổi từng (mẫu, tính năng) riêng biệt và cùng nhau, trên cùng một tập dữ liệu. Xem kết quả bên dưới:
| 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 |
Không thay đổi
Tăng tuyến tính số lượng tính năng
Tăng tuyến tính mẫu
Tăng tuyến tính Mẫu + Tính năng
Khi tôi bắt đầu nghiên cứu thêm; Điều này thật ý nghĩa. GPU được biết là có quy mô tốt với dữ liệu chiều cao và sẽ có ý nghĩa khi bạn thấy thời gian đào tạo được cải thiện nếu dữ liệu của bạn có chiều cao . Xem các ví dụ sau:
- https://projecteuclid.org/download/pdfview_1/euclid.ss/1294167962
- Phân cụm Kmeans nhanh hơn trên dữ liệu chiều cao với hỗ trợ GPU
- https://link.springer.com/article/10.1007/s11063-014-9383-4
Mặc dù chúng tôi không thể nói chắc chắn nếu không có quyền truy cập vào dữ liệu của bạn, nhưng có vẻ như khả năng phần cứng của GPU cho phép tăng hiệu suất đáng kể khi dữ liệu của bạn hỗ trợ nó và có vẻ như điều đó không đúng với kích thước và hình dạng của dữ liệu bạn có.