web-dev-qa-db-ja.com

シリアライズR関数の呼び出しエラー

次のパッケージをRにロードしています。

library(foreach)
library(doParallel)
library(iterators)

私は長い間コードを「並列化」していますが、最近、コードの実行中に断続的に停止します。エラーは:

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

以下のコマンドを使用して開いた接続が期限切れになっている可能性があります。

## Register Cluster
##
cores<-8
cl <- makeCluster(cores)
registerDoParallel(cl)

MakeClusterのマニュアルページを見ると、デフォルトでは接続が30日後にのみ期限切れになることがわかります。コードが停止したときに接続が開いているかどうかをオンザフライで確認するために、options(error = recover)を設定できましたが、この一般的な質問を以前に投稿することにしました。

重要:

1)エラーは本当に断続的です。時々、同じコードを再実行してもエラーは発生しません。 2)すべてを同じマルチコアマシン(Intel/8コア)で実行します。そのため、クラスター間の通信(ネットワーク)の問題ではありません。 3)私はラップトップとデスクトップ(64コア)でCPUとGPUの並列化を頻繁に使用しています。残念ながら、このタイプのエラーが発生するのは初めてです。

誰かが同じタイプのエラーを抱えていますか?

要求に応じて、sessionInfo()を提供しています。

> sessionInfo()
R version 2.15.3 (2013-03-01)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] TTR_0.22-0       xts_0.9-3        doParallel_1.0.1 iterators_1.0.6  foreach_1.4.0    Zoo_1.7-9        Revobase_6.2.0   RevoMods_6.2.0  

loaded via a namespace (and not attached):
[1] codetools_0.2-8 compiler_2.15.3 grid_2.15.3     lattice_0.20-13 tools_2.15.3   

@SeteveWeston、いずれかの呼び出しのエラーの下(これも断続的です):

starting worker pid=8808 on localhost:10187 at 15:21:52.232
starting worker pid=5492 on localhost:10187 at 15:21:53.624
starting worker pid=8804 on localhost:10187 at 15:21:54.997
starting worker pid=8540 on localhost:10187 at 15:21:56.360
starting worker pid=6308 on localhost:10187 at 15:21:57.721
starting worker pid=8164 on localhost:10187 at 15:21:59.137
starting worker pid=8064 on localhost:10187 at 15:22:00.491
starting worker pid=8528 on localhost:10187 at 15:22:01.855
Error in unserialize(node$con) : 
  ReadItem: unknown type 0, perhaps written by later version of R
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted

もう少し情報を追加します。 options(error = recover)を設定すると、次の情報が提供されました。

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

Enter a frame number, or 0 to exit   

1: #51: parallelize(FUN = "ensemble.prism", arg = list(prism = iis.long, instances = oos.instances), vectorize.arg = c("prism", "instances"), cores = cores, .export 
2: parallelize.R#58: foreach.bind(idx = i) %dopar% pFUN(idx)
3: e$fun(obj, substitute(ex), parent.frame(), e$data)
4: clusterCall(cl, workerInit, c.expr, exportenv, obj$packages)
5: sendCall(cl[[i]], fun, list(...))
6: postNode(con, "EXEC", list(fun = fun, args = args, return = return, tag = tag))
7: sendData(con, list(type = type, data = value, tag = tag))
8: sendData.SOCKnode(con, list(type = type, data = value, tag = tag))
9: serialize(data, node$con)

Selection: 9

接続がまだ利用可能であるかどうかを確認しようとしましたが、次のとおりです。

Browse[1]> showConnections()
   description                class      mode  text     isopen   can read can write
3  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
4  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
5  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
6  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
7  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
8  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
9  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
10 "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
Browse[1]> 

接続が開いており、エラー0はRバージョンを意味するため(@SteveWestonが指摘)、私は本当にここで何が起こっているのか理解できません。

編集1:

問題の回避策

コードは、関数に渡される引数に関しては問題ありません。したがって、@ MichaelFilosiによって提供された答えは、表にはあまり反映されていません。とにかく、あなたの答えに感謝します!

通話の何が問題だったのか正確にはわかりませんでしたが、少なくとも問題を回避することはできました。

トリックは、並列スレッドごとに、関数呼び出しの引数を小さなブロックに分割することでした。

魔法のようにエラーが消えました。

同じことがうまくいったかどうか教えてください!

32

これはメモリ不足が原因である可能性が高いです(詳細については、私の ブログ投稿 を参照してください)。このエラーの原因の例を次に示します。

> a <- matrix(1, ncol=10^4*2.1, nrow=10^4)
> cl <- makeCluster(8, type = "FORK")
> parSapply(cl, 1:8, function(x) {
+   b <- a + 1
+   mean(b)
+   })
Error in unserialize(node$con) : error reading from connection
13
Max Gordon

私はこの問題にかなりの間苦労し、.packages=c("ex1","ex2")を使用して、必要なすべてのパッケージをforeachループ内の引数に移動することで、この問題を修正することができました。以前はループ内でrequire("ex1")を使用したばかりで、これがエラーの根本的な原因であるようです。

全体として、これらのタイプのエラーを回避するために、可能な限りすべてをforeach引数に移動していることを確認します。

2
Johnathan A

Unserialize(node $ con)で同様のエラーErrorが発生しました:接続からの読み取りエラー

私はそれがC関数トラフ.Call()への呼び出しで欠落している引数であることを発見しました。

2
Michele Filosi

foreachバックエンドでdoSNOWを使用すると同じエラーが発生しました。

タイムアウト後にopと同じエラーを受け取りましたが、foreachを使用せずにタスクを実行すると、エラーは返されませんでした。

どうやら、タスクマネージャは、メモリ不足だけでなく、さまざまな理由でプロセスを強制終了できます。

私の特定のケースでは、問題は中心部の温度だったようです。 CPUコアの数を減らしてsys.sleep()を呼び出すと、システムが冷たくなり、エラーが表示されなくなりました。

試してみる価値があるかもしれません。

1
Elijah

同じ問題が発生していますが、メモリの問題ではないかと思います。私のコードは次のように単純です:

library(doParallel)
library(foreach)
cl <- makeCluster(2, outfile='LOG.TXT')
registerDoParallel(cl)
res <- foreach(x=1:10) %dopar% x

と私はLOG.TXT

starting worker pid=13384 on localhost:11776 at 18:25:29.873
starting worker pid=21668 on localhost:11776 at 18:25:30.266
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted

とにかくプログラムは動作するので、今のところ無視しました。ただし、これらのエラーをログファイルで確認するのはいつも不快です。

1
Yue Zhao

Shinyでは、並列コード内のreactValuesオブジェクトに書き込むことでこのエラーを引き起こしました

0
PeterVermont