2

Parallel R の初心者です。簡単な質問です。私は計算集約的なアルゴリズムを持っています。multicore幸いなことに、またはを使用するために簡単に分割できますsnow。私が知りたいのは、実際にmulticoreと組み合わせて使用​​しても問題ないと考えられるsnowかどうかです。

私がやりたいことは、負荷を分割して、クラスター内の複数のマシンと各マシンで実行することです。マシン上のすべてのコアを利用したいと考えています。この種の処理では、雪を混ぜるのは合理的multicoreですか?

4

1 に答える 1

1

私は、ロックオフによって上記で提案されたアプローチを使用しました。つまり、並列パッケージを使用して、複数のコアを備えた複数のマシンに驚異的並列ワークロードを分散します。最初にワークロードがすべてのマシンに分散され、次に各マシンのワークロードがすべてのコアに分散されます。このアプローチの欠点は、マシン間で負荷分散が行われないことです(少なくとも方法はわかりません)。

ロードされたすべてのrコードは同じであり、すべてのマシン(svn)の同じ場所にある必要があります。クラスターの初期化にはかなりの時間がかかるため、作成したクラスターを再利用することで、以下のコードを改善できます。

foo <- function(workload, otherArgumentsForFoo) {
    source("/home/user/workspace/mycode.R")
    ...
}

distributedFooOnCores <- function(workload) {
    # Somehow assign a batch number to every record
    workload$ParBatchNumber = NA
    # Split the assigned workload into batches according to DistrParNumber
    batches = by(workload, workload$ParBatchNumber, function(x) x)

    # Create a cluster with workers on all machines 
    library("parallel")
    cluster = makeCluster(detectCores(), outfile="distributedFooOnCores.log")
    batches = parLapply(cluster, batches, foo, otherArgumentsForFoo)
    stopCluster(cluster)

    # Merge the resulting batches
    results = someEmptyDataframe
    p = 1;
    for(i in 1:length(batches)){
        results[p:(p + nrow(batches[[i]]) - 1), ] = batches[[i]]
        p = p + nrow(batches[[i]])      
    }

    # Clean up
    workload$ParBatchNumber = NULL
    return(invisible(results))
}

distributedFooOnMachines <- function(workload) {
    # Somehow assign a batch number to every record
    workload$DistrBatchNumber = NA
    # Split the assigned activity into batches according to DistrBatchNumber
    batches = by(workload, workload$DistrBatchNumber, function(x) x)

    # Create a cluster with workers on all machines 
    library("parallel")
    # If makeCluster hangs, please make sure passwordless ssh is configured on all machines
    cluster = makeCluster(c("machine1", "etc"), master="ub2", user="", outfile="distributedFooOnMachines.log")
    batches = parLapply(cluster, batches, foo, otherArgumentsForFoo)
    stopCluster(cluster)

    # Merge the resulting batches
    results = someEmptyDataframe
    p = 1;
    for(i in 1:length(batches)){
        results[p:(p + nrow(batches[[i]]) - 1), ] = batches[[i]]
        p = p + nrow(batches[[i]])      
    }

    # Clean up
    workload$DistrBatchNumber = NULL
    return(invisible(results))
}

上記のアプローチをどのように改善できるかに興味があります。

于 2012-11-30T10:15:25.483 に答える