GPU SDK对应关系与设备指定表

GPU 目标设备表

OpenCL 是一个通用的并行编程框架,支持多种后端(GPU、CPU、FPGA 等)。基本上,要使用特定供应商的设备,您必须安装该供应商的驱动程序。英特尔和 AMD 的 OpenCL 运行时也包含 x86 CPU 目标支持。NVIDIA 的 OpenCL 运行时仅支持 NVIDIA GPU(不支持 CPU)。一般来说,OpenCL 的 CPU 后端相当慢,仅应用于测试和调试。

下表列出了对应关系

SDK

CPU 英特尔/AMD

GPU 英特尔

GPU AMD

GPU NVIDIA

英特尔 OpenCL SDK

支持

支持

不支持

不支持

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。例如,如果您的系统有一块英特尔集成显卡和两块 AMD 独立显卡,您将有两个 OpenCL 平台(gpu_platform_id=0gpu_platform_id=1)。如果平台 0 是英特尔,它有一个设备(gpu_device_id=0)代表英特尔 GPU;如果平台 1 是 AMD,它有两个设备(gpu_device_id=0gpu_device_id=1)代表两块 AMD GPU。如果您有一块 AMD/NVIDIA 独立 GPU 和一块英特尔集成 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。在以下示例中,我们的系统有一个来自 AMD APP SDK 的 GPU 平台(gpu_platform_id = 0)。第一个设备 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),独立显卡会自动覆盖集成显卡。解决方法是禁用独立显卡以使用集成显卡。