web-dev-qa-db-ja.com

RのdoParallelエラー:serialize(data、node $ con)のエラー:接続への書き込みエラー

これは私のコードです。ループ内のものは理にかなっています。

        library(foreach)
        library(doParallel)
        cl <- makeCluster(7)
        registerDoParallel(cl) 

        elasticitylist = foreach(i=1:nhousehold) %dopar% {

            pricedraws = out$betadraw[i,12,] 
            elasticitydraws[,,i]= probarray[,,i] %*% diag(pricedraws)
            elasticitydraws[,,i] = elasticitydraws[,,i] * as.vector(medianpricemat)

        } 

私はこのエラーを受け取り続けます:

Error in serialize(data, node$con) : error writing to connection

十分な数のコアがあることを知っています(20あります)。誰かがこれを手伝ってくれる?答えはドキュメントにはありません!

UNIXサーバーでps -ef| grep userを実行すると、次のようになります。

/apps/R.3.1.2/lib64/R/bin/exec/R --slave --no-restore -e parallel:::.slaveRSOCK() --args MASTER=localhost PORT=11025 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE
21
wolfsatthedoor

関数serializeおよびunserializeは、マスタープロセスによって呼び出され、ソケットクラスターを使用するときにワーカーと通信します。これらの関数のいずれかからエラーが発生した場合、通常、少なくとも1つのワーカーが死亡したことを意味します。 Linuxマシンでは、マシンのメモリがほとんどなくなったために停止した可能性があり、メモリ不足のキラーがそれを強制終了することを決定しましたが、他にも多くの可能性があります。

クラスターオブジェクトを作成するときにmakeCluster outfile=""オプションを使用して、ワーカーからの出力が表示されるようにすることをお勧めします。運がよければ、ワーカーが死ぬ前にエラーメッセージが表示され、問題の解決に役立ちます。

12
Steve Weston

私のマシンの8つのコアすべてを使用しようとしたときに、同じ問題が発生しました。 1つを開いたままにしておくと、問題はなくなりました。システムのサービスタスクを開いたままにするには1コアが必要だと思います。そうしないと、エラーが発生します。

library(doParallel)
#Find out how many cores are available (if you don't already know)
cores<-detectCores()
#Create cluster with desired number of cores, leave one open for the machine         
#core processes
cl <- makeCluster(cores[1]-1)
#Register cluster
registerDoParallel(cl)
4
Odysseus Ithaca

このエラーメッセージを受け取った後、コードを非並列forループに変更しました。次に、「サイズ*** Gbのベクトルを割り当てることができません」というエラーメッセージが表示されました。並列失敗の原因は同じで、エラーメッセージが異なるだけだと思います。

1
Jfly

以下から同様のエラーを受け取りました。モデルのトレーニングによって早期に終了し、再度実行しようとしました。これは例です。caretパッケージを使用してモデルをトレーニングしていますが、並列処理が関係するすべてのアプリケーションに適用できると思います。

> cluster <- makeCluster(10)
> registerDoParallel(cluster)
> train(... , trControl = trainControl(allowParallel = T)
# Terminated before complete
> train(... , trControl = trainControl(allowParallel = T)
Error in serialize(data, node$con) : error writing to connection

クラスタを閉じて再起動しました。

stopCluster(cluster)
registerDoSEQ()
cluster <- makeCluster(10)
registerDoParallel(cluster)

モデルを再度実行してもエラーは発生しませんでした。時々それをオフにして再びオンにすることが本当に解決策になるかもしれません。

0
Anna