GPU SDK 对应关系和设备目标表

GPU 目标表

OpenCL 是一个面向多个后端(GPU、CPU、FPGA等)的通用大规模并行编程框架。基本上,要使用某个供应商的设备,你必须安装该供应商提供的驱动程序。英特尔和AMD的OpenCL运行时也包括x86 CPU目标支持。NVIDIA的OpenCL运行时仅支持NVIDIA GPU(不支持CPU)。通常,OpenCL CPU后端速度相当慢,仅应用于测试和调试。

您可以在下面找到一个对应表:

SDK

CPU Intel/AMD

GPU Intel

GPU AMD

GPU NVIDIA

Intel SDK for OpenCL

支持

支持

不支持

不支持

AMD APP SDK *

支持

不支持

支持

不支持

PoCL

支持

不支持

支持

不支持

NVIDIA CUDA Toolkit

不支持

不支持

不支持

支持

图例:

* AMD APP SDK 已被弃用。在 Windows 上,OpenCL 包含在 AMD 显卡驱动中。在 Linux 上,新一代 AMD 显卡由 ROCm 驱动支持。你可以从我们的 GitHub 仓库下载 AMD APP SDK 的存档副本(适用于 Linux适用于 Windows)。


查询系统中的 OpenCL 设备

您的系统可能安装了来自不同供应商(”平台”)的多个GPU。设置LightGBM GPU设备需要两个参数:OpenCL平台ID (gpu_platform_id) 和 OpenCL设备ID (gpu_device_id)。一般来说,每个供应商提供一个OpenCL平台,同一供应商的设备在该平台下有不同的设备ID。例如,如果您的系统有一个Intel集成GPU和两个AMD独立GPU,您将有两个OpenCL平台(gpu_platform_id=0gpu_platform_id=1)。如果平台0是Intel,它有一个设备(gpu_device_id=0)代表Intel GPU;如果平台1是AMD,它有两个设备(gpu_device_id=0gpu_device_id=1)代表两个AMD GPU。如果您有一个AMD/NVIDIA的独立GPU和一个Intel的集成GPU,请确保选择正确的``gpu_platform_id``以使用独立GPU,因为它通常提供更好的性能。

在Windows上,可以使用 GPUCapsViewer 查询OpenCL设备,在OpenCL选项卡下。请注意,此工具报告的平台和设备ID从1开始。因此,您应该将报告的ID减去1。

在Linux上,可以使用 clinfo 命令列出OpenCL设备。在Ubuntu上,可以通过执行 sudo apt-get install clinfo 来安装 clinfo

示例

我们提供下面的测试R代码,但你可以使用你选择的语言和示例:

library(lightgbm)
data(agaricus.train, package = "lightgbm")
train <- agaricus.train
train$data[, 1] <- 1:6513
dtrain <- lgb.Dataset(train$data, label = train$label)
data(agaricus.test, package = "lightgbm")
test <- agaricus.test
dtest <- lgb.Dataset.create.valid(dtrain, test$data, label = test$label)
valids <- list(test = dtest)

params <- list(objective = "regression",
               metric = "rmse",
               device = "gpu",
               gpu_platform_id = 0,
               gpu_device_id = 0,
               nthread = 1,
               boost_from_average = FALSE,
               num_tree_per_iteration = 10,
               max_bin = 32)
model <- lgb.train(params,
                   dtrain,
                   2,
                   valids,
                   min_data = 1,
                   learning_rate = 1,
                   early_stopping_rounds = 10)

确保你列出系统中的 OpenCL 设备,并正确设置 gpu_platform_idgpu_device_id。在以下示例中,我们的系统有 1 个 GPU 平台(gpu_platform_id = 0)来自 AMD APP SDK。第一个设备 gpu_device_id = 0 是一个 GPU 设备(AMD Oland),第二个设备 gpu_device_id = 1 是 x86 CPU 后端。

使用GPU的示例(在我们的系统中 gpu_platform_id = 0gpu_device_id = 0):

