Fw: [筆記] R 的設定-平行運算 (CPU)
※ [本文轉錄自 Statistics 看板 #1D-QxyXv ]
作者: gsuper (統計的巴比倫塔) 看板: Statistics
標題: [問題] R 的設定 (CPU)
時間: Thu Jun 16 15:21:29 2011
請問一下
再 linux 下有沒有辦法把 CPU 的多個核心分配給 R?
因為我的電腦有8核
可是每次都只有一個 core 跑 100%
是否有辦法設定成多核運算?
---------------------------------------
我有查到一個 "multicore" 的 package
可是看起來好難...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.239.247
※ 編輯: gsuper 來自: 140.113.239.247 (06/16 15:27)
推
06/16 18:56, , 1F
06/16 18:56, 1F
→
06/16 18:57, , 2F
06/16 18:57, 2F
本篇的 reference
→
06/16 19:06, , 3F
06/16 19:06, 3F
→
06/16 19:13, , 4F
06/16 19:13, 4F
→
06/16 19:13, , 5F
06/16 19:13, 5F
推
06/16 19:49, , 6F
06/16 19:49, 6F
→
06/16 20:06, , 7F
06/16 20:06, 7F
→
06/16 21:27, , 8F
06/16 21:27, 8F
→
06/16 21:28, , 9F
06/16 21:28, 9F
→
06/16 21:29, , 10F
06/16 21:29, 10F
→
06/16 21:31, , 11F
06/16 21:31, 11F
→
06/16 21:31, , 12F
06/16 21:31, 12F
→
06/16 21:33, , 13F
06/16 21:33, 13F
→
06/16 21:40, , 14F
06/16 21:40, 14F
→
06/16 21:41, , 15F
06/16 21:41, 15F
※ 編輯: gsuper 來自: 140.113.239.247 (06/16 23:21)
→
06/17 13:35, , 16F
06/17 13:35, 16F
筆記開始
-------------------------------------------------------------
先安裝 snow 與 Rmpi
在 ubontu 圖形介面下 , 直接在
"管理" -> "Synnaptic 安裝套件"
分別搜尋
r-cran-Rmpi
r-cran-snow
進行安裝
------------------------------------------------------------
http://www.sfu.ca/~sblay/R/snow.html#clusterCall
這是一些 snow 的函式教學
很容易學
主要分成三個步驟
下面有操作簡介
---------------------------------------------------
StepA
cl <- makeCluster(4,type="MPI")
4為想要用的核的數目
type 有很多種
"SOCK","PVM","MPI","NWS" (有空再來學這些東西的意義)
一旦做了以下的指令
library(snow)
cl <- makeCluster(4,type="MPI")
就可以在 top 看到 (linux 的工作管理員)
R 變成 4 組 (平行CPU分配 , 連結成功)
-------------------------------------------------
再來是 StepB
parApply (相同於 apply 的用法 , 但速度比 parCapply 和 parRapply 慢)
parCapply (Column apply , 不需要下 MARGIN=2 的參數)
parRapply ( Row apply , 不需要下 MARGIN=1 的參數)
parSapply
parLapply
這些升級過的函式
重點只有一個
就是在原本的應用方式上
加上一個 cl 變數
比方說
apply ( x,1,paste,collapse="")
parApply (cl,x,1,paste,collapse="")
parRapply(cl,x, paste,collapse="")
------------------------------------------------
StepC
最後一定要記得下一個指令
stopCluster(cl)
把多核的分配結束掉 (資源吃很大)
若 [R] 不正常中止
也需要去 top 自己把程序 kill 掉
不然會變成殭屍程式
------------------------------------------------
以下是我比較速度的程式
我有8核 , 所以開 2~7核 , 測50次
library(snow)
SPEED <- matrix(0,3,8)
rownames(SPEED) <- c("parRapply","parApply","apply")
colnames(SPEED) <- c(paste(1:8,"CORE",sep="_"))
SPEED_MULTI <- list(NULL)
x <- matrix(sample(c("A","T","C","G"),100000,T),50000,2)
for(k in 1:50)
{
for(g in 2:7)
{
cl <- makeCluster(g,type="MPI")
SPEED[1,g] <- system.time(parRapply(cl,x, paste,collapse=""))[3] #平行
SPEED[2,g] <- system.time(parApply (cl,x,1,paste,collapse=""))[3] #平行
SPEED[3,g] <- system.time( apply ( x,1,paste,collapse=""))[3] #非平行
stopCluster(cl)
print(g)
}
SPEED_MULTI[[k]] <- SPEED
}
PAR_RAPPLY <- t(sapply(SPEED_MULTI,function(tmp){tmp[1,c(-1,-8)]}))
PAR_APPLY <- t(sapply(SPEED_MULTI,function(tmp){tmp[2,c(-1,-8)]}))
---------------------------------------------------------
先從單一次的時間測試可看到
在速度上 parRapply > parApply > apply
> SPEED
1_CORE 2_CORE 3_CORE 4_CORE 5_CORE 6_CORE 7_CORE 8_CORE
parRapply 0 0.288 0.226 0.277 0.260 0.235 0.311 0
parApply 0 0.353 0.309 0.451 0.444 0.438 0.434 0
apply 0 0.439 0.464 0.709 0.716 0.742 0.706 0
----------------------------------------------------------
從50次的平均速度來看
開3核似乎是最快的
> colMeans(PAR_RAPPLY)
2_CORE 3_CORE 4_CORE 5_CORE 6_CORE 7_CORE
0.31814 0.24738 0.27184 0.26138 0.25736 0.27146
> colMeans(PAR_APPLY)
2_CORE 3_CORE 4_CORE 5_CORE 6_CORE 7_CORE
0.35836 0.31936 0.36772 0.40882 0.42408 0.43074
------------------------------------------------
從 50 次的標準差來看
有時 4核5核 比較穩定
有時 3核7核 比較穩定
沒有明顯的贏家
> apply(PAR_RAPPLY,2,sd)
2_CORE 3_CORE 4_CORE 5_CORE 6_CORE 7_CORE
0.05133762 0.04803141 0.01216613 0.02597243 0.04290034 0.04530721
> apply(PAR_APPLY,2,sd)
2_CORE 3_CORE 4_CORE 5_CORE 6_CORE 7_CORE
0.04761742 0.04154111 0.05557053 0.05804034 0.04591911 0.02569746
-------------------------------------------------
結論 :
1. 平行運算在速度上
至少可加速一倍
2. 在 Ram 夠用的情況下
開3核或6核較好
但推測每台電腦可能會不一樣
3. 平均效能
6核 > 5核 > 4核 > 7核的原因可能是
我的8核中 , 1個分配給虛擬機
所以實質上是 7 核
由於 linux 也要1核
所以當我開 7 核平行時
搶占 linux 的資源
因此反而速度下降
4. 依舊不能理解的問題
是為什麼 3核 會比 6核 還快
※ 編輯: gsuper 來自: 140.113.239.247 (06/23 15:59)
※ 編輯: gsuper 來自: 140.113.239.247 (06/23 16:01)
※ 編輯: gsuper 來自: 140.113.239.247 (06/23 16:09)
※ 編輯: gsuper 來自: 140.113.239.247 (06/23 16:09)
※ 編輯: gsuper 來自: 140.113.239.247 (06/23 16:10)
※ 編輯: gsuper 來自: 140.113.239.247 (06/23 16:10)
※ 編輯: gsuper 來自: 140.113.239.247 (06/23 16:10)
※ 編輯: gsuper 來自: 140.113.239.247 (06/23 16:15)
※ 編輯: gsuper 來自: 140.113.239.247 (06/23 16:24)
※ 編輯: gsuper 來自: 140.113.239.247 (06/23 16:26)
→
06/24 00:58, , 17F
06/24 00:58, 17F
→
06/24 00:58, , 18F
06/24 00:58, 18F
→
06/24 00:59, , 19F
06/24 00:59, 19F
→
06/24 01:00, , 20F
06/24 01:00, 20F
→
06/24 01:01, , 21F
06/24 01:01, 21F
→
06/24 01:02, , 22F
06/24 01:02, 22F
→
06/24 01:02, , 23F
06/24 01:02, 23F
→
06/24 01:06, , 24F
06/24 01:06, 24F
推
06/24 09:30, , 25F
06/24 09:30, 25F
※ 編輯: gsuper 來自: 218.160.244.59 (06/25 04:17)
推
06/28 16:25, , 26F
06/28 16:25, 26F
→
06/28 16:32, , 27F
06/28 16:32, 27F
※ 發信站: 批踢踢實業坊(ptt.cc)
※ 轉錄者: gsuper (140.113.239.247), 時間: 03/30/2013 20:32:45
推
03/30 23:33, , 28F
03/30 23:33, 28F
範例 : 計算相關係數
當矩陣極大時 (480000 x 800), 48萬 rows, 800 samples (file size = 3.64Gb)
計算相關係數或 distance matrix
將 800 samples 切分
假設 split = 10
切分成 10 個 480000 x 80 小矩陣
where S = S1, S2, ...., S80
彼此兩兩計算相關係數
where cor(S1,S2)
再合併為1個大相關係數矩陣
則平行運算要開多少核?
split 要下多少才合適?
Ans :
當 split = 5, 需要進行 C5取2 + 5 = 15 次比較
當 split = 10, 需要進行 C10取2 + 10 = 55 次比較
經驗法則, 開平行運算時
核心重複使用會拖慢速度 (若核心數低於計算次數, 也等於核心重複使用)
因此, 上述狀況,
當 split = 5 時, 給 15 核
當 split = 10 時, 開 55 核
core <- ncol(combn(split,2)) + split
以下為實測結果
######################################################
### spearman (samples = 791)
### Row Core Split Time
### 10w 1 1 160s
### 10w 10 5 81s (insufficient core)
### 10w 10 10 114s (insufficient core)
### 10w 10 15 skip (insufficient core)
### 10w 10 20 skip (insufficient core)
### 10w 20 5 48s (1.x times)
### 10w 20 10 68s (insufficient core)
### 10w 20 15 91s (insufficient core)
### 10w 20 20 116s (insufficient core)
### 10w 40 5 50s (2.x times)
### 10w 40 10 57s (insufficient core)
### 10w 40 15 72s (insufficient core)
### 10w 40 20 88s (insufficient core)
### 10w 60 5 50s (4 times)
### 10w 60 10 47s (1.x times)
### 10w 60 15 68s (insufficient core)
### 10w 60 20 91s (insufficient core)
### 10w 15 5 48s * [best match]
### 10w 21 6 46s * [best match]
### 10w 28 7 39s * [best match]
### 10w 36 8 40s * [best match]
### 10w 45 9 40s * [best match]
### 10w 55 10 43s * [best match]
################################################
實測結果顯示
1. 用剛剛好的 cores 數量, 速度最佳, 甚至優於多給 cores
2. split 過大, 對速度沒幫助, 吃的核心變多, 浪費資源
3. 當 split 不足時, 切分的小矩陣過大, 仍會有運算壓力
4. 承3, 可事前測試各個 function 的最大記憶體耐受值, 即可決定 split number
Note :
我是 AMD64核, 記憶體接近無限
由於 speed of Intel CPU >> AMD CPU , 因此本文不適用於 intel CPU
※ 編輯: gsuper (114.32.201.238), 05/04/2015 16:24:55
############################################################
############################################################
############################################################
# foreach 的用法
# 注意存變數會出問題, 要用 res 這個變數來解決
# 直接用於作圖或存出實體檔案都相當不錯
# 盡量讓 loop number %% cores number 能整除
require(doMC)
library(parallel)
registerDoMC(cores = 4)
library(foreach)
res <- foreach(g = 1:ncol(DATA)) %dopar%
{ exprs() }
※ 編輯: gsuper (114.32.201.238), 05/26/2015 14:32:26
※ 編輯: gsuper (114.32.201.238), 05/26/2015 14:33:00
[快速讀檔]
library(data.table)
fread("./table.txt")
※ 編輯: gsuper (114.32.201.238), 06/05/2015 13:57:07
※ 編輯: gsuper (114.32.201.238), 06/05/2015 13:58:54
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章