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),独立显卡会自动覆盖集成显卡。解决方法是禁用独立显卡以使用集成显卡。