77

バックエンドとしてwithを使用するforeachループがあります。繰り返しごとにループに何かを出力させるにはどうすればよいですか?%dopar%doSNOW

以下のコードは現在使用しているものですが、何も印刷されていません。

foreach(ntree=rep(25,2),.combine=combine,.packages='randomForest',
    .inorder=FALSE) %dopar% {
        print("RANDOM FOREST")
        randomForest(classForm,data=data,na.action=na.action,do.trace=do.trace,ntree=ntree,mtry=mtry)
    }   
4

6 に答える 6

63

Snow ワーカーによって生成された出力はデフォルトで破棄されますが、makeCluster の「outfile」オプションを使用して変更できます。outfile を空の文字列 ("") に設定すると、snow が出力をリダイレクトするのを防ぎ、多くの場合、印刷メッセージからの出力がマスター プロセスのターミナルに表示されます。

次のような方法でクラスターを作成して登録するだけです。

library(doSNOW)
cl <- makeCluster(4, outfile="")
registerDoSNOW(cl)

foreach ループを変更する必要はまったくありません。

これは、Open MPI で構築された Rmpi​​ を使用する SOCK クラスターと MPI クラスターの両方で機能します。Windows では、Rgui を使用している場合、出力は表示されません。代わりに Rterm.exe を使用すると、そのようになります。

独自の出力に加えて、snow によって生成されたメッセージも表示されることに注意してください。これも役立ちます。


プログレスバーを使用するには、doSNOW バージョン 1.0.14 にprogressオプションがあります。完全な例を次に示します。

library(doSNOW)
library(tcltk)
library(randomForest)
cl <- makeSOCKcluster(3)
registerDoSNOW(cl)

ntasks <- 100
pb <- tkProgressBar(max=ntasks)
progress <- function(n) setTkProgressBar(pb, n)
opts <- list(progress=progress)

x <- matrix(runif(500), 100)
y <- gl(2, 50)

rf <- foreach(ntree=rep(25, ntasks), .combine=combine,
        .multicombine=TRUE, .packages='randomForest',
        .options.snow=opts) %dopar% {
  randomForest(x, y, ntree=ntree)
}

このprogressオプションは非常に一般的であるため、次のような関数を使用して単純にメッセージを出力できます。

progress <- function(n) cat(sprintf("task %d is complete\n", n))

この関数は、0、1、または 2 つの引数を取ることができます。最初に指定された引数は完了したタスクの総数で、2 番目は完了したばかりのタスクのタスク番号です。

最も単純な例は.、タスクが完了したときに a を出力するだけです。

progress <- function() cat('.')

この例では両方の引数が表示されており、タスクが常に順番どおりに完了するとは限らないことを示すために使用できます。

progress <- function(nfin, tag) {
  cat(sprintf('tasks completed: %d; tag: %d\n', nfin, tag))
}
于 2013-02-25T23:28:46.837 に答える
12

長い操作中にノードの進行状況を追跡する方法は、パッケージtkProgressBarから使用して進行状況バーを作成することです。tcltkそれはあなたが求めたものではありませんが、ノードから何かを見ることができるはずです。少なくとも、クラスターがローカル ホスト (Windows マシン) で実行されているソケット クラスターである場合はそうです。潜在的な問題は、進行状況バーが残ってモニターを乱雑にするか、closed になって印刷された情報がなくなることです。とはいえ、現状を知りたいだけだったので問題ありませんでした。

library(parallel)
library(doSNOW)
cl<-makeCluster(detectCores(),type="SOCK")
registerDoSNOW(cl)

コードを使用して、

foreach(ntree=rep(25,2),.combine=combine,.packages=c('randomForest','tcltk'),
    .inorder=FALSE) %dopar% {
        mypb <- tkProgressBar(title = "R progress bar", label = "",
          min = 0, max = 1, initial = 0, width = 300)
        setTkProgressBar(mypb, 1, title = "RANDOM FOREST", label = NULL)
    ans <- randomForest(classForm,data=data,na.action=na.action,do.trace=do.trace,ntree=ntree,mtry=mtry)
    close(mypb)
    ans
    }

より一般的な使用例を次に示します。

jSeq <- seq_len(30)

foreach(i = seq_len(2), .packages = c('tcltk', 'foreach')) %dopar% {
    mypb <- tkProgressBar(title = "R progress bar", label = "",
        min = 0, max = max(jSeq), initial = 0, width = 300)
    foreach(j = jSeq) %do% {
        Sys.sleep(.1)
        setTkProgressBar(mypb, j, title = "RANDOM FOREST", label = NULL)
    }
    NULL
}
于 2012-06-06T14:31:31.897 に答える
11

私も同じ問題を抱えていました。foreach パッケージを使用してランダム フォレストのパラメーターを調整していて、反復ごとに「結果」行を出力したかったのですが、プログレス バーなどを表示しないとわかりませんでした。

これが私がしたことです。私の機能では、この行を追加しました

write.table(result, file=paste("RF_ntree_",ntree,"_dims_",dims,".txt", sep=""),
  sep="\t", row.names=F)

したがって、すべての反復の後、結果は RF_ntree_250_dims_100.txt などの名前でテキスト ファイルに書き込まれます。

したがって、進行状況を追跡したい場合は、テキスト ファイルが書き込まれているフォルダーを更新するだけです。

PS: 結果もデータ フレームに蓄積されています。

于 2012-07-07T18:26:37.010 に答える
0

別の方法として、ファイル ロギング (たとえば、log4r パッケージ) を使用し、出力を画面に個別に出力します (たとえば、'tail -f' によって)。

とにかくログを作成することを検討している場合、これはうまく機能し、関連するすべての付属品で既存のパッケージを使用できます。

于 2017-05-26T18:57:15.753 に答える