> params <- list(objective = "regression",
+                metric = "rmse",
+                device = "gpu",
+                gpu_platform_id = 0,
+                gpu_device_id = 0,
+                nthread = 1,
+                boost_from_average = FALSE,
+                num_tree_per_iteration = 10,
+                max_bin = 32)
> model <- lgb.train(params,
+                    dtrain,
+                    2,
+                    valids,
+                    min_data = 1,
+                    learning_rate = 1,
+                    early_stopping_rounds = 10)
[LightGBM] [Info] This is the GPU trainer!!
[LightGBM] [Info] Total Bins 232
[LightGBM] [Info] Number of data: 6513, number of used features: 116
[LightGBM] [Info] Using GPU Device: Oland, Vendor: Advanced Micro Devices, Inc.
[LightGBM] [Info] Compiling OpenCL Kernel with 16 bins...
[LightGBM] [Info] GPU programs have been built
[LightGBM] [Info] Size of histogram bin entry: 12
[LightGBM] [Info] 40 dense feature groups (0.12 MB) transferred to GPU in 0.004211 secs. 76 sparse feature groups.
[LightGBM] [Info] No further splits with positive gain, best gain: -inf
[LightGBM] [Info] Trained a tree with leaves=16 and depth=8
[1]:    test's rmse:1.10643e-17
[LightGBM] [Info] No further splits with positive gain, best gain: -inf
[LightGBM] [Info] Trained a tree with leaves=7 and depth=5
[2]:    test's rmse:0

在OpenCL CPU后端设备上运行通常较慢,并且在某些Windows和macOS系统上我们观察到崩溃。请确保检查日志中的``Using GPU Device``行,并且它没有使用CPU。上述日志显示我们正在使用AMD的``Oland`` GPU,而不是CPU。

使用CPU的示例(gpu_platform_id = 0gpu_device_id = 1)。报告的GPU设备是``Intel(R) Core(TM) i7-4600U CPU``,因此它使用的是CPU后端而不是真正的GPU。

> params <- list(objective = "regression",
+                metric = "rmse",
+                device = "gpu",
+                gpu_platform_id = 0,
+                gpu_device_id = 1,
+                nthread = 1,
+                boost_from_average = FALSE,
+                num_tree_per_iteration = 10,
+                max_bin = 32)
> model <- lgb.train(params,
+                    dtrain,
+                    2,
+                    valids,
+                    min_data = 1,
+                    learning_rate = 1,
+                    early_stopping_rounds = 10)
[LightGBM] [Info] This is the GPU trainer!!
[LightGBM] [Info] Total Bins 232
[LightGBM] [Info] Number of data: 6513, number of used features: 116
[LightGBM] [Info] Using requested OpenCL platform 0 device 1
[LightGBM] [Info] Using GPU Device: Intel(R) Core(TM) i7-4600U CPU @ 2.10GHz, Vendor: GenuineIntel
[LightGBM] [Info] Compiling OpenCL Kernel with 16 bins...
[LightGBM] [Info] GPU programs have been built
[LightGBM] [Info] Size of histogram bin entry: 12
[LightGBM] [Info] 40 dense feature groups (0.12 MB) transferred to GPU in 0.004540 secs. 76 sparse feature groups.
[LightGBM] [Info] No further splits with positive gain, best gain: -inf
[LightGBM] [Info] Trained a tree with leaves=16 and depth=8
[1]:    test's rmse:1.10643e-17
[LightGBM] [Info] No further splits with positive gain, best gain: -inf
[LightGBM] [Info] Trained a tree with leaves=7 and depth=5
[2]:    test's rmse:0

已知问题:

  • 使用 gpu_platform_idgpu_device_id 的不良组合可能会导致某些机器上的 OpenCL 驱动程序问题,从而引发 **崩溃**(您将丢失整个会话内容)。请注意这一点。

  • 在某些系统上,如果你有集成显卡(Intel HD Graphics)和独立显卡(AMD,NVIDIA),独立显卡会自动覆盖集成显卡。解决方法是禁用独立显卡以使用集成显卡。