2017-12-14 1 views
4

나는 다른 R 패키지 (survival, nbpMatching, MASS)에 의존하고 더 많은 의존성을 가져 오는 the R package crossmatch을 사용하고 있습니다. 크로스 매치 패키지는 (잠재적으로) 큰 매트릭스에 대한 통계 테스트를 구현하는데, 이는 (MCMC 알고리즘 내에서) 매우 자주 계산해야합니다. 나는 (마지막 줄에 crossmatchtest()입니다) 실제 시험이 계산되기 전에 몇 가지 전처리 단계를 계산 다음 래퍼 작성했습니다 :R에 사용되는 CPU 수를 제어하는 ​​방법은 무엇입니까?

# wrapper function to directly call the crossmatch test with a single matrix 
# first column of the matrix must be a binary group indicator, following columns are observations 
# code is modified from the documentation of the crossmatch package 
crossmatchdata <- function(dat) { 

    # the grouping variable should be in the first column 
    z = dat[,1] 
    X = subset(dat, select = -1) 

    ## Rank based Mahalanobis distance between each pair: 
    # X <- as.matrix(X) 
    n <- dim(X)[1] 
    k <- dim(X)[2] 

    for (j in 1:k) { 
    X[, j] <- rank(X[, j]) 
    } 

    cv <- cov(X) 
    vuntied <- var(1:n) 
    rat <- sqrt(vuntied/diag(cv)) 

    cv <- diag(rat) %*% cv %*% diag(rat) 
    out <- matrix(NA, n, n) 

    icov <- ginv(cv) 
    for (i in 1:n) { 
    out[i, ] <- mahalanobis(X, X[i, ], icov, inverted = TRUE) 
    } 

    dis <- out 

    ## The cross-match test: 
    return(crossmatchtest(z, dis)) 
} 

내가 눈치 챘을 그 행렬 오히려 작은 경우,이 테스트 하나의 CPU 만 사용합니다.

library(MASS) 
library(crossmatch) 
source("theCodeFromAbove.R") 
# create a dummy matrix 
m = cbind(c(rep(0, 100), rep(1, 100))) 
m = cbind(m, (matrix(runif(100), ncol=10, nrow=20, byrow=T))) 
while(TRUE) { crossmatchdata(m) } 

htop으로 모니터링합니다.

# create a dummy matrix 
m = cbind(c(rep(0, 1000), rep(1, 1000))) 
m = cbind(m, (matrix(runif(100000), ncol=1000, nrow=2000, byrow=T))) 
while(TRUE) { crossmatchdata(m) } 

나는 일반적으로이 병렬화와 괜찮아하지만 난 싶습니다 :이 매트릭스를 증가하고있어 경우에 (적어도가이 모양)을 사용할 수 있습니다 그러나, R은 많은 코어를 사용합니다 R 프로세스가 사용하는 코어 수를 수동으로 제어 할 수 있습니다. 나는 성공하지 못한 채 options(mc.cores = 4)을 시도했다.

내가 설정할 수있는 다른 변수가 있습니까? 또는 하나 이상의 코어를 사용하는 패키지를 찾는 가장 좋은 방법은 무엇입니까? 종속성에서

+2

먼저 코드의 어느 부분이 병렬화되는지 알려줄 필요가 있습니다. 당신이 사용하는 기능은 무엇입니까? 아니면 R에 링크 된 BLAS 내의 병렬 처리입니까? 바닐라 (기본) R은 병렬 처리되지 않습니다. – Roland

+0

그게 내 질문의 핵심이야. 나는 어떤 코드도 병렬 처리하지 않았다. 자동적으로 어딘가에서 의존성이 깊어지고 어디서부터인지 모른다. 나는 crossmatch를 위해 문서에서 nbpMatching과 MASS를 보았다. 그들은 평행 화에 대해 말하고 있지만 그렇지 않은지 알아 보았다. 편집 : 위의 코드는 자신의 PC에서이 코드를 실행하기에 충분해야합니다. 흥미롭게도 병렬화는 Ubuntu 16.04 및 MacOS 10.12에서만 발생했지만 Fedora 27에서는 발생하지 않았습니다. – kartoffelsalat

답변

1

살펴 보자 : 꽤 몇 가지 의존성이다

library(miniCRAN) 
tags <- "crossmatch" 
dg <- makeDepGraph(tags, enhances = FALSE, suggests = FALSE) 
set.seed(1) 
plot(dg, legendPosition = c(-1, 1), vertex.size = 20) 

resulting plot of dependencies

. 첫눈에 R 레벨 병렬화를위한 패키지가 없습니다. 컴파일 된 코드를 통해 병렬 처리를 사용하는 패키지의 가능성이 사라집니다. 그러한 패키지 중 하나는 data.table (다른 것이있을 수도 있음)입니다. setDTthreads(1)을 사용하면 병렬 처리를 해제하십시오.

물론 R을 최적화 된 BLAS에 연결할 수도 있습니다. 이 경우 행렬 대수에서 병렬 처리가 일어날 가능성이 큽니다.

업데이트 : RhpcBLASctl을 패키지 및 OpenMPController는 BLAS 또는 OpenMP의에 의해 사용되는 코어의 수를 제어 할 수

@Dirk Eddelbuettel just pointed out. kartoffelsalat에 의해

편집 :

우분투 16.04 아래의 문제의 문제에 대한 일 다음. macOS에서는 작동하지 않았습니다 (패키지 OpenMPController도 마찬가지입니다).

library(RhpcBLASctl) 
blas_set_num_threads(3) 
+0

아,이 흥미로운 그래프 덕분입니다. 분명히 data.table은 내가 이번에 mac을로드 할 때 다음과 같이보고하기 때문에 내 문제의 원인이 아닙니다 : "이 설치 data.table은 OpenMP 지원을 감지하지 못했습니다. 스레드 모드. " R이 최적화 된 BLAS에 링크되어 있는지 확인하고 BLAS에 최대 스레드 수를 제공 할 수있는 방법은 무엇입니까? – kartoffelsalat

+0

R을 어떻게 설치 했습니까? CRAN R입니까? 최적화 된 BLAS에 직접 링크하지 않았습니다. – Roland

+0

Mac에서는 homebrew와 함께 설치했습니다. 다른 컴퓨터 (우분투 16.04, fedora 27)에서는 기본 배포판의 소프트웨어 저장소에서 가져옵니다. R에 링크 된 버전이 있는지 확인하는 명령이 없습니까? – kartoffelsalat

관련 문제