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 | 
|---|---|---|---|---|
| 支持 | 支持 | 不支持 | 不支持 | |
| AMD APP SDK * | 支持 | 不支持 | 支持 | 不支持 | 
| 支持 | 不支持 | 支持 | 不支持 | |
| 不支持 | 不支持 | 不支持 | 支持 | 
图例
* 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=0 和 gpu_platform_id=1)。如果平台 0 是英特尔,它有一个设备(gpu_device_id=0)代表英特尔 GPU;如果平台 1 是 AMD,它有两个设备(gpu_device_id=0,gpu_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_id 和 gpu_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 = 0 和 gpu_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 = 0,gpu_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_id和- gpu_device_id可能会导致某些机器因 OpenCL 驱动问题而崩溃(您将丢失整个会话内容)。请注意这一点。
- 在某些系统上,如果您同时拥有集成显卡(Intel HD Graphics)和独立显卡(AMD、NVIDIA),独立显卡会自动覆盖集成显卡。解决方法是禁用独立显卡以使用集成显卡。