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 |
---|---|---|---|---|
支持 |
支持 |
不支持 |
不支持 |
|
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。例如,如果您的系统有一个Intel集成GPU和两个AMD独立GPU,您将有两个OpenCL平台(gpu_platform_id=0
和 gpu_platform_id=1
)。如果平台0是Intel,它有一个设备(gpu_device_id=0
)代表Intel GPU;如果平台1是AMD,它有两个设备(gpu_device_id=0
,gpu_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_id
和 gpu_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 = 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),独立显卡会自动覆盖集成显卡。解决方法是禁用独立显卡以使用集成显卡。