LightGBM GPU 教程

本文档的目的在于一步步教你快速上手 GPU 训练。

对于 Windows, 请参阅 GPU Windows 教程.

我们将用 Microsoft Azure cloud computing platform 上的 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 开发环境:

  1. sudo apt-get update
  2. sudo apt-get install --no-install-recommends nvidia-375
  3. sudo apt-get install --no-install-recommends nvidia-opencl-icd-375 nvidia-opencl-dev opencl-headers

安装完驱动以后需要重新启动服务器。

  1. sudo init 6

大约 30 秒后,服务器可以重新运转。

如果你正在使用 AMD GPU, 你需要下载并安装 AMDGPU-Pro 驱动,同时安装 ocl-icd-libopencl1ocl-icd-opencl-dev 两个包。

编译 LightGBM

现在安装必要的生成工具和依赖:

  1. 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 目录下。 我们把它作为我们的工作环境(如果你正在使用自己的机器,可以跳过该步):

  1. sudo mkdir -p /mnt/workspace
  2. sudo chown $(whoami):$(whoami) /mnt/workspace
  3. cd /mnt/workspace

现在我们可以准备好校验 LightGBM 并使用 GPU 支持来编译它:

  1. git clone --recursive https://github.com/Microsoft/LightGBM
  2. cd LightGBM
  3. mkdir build ; cd build
  4. cmake -DUSE_GPU=1 ..
  5. # if you have installed the NVIDIA OpenGL, please using following instead
  6. # sudo cmake -DUSE_GPU=1 -DOpenCL_LIBRARY=/usr/local/cuda/lib64/libOpenCL.so -OpenCL_INCLUDE_DIR=/usr/local/cuda/include/ ..
  7. make -j$(nproc)
  8. cd ..

你可以看到有两个二进制文件生成了,lightgbmlib_lightgbm.so

如果你正在 OSX 系统上编译,你可能需要在 src/treelearner/gpu_tree_learner.h 中移除 BOOST_COMPUTE_USE_OFFLINE_CACHE 宏指令以避免 Boost.Compute 中的冲突错误。

安装 Python 接口 (可选)

如果你希望使用 LightGBM 的 Python 接口,你现在可以安装它(同时包括一些必要的 Python 依赖包):

  1. sudo apt-get -y install python-pip
  2. sudo -H pip install setuptools numpy scipy scikit-learn -U
  3. cd python-package/
  4. sudo python setup.py install --precompile
  5. cd ..

你需要设置一个额外的参数 "device" : "gpu" (同时也包括其他选项如 learning_rate, num_leaves, 等等)来在 Python 中使用 GPU.

你可以阅读我们的 Python Package Examples 来获取更多关于如何使用 Python 接口的信息。

数据集准备

使用如下命令来准备 Higgs 数据集

  1. git clone https://github.com/guolinke/boosting_tree_benchmarks.git
  2. cd boosting_tree_benchmarks/data
  3. wget "https://archive.ics.uci.edu/ml/machine-learning-databases/00280/HIGGS.csv.gz"
  4. gunzip HIGGS.csv.gz
  5. python higgs2libsvm.py
  6. cd ../..
  7. ln -s boosting_tree_benchmarks/data/higgs.train
  8. ln -s boosting_tree_benchmarks/data/higgs.test

现在我们可以通过运行如下命令来为 LightGBM 创建一个配置文件(请复制整段代码块并作为一个整体来运行它):

  1. cat > lightgbm_gpu.conf <<EOF
  2. max_bin = 63
  3. num_leaves = 255
  4. num_iterations = 50
  5. learning_rate = 0.1
  6. tree_learner = serial
  7. task = train
  8. is_training_metric = false
  9. min_data_in_leaf = 1
  10. min_sum_hessian_in_leaf = 100
  11. ndcg_eval_at = 1,3,5,10
  12. sparse_threshold = 1.0
  13. device = gpu
  14. gpu_platform_id = 0
  15. gpu_device_id = 0
  16. EOF
  17. 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。

  1. ./lightgbm config=lightgbm_gpu.conf data=higgs.train valid=higgs.test objective=binary metric=auc

现在用如下代码在 CPU 上训练相同的数据集. 你应该能观察到相似的 AUC:

  1. ./lightgbm config=lightgbm_gpu.conf data=higgs.train valid=higgs.test objective=binary metric=auc device=cpu

现在我们可以不计算 AUC,每次迭代后进行 GPU 上的速度测试。

  1. ./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=binary metric=auc

CPU 的速度测试:

  1. ./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=binary metric=auc device=cpu

你可以观察到在该 GPU 上加速了超过三倍.

GPU 加速也可以用于其他任务/指标上(回归,多类别分类器,排序,等等). 比如,我们可以在一个回归任务下训练 Higgs 数据集:

  1. ./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=regression_l2 metric=l2

同样地, 你也可以比较 CPU 上的训练速度:

  1. ./lightgbm config=lightgbm_gpu.conf data=higgs.train objective=regression_l2 metric=l2 device=cpu

进一步阅读

参考

如果您觉得 GPU 加速很有用,希望您在著作中能够引用如下文章;

Huan Zhang, Si Si and Cho-Jui Hsieh. “GPU Acceleration for Large-scale Tree Boosting.” arXiv:1706.08359, 2017.