使用 "boot" 包进行引导的 GPU 计算
GPU computing for bootstrapping using "boot" package
我想使用 bootstrapping 进行大量分析。我看到使用并行计算提高了 bootstrapping 的速度,如下面的代码所示:
并行计算
# detect number of cpu
library(parallel)
detectCores()
library(boot)
# boot function --> mean
bt.mean <- function(dat, d){
x <- dat[d]
m <- mean(x)
return(m)
}
# obtain confidence intervals
# use parallel computing with 4 cpus
x <- mtcars$mpg
bt <- boot(x, bt.mean, R = 1000, parallel = "snow", ncpus = 4)
quantile(bt$t, probs = c(0.025, 0.975))
然而,由于我的计算总量很大(10^6 回归,10,000 bootstrap 个样本),我读到有一些方法可以使用 GPU 计算来进一步提高速度( link1, link2)。您可以轻松地使用 GPU 计算和一些函数,例如:
GPU计算
m <- matrix(rnorm(10^6), ncol = 1000)
csm <- gpuR::colSums(m)
但在我看来,这些包只能处理一些特定的 R 函数,例如矩阵运算、线性代数或聚类分析 (link3)。
另一种方法是使用 CUDA/C/C++/Fortran 来创建自己的函数 (link4)。但我宁愿在 R 中寻找解决方案。
因此我的问题是:
是否可以使用 boot
包和其他 R 包(例如 quantreg
)将 GPU 计算用于 bootstrapping?
我认为现在不做任何额外的编程就不可能自由地获得gpu计算的能力。但是 gpuR 包是一个很好的起点。正如您所指出的,gpuR 只能处理一些特定的 R 函数,例如矩阵运算和线性代数,它虽然受限但很有用,例如,线性回归可以很容易地表述为线性代数问题。至于分位数回归,将其转化为线性代数并不像线性回归那样简单,但可以做到。比如你可以用Newton-Raphson算法或者其他一些数值优化算法来处理分位数回归(听起来并不难),牛顿算法是线性代数形式。
gpuR包已经隐藏了很多c++编程细节和硬件细节来利用gpu的计算能力,提供了相当易用的编程风格,只要我能想到的,就是这样用最少的努力实现你想要的:依靠 gpuR 包,在矩阵运算和线性代数(Newton Raphson 等)中制定你的问题并自己进行编程,或者你可以在 R 中找到一些 Newton Raphson 实现用于分位数回归,并做一些必要的小修改,例如,使用gpuMatrix而不是matrix等。希望对您有所帮助。
我想使用 bootstrapping 进行大量分析。我看到使用并行计算提高了 bootstrapping 的速度,如下面的代码所示:
并行计算
# detect number of cpu
library(parallel)
detectCores()
library(boot)
# boot function --> mean
bt.mean <- function(dat, d){
x <- dat[d]
m <- mean(x)
return(m)
}
# obtain confidence intervals
# use parallel computing with 4 cpus
x <- mtcars$mpg
bt <- boot(x, bt.mean, R = 1000, parallel = "snow", ncpus = 4)
quantile(bt$t, probs = c(0.025, 0.975))
然而,由于我的计算总量很大(10^6 回归,10,000 bootstrap 个样本),我读到有一些方法可以使用 GPU 计算来进一步提高速度( link1, link2)。您可以轻松地使用 GPU 计算和一些函数,例如:
GPU计算
m <- matrix(rnorm(10^6), ncol = 1000)
csm <- gpuR::colSums(m)
但在我看来,这些包只能处理一些特定的 R 函数,例如矩阵运算、线性代数或聚类分析 (link3)。 另一种方法是使用 CUDA/C/C++/Fortran 来创建自己的函数 (link4)。但我宁愿在 R 中寻找解决方案。
因此我的问题是:
是否可以使用 boot
包和其他 R 包(例如 quantreg
)将 GPU 计算用于 bootstrapping?
我认为现在不做任何额外的编程就不可能自由地获得gpu计算的能力。但是 gpuR 包是一个很好的起点。正如您所指出的,gpuR 只能处理一些特定的 R 函数,例如矩阵运算和线性代数,它虽然受限但很有用,例如,线性回归可以很容易地表述为线性代数问题。至于分位数回归,将其转化为线性代数并不像线性回归那样简单,但可以做到。比如你可以用Newton-Raphson算法或者其他一些数值优化算法来处理分位数回归(听起来并不难),牛顿算法是线性代数形式。
gpuR包已经隐藏了很多c++编程细节和硬件细节来利用gpu的计算能力,提供了相当易用的编程风格,只要我能想到的,就是这样用最少的努力实现你想要的:依靠 gpuR 包,在矩阵运算和线性代数(Newton Raphson 等)中制定你的问题并自己进行编程,或者你可以在 R 中找到一些 Newton Raphson 实现用于分位数回归,并做一些必要的小修改,例如,使用gpuMatrix而不是matrix等。希望对您有所帮助。