# LightGBM GPU 教程
本文檔的目的在于一步步教你快速上手 GPU 訓練。
對于 Windows, 請參閱 [GPU Windows 教程](./GPU-Windows.rst).
我們將用 [Microsoft Azure cloud computing platform](https://azure.microsoft.com/) 上的 GPU 實例做演示, 但你可以使用具有現代 AMD 或 NVIDIA GPU 的任何機器。
## GPU 安裝
你需要在 Azure (East US, North Central US, South Central US, West Europe 以及 Southeast Asia 等區域都可用)上啟動一個 `NV` 類型的實例 并選擇 Ubuntu 16.04 LTS 作為操作系統。
經測試, `NV6` 類型的虛擬機是滿足最小需求的, 這種虛擬機包括 1/2 M60 GPU, 8 GB 內存, 180 GB/s 的內存帶寬以及 4,825 GFLOPS 的峰值計算能力。 不要使用 `NC` 類型的實例,因為這些 GPU (K80) 是基于較老的架構 (Kepler).
首先我們需要安裝精簡版的 NVIDIA 驅動和 OpenCL 開發環境:
```
sudo apt-get update
sudo apt-get install --no-install-recommends nvidia-375
sudo apt-get install --no-install-recommends nvidia-opencl-icd-375 nvidia-opencl-dev opencl-headers
```
安裝完驅動以后需要重新啟動服務器。
```
sudo init 6
```
大約 30 秒后,服務器可以重新運轉。
如果你正在使用 AMD GPU, 你需要下載并安裝 [AMDGPU-Pro](http://support.amd.com/en-us/download/linux) 驅動,同時安裝 `ocl-icd-libopencl1` 和 `ocl-icd-opencl-dev` 兩個包。
## 編譯 LightGBM
現在安裝必要的生成工具和依賴:
```
sudo apt-get install --no-install-recommends git cmake build-essential libboost-dev libboost-system-dev libboost-filesystem-dev
```
`NV6` GPU 實例自帶一個 320 GB 的極速 SSD,掛載在 `/mnt` 目錄下。 我們把它作為我們的工作環境(如果你正在使用自己的機器,可以跳過該步):
```
sudo mkdir -p /mnt/workspace
sudo chown $(whoami):$(whoami) /mnt/workspace
cd /mnt/workspace
```
現在我們可以準備好校驗 LightGBM 并使用 GPU 支持來編譯它:
```
git clone --recursive https://github.com/Microsoft/LightGBM
cd LightGBM
mkdir build ; cd build
cmake -DUSE_GPU=1 ..
# if you have installed the NVIDIA OpenGL, please using following instead
# sudo cmake -DUSE_GPU=1 -DOpenCL_LIBRARY=/usr/local/cuda/lib64/libOpenCL.so -OpenCL_INCLUDE_DIR=/usr/local/cuda/include/ ..
make -j$(nproc)
cd ..
```
你可以看到有兩個二進制文件生成了,`lightgbm` 和 `lib_lightgbm.so`
如果你正在 OSX 系統上編譯,你可能需要在 `src/treelearner/gpu_tree_learner.h` 中移除 `BOOST_COMPUTE_USE_OFFLINE_CACHE` 宏指令以避免 Boost.Compute 中的沖突錯誤。
## 安裝 Python 接口 (可選)
如果你希望使用 LightGBM 的 Python 接口,你現在可以安裝它(同時包括一些必要的 Python 依賴包):
```
sudo apt-get -y install python-pip
sudo -H pip install setuptools numpy scipy scikit-learn -U
cd python-package/
sudo python setup.py install --precompile
cd ..
```
你需要設置一個額外的參數 `"device" : "gpu"` (同時也包括其他選項如 `learning_rate`, `num_leaves`, 等等)來在 Python 中使用 GPU.
你可以閱讀我們的 [Python Package Examples](https://github.com/Microsoft/LightGBM/tree/master/examples/python-guide) 來獲取更多關于如何使用 Python 接口的信息。
## 數據集準備
使用如下命令來準備 Higgs 數據集
```
git clone https://github.com/guolinke/boosting_tree_benchmarks.git
cd boosting_tree_benchmarks/data
wget "https://archive.ics.uci.edu/ml/machine-learning-databases/00280/HIGGS.csv.gz"
gunzip HIGGS.csv.gz
python higgs2libsvm.py
cd ../..
ln -s boosting_tree_benchmarks/data/higgs.train
ln -s boosting_tree_benchmarks/data/higgs.test
```
現在我們可以通過運行如下命令來為 LightGBM 創建一個配置文件(請復制整段代碼塊并作為一個整體來運行它):
```
cat > lightgbm_gpu.conf <<EOF
max_bin = 63
num_leaves = 255
num_iterations = 50
learning_rate = 0.1
tree_learner = serial
task = train
is_training_metric = false
min_data_in_leaf = 1
min_sum_hessian_in_leaf = 100
ndcg_eval_at = 1,3,5,10
sparse_threshold = 1.0
device = gpu
gpu_platform_id = 0
gpu_device_id = 0
EOF
echo "num_threads=$(nproc)" >> lightgbm_gpu.conf
```
我們可以通過在配置文件中設置 `device=gpu` 來使 GPU 處于可用狀態。 默認將使用系統安裝的第一個 GPU (`gpu_platform_id=0` 以及 `gpu_device_id=0`).
## 在 GPU 上運行你的第一個學習任務
現在我們可以準備開始用 GPU 做訓練了!
首先我們希望確保 GPU 能夠正確工作。 運行如下代碼來在 GPU 上訓練,并記錄下 50 次迭代后的 AUC。
```
./lightgbm config=lightgbm_gpu.conf data=higgs.train valid=higgs.test objective=binary metric=auc
```
現在用如下代碼在 CPU 上訓練相同的數據集. 你應該能觀察到相似的 AUC:
```
./lightgbm config=lightgbm_gpu.conf data=higgs.train valid=higgs.test objective=binary metric=auc device=cpu
```
現在我們可以不計算 AUC,每次迭代后進行 GPU 上的速度測試。
```
./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=binary metric=auc
```
CPU 的速度測試:
```
./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=binary metric=auc device=cpu
```
你可以觀察到在該 GPU 上加速了超過三倍.
GPU 加速也可以用于其他任務/指標上(回歸,多類別分類器,排序,等等). 比如,我們可以在一個回歸任務下訓練 Higgs 數據集:
```
./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=regression_l2 metric=l2
```
同樣地, 你也可以比較 CPU 上的訓練速度:
```
./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=regression_l2 metric=l2 device=cpu
```
## 進一步閱讀
* [GPU 優化指南和性能比較](./GPU-Performance.rst)
* [GPU SDK Correspondence and Device Targeting Table](./GPU-Targets.rst)
* [GPU Windows 教程](./GPU-Windows.rst)
## 參考
如果您覺得 GPU 加速很有用,希望您在著作中能夠引用如下文章;
Huan Zhang, Si Si and Cho-Jui Hsieh. “[GPU Acceleration for Large-scale Tree Boosting](https://arxiv.org/abs/1706.08359).” arXiv:1706.08359, 2017.