a******e 发帖数: 119 | 1 在写一个R function。打算对20k个subject分别做MCMC,MCMC做5000个iterations。也
就是说我要run 20k 个 loop, 每个loop都要做5k个iterations。目前大概需要运行几
个小时。有人建议我用apply instead of for loop,说这样可以大大加快运行速度。
这靠谱么?
有没有其他的建议可以加快运行速度的?多谢! | s*********e 发帖数: 1051 | 2 parallelism is the way to go. | S****E 发帖数: 150 | | g*******u 发帖数: 148 | 4 MCMC is not parallelizable
【在 s*********e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : parallelism is the way to go.
| k*******a 发帖数: 772 | 5 apply没用
首先,看看有没有一些code可以vectorize来提高运算,如果已经vectorize极限了,可
以考虑C++算
推荐用 Rcpp 来把运算最多的部分(比如posterior函数) 用C++ code写,Rcpp很好用
,写起来和写Rcode差不多。
或者,全部bayesian的运算都用C++写就更快了 | a******e 发帖数: 119 | 6 多谢各位的回复,
如果做parallelism,需要用什么package么?能否推荐个package?
kirklanda,能否展开说一下怎么vectorize? | k*******a 发帖数: 772 | 7 vectorize就是对matrix vector之类的能整体操作就整体操作,体现在程序的每一步,
你可以把你的一些code贴出来看有没有提高的空间
【在 a******e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 多谢各位的回复, : 如果做parallelism,需要用什么package么?能否推荐个package? : kirklanda,能否展开说一下怎么vectorize?
| A*****n 发帖数: 243 | 8 MCMC没法并行化,但是你的20k个subject可以并行化,而不是使用loop
最简单的一个方法就是用parallel包的mclapply函数,如果
机器的cpu比较多的话,时间就可以省下啦了。
apply的速度和for loop没有太多的区别,google一下可以发现有很多的
apply vs. for速度比较的blog。
【在 a******e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 在写一个R function。打算对20k个subject分别做MCMC,MCMC做5000个iterations。也 : 就是说我要run 20k 个 loop, 每个loop都要做5k个iterations。目前大概需要运行几 : 个小时。有人建议我用apply instead of for loop,说这样可以大大加快运行速度。 : 这靠谱么? : 有没有其他的建议可以加快运行速度的?多谢!
| a******e 发帖数: 119 | 9 for (g in 1:g)
{
for (m in 2:m)
{
lamda[m,]=sapply(Y[g,1:n],update.lamda)
beta[m]=rgamma(n=1,shape=n*alpha[m-1]+beta.shape,rate = (sum(lamda[m-1,]
)+beta.rate))
temp = rnorm(n=1,mean=alpha[m-1],sd=sigma)
den = (beta[m-1]^(n*alpha[m-1]))*((prod(lamda[m-1,]))^(alpha[m-1]-1))*(
exp(-alpha[m-1])*alpha.rate)/(gamma(alpha[m-1]))^n
num = (beta[m-1]^(n*temp))*((prod(lamda[m-1,]))^(temp-1))*(exp(-temp)*
alpha.rate)/(gamma(temp))^n
accep.prob=num/den
if((accep.prob>=u[m]) & (temp>0))
{
alpha[m]=temp
}else
{
alpha[m]=alpha[m-1]
}
mu1[m]=alpha[m]/beta[m]
}
for (m in 2:m)
{
lamda[m,]=sapply(Y[g,(n+1):(n+n)],update.lamda)
beta[m]=rgamma(n=1,shape=n*alpha[m-1]+beta.shape,rate = (sum(lamda[m-1,]
)+beta.rate))
temp = rnorm(n=1,mean=alpha[m-1],sd=sigma)
den = (beta[m-1]^(n*alpha[m-1]))*((prod(lamda[m-1,]))^(alpha[m-1]-1))*(
exp(-alpha[m-1])*alpha.rate)/(gamma(alpha[m-1]))^n
num = (beta[m-1]^(n*temp))*((prod(lamda[m-1,]))^(temp-1))*(exp(-temp)*
alpha.rate)/(gamma(temp))^n
accep.prob=num/den
if((accep.prob>=u[m]) & (temp>0))
{
alpha[m]=temp
}else
{
alpha[m]=alpha[m-1]
}
mu2[m]=alpha[m]/beta[m]
}
mu.diff[g,]=mu1-mu2
}
【在 k*******a 的大作中提到】![](/moin_static193/solenoid/img/up.png) : vectorize就是对matrix vector之类的能整体操作就整体操作,体现在程序的每一步, : 你可以把你的一些code贴出来看有没有提高的空间
| k*******a 发帖数: 772 | 10 lambda, beta 应该可以整体update
我是说可以去掉 for (m in 2:m) 这个loop
BTW: 为什么是 m in 2:m ?没写错?
,]
【在 a******e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : for (g in 1:g) : { : for (m in 2:m) : { : : lamda[m,]=sapply(Y[g,1:n],update.lamda) : beta[m]=rgamma(n=1,shape=n*alpha[m-1]+beta.shape,rate = (sum(lamda[m-1,] : )+beta.rate)) : temp = rnorm(n=1,mean=alpha[m-1],sd=sigma) : den = (beta[m-1]^(n*alpha[m-1]))*((prod(lamda[m-1,]))^(alpha[m-1]-1))*(
| | | a******e 发帖数: 119 | 11 m in 2:m
是因为我先 initialize了lamda,alpha和beta
如何整体update,m in 2:m 是MCMC的5000个iterations。 g in 1:g 是20k个subject
【在 k*******a 的大作中提到】![](/moin_static193/solenoid/img/up.png) : lambda, beta 应该可以整体update : 我是说可以去掉 for (m in 2:m) 这个loop : BTW: 为什么是 m in 2:m ?没写错? : : ,]
| K*****2 发帖数: 9308 | 12 这种还是写个shell script直接扔到学校的cluster上面算好了,别折磨自己的电脑 | P*****r 发帖数: 554 | 13 给个模板吧,我一般很土的用nohup R CMD
【在 K*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这种还是写个shell script直接扔到学校的cluster上面算好了,别折磨自己的电脑
| D******n 发帖数: 2836 | 14 apply好像其实是一个R loop的不是真的vectorization.
【在 a******e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 在写一个R function。打算对20k个subject分别做MCMC,MCMC做5000个iterations。也 : 就是说我要run 20k 个 loop, 每个loop都要做5k个iterations。目前大概需要运行几 : 个小时。有人建议我用apply instead of for loop,说这样可以大大加快运行速度。 : 这靠谱么? : 有没有其他的建议可以加快运行速度的?多谢!
| s*****n 发帖数: 2174 | 15 apply并不比for loop快, 一般情况下反而更慢. 只不过apply能让code比较elegant而
已.
lapply要快不少.
其实用R的话, 如果比较在意efficiency, 最需要注意的是如何handle objects, 那个
才是R慢的最常见原因. 其次才是avoiding explicit loops. | D******n 发帖数: 2836 | 16 好像lm object或者某个模型object就很坑爹的带了整个training data,害我要人工删
除。
【在 s*****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : apply并不比for loop快, 一般情况下反而更慢. 只不过apply能让code比较elegant而 : 已. : lapply要快不少. : 其实用R的话, 如果比较在意efficiency, 最需要注意的是如何handle objects, 那个 : 才是R慢的最常见原因. 其次才是avoiding explicit loops.
| s*****n 发帖数: 2174 | 17 R当初是为了run一些统计的东西设计的, 主要考虑的是方便, 所以很多object
handling都过于flexible以至于牺牲了performance. 举个最简单的例子, 就说data
frame吧, 其实就是个很慢的东西. 很多时候data manipulation的时候, 用matrix会快
的多.
data1 <- matrix(rep(0, 1e6), ncol = 1000, nrow = 1000)
data2 <- data.frame(data1)
object.size(data1)
object.size(data2) # almost same size
# 0.42秒
for (i in 1:1000){
for (j in 1:1000){
data1[i,j]
}
}
# 33.2秒
for (i in 1:1000){
for (j in 1:1000){
data2[i,j]
}
}
这几乎是100倍的速度差别, 就仅仅是data frame vs matrix. 两个例子里面都有双层
for loop. 其实for loop并不是最大的问题.
【在 D******n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 好像lm object或者某个模型object就很坑爹的带了整个training data,害我要人工删 : 除。
| g******i 发帖数: 118 | 18 赞一个,学习!
【在 s*****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : R当初是为了run一些统计的东西设计的, 主要考虑的是方便, 所以很多object : handling都过于flexible以至于牺牲了performance. 举个最简单的例子, 就说data : frame吧, 其实就是个很慢的东西. 很多时候data manipulation的时候, 用matrix会快 : 的多. : data1 <- matrix(rep(0, 1e6), ncol = 1000, nrow = 1000) : data2 <- data.frame(data1) : object.size(data1) : object.size(data2) # almost same size : # 0.42秒 : for (i in 1:1000){
| D******n 发帖数: 2836 | 19 as。matrix也很慢, 曾经在一个loop里面,放了这个就巨慢,后来干脆整个data都是
matrix就好多了。
【在 s*****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : R当初是为了run一些统计的东西设计的, 主要考虑的是方便, 所以很多object : handling都过于flexible以至于牺牲了performance. 举个最简单的例子, 就说data : frame吧, 其实就是个很慢的东西. 很多时候data manipulation的时候, 用matrix会快 : 的多. : data1 <- matrix(rep(0, 1e6), ncol = 1000, nrow = 1000) : data2 <- data.frame(data1) : object.size(data1) : object.size(data2) # almost same size : # 0.42秒 : for (i in 1:1000){
| B****n 发帖数: 11290 | 20 Haha 原來是這樣 解了我很久的疑惑
我對R要提高速度的建議也是vectorize 用vector or matrix來寫程式 確實差很多
或是把最耗時的用c++來run
如果有很明顯的loop結構 比方說run 1000次simulation可以平行咚利用cluster or
GPU
【在 s*****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : R当初是为了run一些统计的东西设计的, 主要考虑的是方便, 所以很多object : handling都过于flexible以至于牺牲了performance. 举个最简单的例子, 就说data : frame吧, 其实就是个很慢的东西. 很多时候data manipulation的时候, 用matrix会快 : 的多. : data1 <- matrix(rep(0, 1e6), ncol = 1000, nrow = 1000) : data2 <- data.frame(data1) : object.size(data1) : object.size(data2) # almost same size : # 0.42秒 : for (i in 1:1000){
| | | P*****s 发帖数: 758 | 21 这个很有意思,是为什么呢?是不是matrix在R底层存储的是连续的内存块,而
dataframe用的是列列分别存储?
【在 s*****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : R当初是为了run一些统计的东西设计的, 主要考虑的是方便, 所以很多object : handling都过于flexible以至于牺牲了performance. 举个最简单的例子, 就说data : frame吧, 其实就是个很慢的东西. 很多时候data manipulation的时候, 用matrix会快 : 的多. : data1 <- matrix(rep(0, 1e6), ncol = 1000, nrow = 1000) : data2 <- data.frame(data1) : object.size(data1) : object.size(data2) # almost same size : # 0.42秒 : for (i in 1:1000){
| n******7 发帖数: 12463 | 22 good to know
还能再多说说object handling的问题吗?
以前也是听说apply比for快,后来看了stackoverflow的讨论才发现自己很傻很天真
因为总觉得R慢,现在R都沦为我的画图工具了
【在 s*****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : R当初是为了run一些统计的东西设计的, 主要考虑的是方便, 所以很多object : handling都过于flexible以至于牺牲了performance. 举个最简单的例子, 就说data : frame吧, 其实就是个很慢的东西. 很多时候data manipulation的时候, 用matrix会快 : 的多. : data1 <- matrix(rep(0, 1e6), ncol = 1000, nrow = 1000) : data2 <- data.frame(data1) : object.size(data1) : object.size(data2) # almost same size : # 0.42秒 : for (i in 1:1000){
| s*r 发帖数: 2757 | | s*****n 发帖数: 2174 | 24 apply 比 for loop 稍慢, 但是code 更 clean 一些而已. | n*********n 发帖数: 5605 | 25 不快
【在 a******e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 在写一个R function。打算对20k个subject分别做MCMC,MCMC做5000个iterations。也 : 就是说我要run 20k 个 loop, 每个loop都要做5k个iterations。目前大概需要运行几 : 个小时。有人建议我用apply instead of for loop,说这样可以大大加快运行速度。 : 这靠谱么? : 有没有其他的建议可以加快运行速度的?多谢!
|
|