2016-09-01 7 views
1

遺伝的最適化ツールgenoudlibrary(rgenoud)Rに最適化しようとしています。 Rで並列処理を設定した経験はありません。複数のクラスタ並列処理で一部のノードで使用できないオブジェクト

genoudには、makeClustersの名前が知られているclusterオプションが組み込まれています。私は、単一のマルチコアマシン上で並列処理をセットアップしたいと考えています。私はローカルマシンの名前がlocalhostであることを理解しています。名前を繰り返すと、マシン上に複数のコアが使用されます。

このアプローチは、次のような単純な関数のために正常に動作しているようだ:

genout <- genoud(sin, 1, cluster=c('localhost','localhost','localhost')) 

私は、より複雑な機能構造を最適化する場合しかしながら、機械や環境のいくつかが、すべての機能を見つけることができません。これは

Error in checkForRemoteErrors(val) : 
    3 nodes produced errors; first error: could not find function "fun1" 

一つの解決策はfun2fun1を埋め込むことであると考えられるエラーになります

fun1 <- function(x) {sin(x)} 
fun2 <- function(x) { 
    x <- fun1(x) 
    ret <- x + cos(x) 
    return(ret) 
    } 
genout <- genoud(fun2, 1, cluster=c('localhost','localhost','localhost')) 

:ここでは一例です。しかし、fun2が(多くの場合、愚かな例以外の)多くの回数実行された場合、これは非効率的です。この問題を解決する唯一の方法はfun1fun2に埋め込むことです。

編集:埋め込む場合でも、オブジェクトがgenoud経由fun2に渡す必要がより多くの問題があり、以下を参照してください

y=1 
fun2 <- function(x,z) { 
    fun1 <- function(x) {sin(x)} 
    x <- fun1(x) 
    ret <- x + cos(x)*z 
    return(ret) 
} 
genout <- genoud(fun2, 1, cluster=c('localhost','localhost','localhost'), z=y) 

>Error in checkForRemoteErrors(val) : 
    3 nodes produced errors; first error: object 'y' not found 

答えて

1

私は問題はgenoud機能が適切に評価していないことだと思います追加の議論を労働者に送った。この場合、引数zは評価されずにワーカーに送信されるため、ワーカーは評価する必要がありますが、変数yがワーカーに送信されなかったために失敗します。

回避策genoudが使用するため、明示的にクラスタオブジェクトを作成する必要がclusterExportを使用して、労働者に必要な変数をエクスポートすることです:

library(rgenoud) 
library(parallel) 
cl <- makePSOCKcluster(3) 
fun1 <- function(x) {sin(x)} 
fun2 <- function(x, z) { 
    x <- fun1(x) 
    x + cos(x) * z 
} 
y <- 1 
clusterExport(cl, c('fun1', 'y')) 
genout <- genoud(fun2, 1, cluster=cl, z=y) 

をこれもするので必要であるfun1を、エクスポートgenoudfun2がそれに依存していることを知らない。

+0

ありがとうございます。この回答は網羅的です。 – tomka

関連する問題