Thư viện XGBoost được thiết kế để tận dụng tối đa sức mạnh của phần cứng hệ thống, bao gồm tất cả CPU cores và bộ nhớ. Trong bài viết này, ta sẽ cùng nhau tìm hiểu cách thiết lập một server trên AWS để train XGBoost model, sao cho vừa nhanh, vừa rẻ! :D
Bài viết gồm 4 phần:
Chú ý quan trọng: Sẽ mất khoảng 1-2$ chi phí để sử dụng các dịch vụ của AWS trong bài viết này.
1. Tạo tài khoản AWS
(Nếu bạn đã có tài khoản AWS, hãy bỏ qua bước này!)
2. Chạy AWS EC2 Instance
Chúng ta sẽ sử dụng dịch vụ EC2 để chạy XGBoost.
Launch EC2 Instance
.Community AMIs
ami-1c40bf7d
vào Search community AMIs
và chọn Select
.Review and Launch
.Launch
.Create a new key pair
, điền tên của key
là xgboost-key và click
Download Key Pair`.Lưu file key vào máy tính ở local, sau đó click Launch EC2 Instances
.
View EC2 Instances
.
Chờ khoảng 3 phút và kiểm tra trạng thái của EC2 Instance.Nếu trạng thái là Running
thì tức là đã tạo EC2 Instance thành công.
Ta cũng để ý thấy địa chỉ public IP
của EC2 Instance là: 54.92.106.10. Tiếp theo ta sẽ sử dụng địa chỉ này để kết nối đến EC2 Instance từ localhost thông qua giao thức SSH.
3. Kết nối đến EC2 Instance và chạy code
3.1 Kết nối đến EC2 Instance qua giao thức ssh
$ cd Documents #Thư mục chứa key file
$ chmod 600 xgboost-key.pem
$ ssh -i xgboost.pem fedora@54.92.106.10
Nếu đây là lần đầu kết nối đến EC2 Instance, sẽ có 1 cảnh báo xuất hiện. Gõ yes
.
Nếu kết nối thành công, màn hình Terminal sẽ xuất hiện như sau:
$cat /proc/cpuinfo | grep processor | wc -l
Kết quả:
32
3.2 Cài đặt các thư viện cần thiết
sudo dnf install gcc gcc-c++ make git unzip python python3-numpy python3-scipy
python3-scikit-learn python3-pandas python3-matplotlib
XGBoost yêu cầu cmake >= 3.13. Nếu bạn cài bằng bằng lệnh dnf install cmake
thì phiên bản của make la 3.9. Để cài cmake >= 3.13, bạn phải cài build từ source.
$ wget https://github.com/Kitware/CMake/releases/download/v3.15.2/cmake-3.15.2.tar.gz
$ tar -zxvf cmake-3.15.2.tar.gz
$ cd cmake-3.15.2
$ ./bootstrap
$ make
$ sudo make install
Kiểm tra GCC:
$gcc --version
Kết quả:
[fedora@ip-172-31-37-253 ~]$ gcc --version
gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)
Kiểm tra Python:
$ python3 --version
Kết quả:
Python 3.5.1
Kiểm tra SciPy:
$ python3 -c "import scipy;print(scipy.__version__)"
$ python3 -c "import numpy;print(numpy.__version__)"
$ python3 -c "import pandas;print(pandas.__version__)"
$ python3 -c "import sklearn;print(sklearn.__version__)"
Kết quả:
0.16.1
1.11.0
0.18.0
0.17.1
Kiểm tra Cmake
$ cmake --version
Kết quả:
3.15.1
3.3. Cài đặt thư viện XGBoost
$ pip3 install xgboost==1.1
Tại thời điểm viết bài, phiên bản mới nhất của xgboost là 1.2. Nhưng vì phiên bản của python=3.5 nên bạn chỉ có thể sử dụng được phiên bản 1.1 của xgboost.
Kiểm tra:
$ python3 -c "import xgboost;print(xgboost.__version__)"
Kết quả:
1.1.0
4. Train XGBoost model
Tương tự như ở bài 9, chúng ta cũng sẽ sử dụng Otto dataset để kiểm tra khả năng của XGBoost model theo số lượng cores của CPU.
xgboost
trên máy local, tạo file check_num_threads.py
với code như sau:# Otto multi-core test
from pandas import read_csv
from xgboost import XGBClassifier
from sklearn.preprocessing import LabelEncoder
from time import time
# load data
data = read_csv('train.csv')
dataset = data.values
# split data into X and y
X = dataset[:,0:94]
y = dataset[:,94]
# encode string class values as integers
label_encoded_y = LabelEncoder().fit_transform(y)
# evaluate the effect of the number of threads
results = []
num_threads = [1, 16, 32]
for n in num_threads:
start = time()
model = XGBClassifier(nthread=n)
model.fit(X, label_encoded_y)
elapsed = time() - start
print(n, elapsed)
results.append(elapsed)
Copy file train.csv
ở bài trước vào thư mục xgboost
.
xgboost
lên EC2 Instance:$ scp -i xgboost-key.pem -r xgboost fedora@54.92.106.10:/home/fedora
$ cd xgboost
python3 check_num_threads.py
Kết quả thu được:
1 70.75178146362305
16 6.106862545013428
32 5.045598745346069
Sử dụng 32 cores, mất 5s để train XGBoost model với tập dữ liệu tương đối lớn. Đây quả là một kết quả ấn tượng. :D
Bonus:: Trong trường hợp việc train model mất nhiều thời gian hơn mà chẳng may bạn bị mất kết nối đến EC2 Instance giữa chừng thì thế nào? Bạn phải chạy train lại từ đầu ư? Quả là mất thời gian phải không? Giải pháp để ngăn chặn tình huống này, hoặc là bạn chạy lệnh train ở chế độ background process
và ghi kết quả ra một file như lệnh sau:
$ nohup python script.py >script.py.out 2>&1 &
hoặc bạn cũng có thể sử dụng Tmux.
5. Tắt EC2 EC2 Instance
Tiết kiệm là quốc sách hàng đầu
, hãy luôn nhớ tắt EC2 EC2 Instance mỗi khi sử dụng xong. Bản thân mình đã từng một lần quên không tắt trong vài ngày. Kết quả là con số trên hóa đơn AWS tháng đó làm mình buồn mất cả tuần, :).
Để tắt EC2 EC2 Instance, đơn giản là làm theo như hình vẽ sau:
6. Kết luận
Trong bài viết này, chúng ta đã tìm hiểu cách cài đặt vào cấu hình EC2 Instance để train XGBoost model trên AWS.
Bài viết tiếp theo sẽ thiên về lý thuyết một chút, chúng ta sẽ tìm hiểu cách cấu hình hyper-parameters
cho gradient boosting model
. Hãy cùng đón đọc! :)
Toàn bộ source code của bài này các bạn có thể tham khảo trên github cá nhân của mình tại github.
Bài viết có tham khảo tại tham khảo.