LightGBM GPU 教程
本文档旨在为您提供关于 GPU 训练的快速分步教程。
我们将使用 Microsoft Azure 云计算平台上的 GPU 实例进行演示,但您可以使用任何配备现代 AMD 或 NVIDIA GPU 的机器。
GPU 设置
您需要在 Azure 上启动一个 NV
类型实例(在东美国、中北部美国、中南部美国、西欧和东南亚区域可用),并选择 Ubuntu 16.04 LTS 作为操作系统。
为了测试,最小的 NV6
型虚拟机就足够了,它包含 1/2 个 M60 GPU,配备 8 GB 内存、180 GB/秒内存带宽和 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 驱动程序,并安装 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
cmake -B build -S . -DUSE_GPU=1
# if you have installed NVIDIA CUDA to a customized location, you should specify paths to OpenCL headers and library like the following:
# cmake -B build -S . -DUSE_GPU=1 -DOpenCL_LIBRARY=/usr/local/cuda/lib64/libOpenCL.so -DOpenCL_INCLUDE_DIR=/usr/local/cuda/include/
cmake --build build -j$(nproc)
您将看到生成了两个二进制文件:lightgbm
和 lib_lightgbm.so
。
如果您在 macOS 上构建,可能需要删除 src/treelearner/gpu_tree_learner.h
中的宏 BOOST_COMPUTE_USE_OFFLINE_CACHE
,以避免 Boost.Compute 中一个已知的崩溃 bug。
安装 Python 接口 (可选)
如果您想使用 LightGBM 的 Python 接口,现在可以安装它(以及一些必要的 Python 包依赖项)
sudo apt-get -y install python-pip
sudo -H pip install setuptools numpy scipy scikit-learn -U
sudo sh ./build-python.sh install --precompile
您需要在 Python 中设置一个额外的参数 "device" : "gpu"
(以及您的其他选项,如 learning_rate
, num_leaves
等)来使用 GPU。
您可以阅读我们的 Python 包示例,了解有关如何使用 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
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_platform_id
或 gpu_device_id
,将选择默认平台和 GPU。您可能拥有多个平台(AMD/Intel/NVIDIA)或 GPU。您可以使用 clinfo 工具识别每个平台上的 GPU。在 Ubuntu 上,您可以通过执行 sudo apt-get install clinfo
安装 clinfo
。如果您有 AMD/NVIDIA 的独立 GPU 和 Intel 的集成 GPU,请确保选择正确的 gpu_platform_id
来使用独立 GPU。
在 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
现在我们可以在 GPU 上进行速度测试,而无需在每次迭代后计算 AUC。
./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 数据集在 GPU 上作为回归任务进行训练
./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 加速有用,请在您的出版物中引用以下文章
Huan Zhang, Si Si 和 Cho-Jui Hsieh. “GPU 加速大规模树提升.” SysML 会议, 2018。