2

並列化されたコードの実行にリモート スーパーコンピューターを使用する方法を学び始めたところです。この以前の投稿から多くの最初の助けを得ただけでなく、特に親切で辛抱強い XSEDE 担当者も 1 人助けてくれました。

私は (当面の間) 1 つのノードしか使用していませんが、それぞれの 32 コアです。スーパーコンピューターの担当者が Rmpi​​ を実行中なので、snow の代わりに doMC を使用しています。今のところ、32 コアで (それ以上) 十分なはずです。私のスクリプトは次のようなものです:

define a bunch of functions
load the data
call libraries
require(doMC)
require(plyr)
registerDoMC(32)

main.function <- function(data){
    *the function*
    }

results = llply(1:500, function(idx){out<-main.function(data)},.parallel=TRUE)

save(results,file="trestles_results")

これは自分のマシンで問題なく動作します(数回だけ実行するように設定し、いくつかのコアのみを登録します)。しかし、クラスターで実行すると、出力ファイルには 500 回の反復が実行されたことが示されますが、出力ファイルが得られず、次のエラー メッセージが表示されます。

Error in do.ply(i) : task 1 failed - "could not find function "getClass""
Calls: llply -> %dopar% -> <Anonymous>
Execution halted
Nodes:        trestles-10-28

ここで何が起こっているのか誰にも分かりますか?

前もって感謝します!

4

2 に答える 2

2

完全を期すために、*ply 関数には.paropts、クラスタ ノードに送信する変数とパッケージを指定できるビルトインがあります。

results = llply(1:500, 
          function(idx){out<-main.function(data)}, 
          .parallel=TRUE,
          .paropts=list(.export=c('data','main.function'),
                        .packages=.packages(all.available=T))

.packagesまたは、複雑さに応じて、より選択的にすることもできますmain.function。匿名関数内から呼び出しているため、クラスターにもmain.function渡す必要があると思います。main.function

于 2015-01-20T18:46:58.747 に答える