14

myscript.Rジョブスケジューラ(具体的にはPBS)を使用してクラスタスレーブノードで実行する

現在、次のコマンドを使用してRスクリプトをスレーブノードに送信しています

qsub -S /bin/bash -p -1 -cwd -pe mpich 1 -j y -o output.log ./myscript.R

ヘッドノードでmyscript.Rを実行し、個々のタスクをスレーブノードに送信できる関数がRにありますか?何かのようなもの:

foreach(i=c('file1.csv', 'file2.csv', pbsoptions = list()) %do% read.csv(i)

更新:qsubコマンドの代替ソリューションは、@ Joshが指摘しているように#/usr/bin/Rscript、の最初の行から削除して直接呼び出すことです。myscript.R

qsub -S /usr/bin/Rscript -p -1 -cwd -pe mpich 1 -j y -o output.log myscript.R
4

4 に答える 4

5

Rスクリプト内からジョブを送信する場合は、「BatchJobs」パッケージを確認することをお勧めします。これがDESCRIPTIONファイルからの引用です:

PBS / Torque、LSF、SLURM、Sun Grid Engineなどのバッチコンピューティングシステムでジョブを生成するためのMap、Reduce、およびFilterバリアントを提供します。

BatchJobsは、RsgeやRlsfなどの以前の同様のパッケージよりも洗練されているようです。ジョブの結果を登録、送信、取得するための機能があります。簡単な例を次に示します。

library(BatchJobs)
reg <- makeRegistry(id='test')
batchMap(reg, sqrt, x=1:10)
submitJobs(reg)
y <- loadResults(reg)

バッチキューイングシステムを使用するには、BatchJobsを構成する必要があります。submitJobsの「resource」引数を使用して、ジョブに適切なリソースを要求できます。

このアプローチは、クラスターで長時間実行されるジョブが許可されていない場合、または長時間実行されるジョブの数が大幅に制限されている場合に非常に役立ちます。BatchJobsを使用すると、手動で行うことに関連するほとんどの作業を非表示にしながら、作業を複数のジョブに分割することで、これらの制限を回避できます。

ドキュメントと例は、プロジェクトのWebサイトで入手できます。

于 2014-04-14T14:29:09.300 に答える
4

ほとんどの作業では、(代わりに)qsubを使用して複数のRセッションを並行して実行します。

複数のファイル用の場合、私は通常次のことを行います。

while read infile rest
do
qsub -v infile=$infile call_r.sh 
done < list_of_infiles.txt

call_r.sh:

...
R --vanilla -f analyse_file.R $infile
...

analyse_file.R:

args <- commandArgs()
infile=args[5]
outfile=paste(infile,".out",sep="")...

その後、すべての出力を結合します...

于 2013-04-11T11:17:57.200 に答える
2

RパッケージRsgeを使用すると、SGE管理対象クラスターにジョブを送信できます。基本的に、必要な環境をディスクに保存し、ジョブ送信スクリプトを作成し、qsubを介して実行してから、結果を照合して返します。

基本的にqsubへの呼び出しをラップするため、PBSでも機能するはずです(ただし、PBSを知らないため、保証できません)。qsubコマンドと、Rsgeに関連付けられたグローバルオプション(options()出力の接頭辞sge。)を変更することで使用されるオプションを変更できます。

もはやCRANにはありませんが、githubから入手できます:https ://github.com/bodepd/Rsge 、これ以上維持されているようには見えませんが。

これを使用するには、パッケージに付属の適用タイプ関数の1つを使用します。sge.apply、sge.parRapply、sge.parCapply、sge.parLapply、およびsge.parSapplyは、apply、rapply、rapply(t(x)と同等の並列処理です。 、…)、それぞれlapplyとsapply。非並列関数に渡される標準パラメーターに加えて、他のいくつかのパラメーターが必要です。

njobs:             Number of parallel jobs to use

global.savelist:   Character vector giving the names of variables
                   from  the global environment that should be imported.

function.savelist: Character vector giving the variables to save from
                   the local environment.

packages:          List of library packages to be loaded by each worker process
                   before computation is started.

2つのsavelistパラメーターとpackagesパラメーターは、基本的に、コードを実行する前に、クラスターマシンで実行されているRの新しいインスタンスにロードする必要がある変数、関数、およびパッケージを指定します。Xのさまざまなコンポーネント(リストアイテムまたはdata.frameの行/列)は、njobsのさまざまなジョブに分割され、ジョブ配列としてSGEに送信されます。各ノードはRのインスタンスを開始し、指定された変数、関数、およびパッケージをロードし、コードを実行し、結果を保存してtmpファイルに保存します。制御Rインスタンスは、ジョブがいつ完了したかを確認し、tmpファイルからデータをロードし、結果を結合して最終結果を取得します。

たとえば、遺伝子リストのランダムサンプルの統計を計算します。

library(Rsge)
library(some.bioc.library)

gene.list <- read.delim(“gene.list.tsv”)

compute.sample <- function(gene.list) {
   gene.list.sample <- sample(1000, gene.list)
   statistic <- some.slow.bioc.function(gene.list.sample)
   return (statistic)

}

results <- sge.parSapply(1:10000, function(x) compute.sample,
                         njobs = 100,
                         global.savelist = c(“gene.list”),
                         function.savelist(“compute.sample”),
                         packages = c(“some.bioc.library”))
于 2014-04-15T13:15:16.353 に答える
1

ヘッドノードのスクリプトと一緒にタスクをスレーブノードに送信したい場合は、次のオプションがあると思います。

  1. すべてのスレーブノードとそれらを事前に割り当て、不要な場合はスタンバイ状態に保ちます(最初の回答で提案したように)。
  2. スレーブノードが必要になったときに新しいジョブを起動し、その結果をディスクに保存します。スレーブがタスクを完了するまでメインプロセスを保留にしてから、出力ファイルをアセンブルします。

オプション2は間違いなく可能ですが、実装にはかなり時間がかかります(実際に自分で数回実行しました)。@pallevillesenの答えはかなり的確です。

元の回答、誤解された質問

私自身はPBSを使ったことがありませんが、MPIジョブを送信するために使用できるようです。Rスクリプトを実行する前に、MPIモジュールをロードして、これらの行に沿ってシェルスクリプトをに送信する必要がある場合がありますqsub

#!/bin/bash
#PBS -N my_job
#PBS -l cput=10:00:00,ncpus=4,mem=2gb

module load openmpi
module load R
R -f myscript.R

これで、を使用してループを並行しdoSNOWて実行できるようになります。foraech

n.slaves <- 4

library(doSNOW)
cl <- makeMPIcluster(n.slaves)
registerDoSNOW(cl)

foreach(i=c('file1.csv', 'file2.csv'), pbsoptions = list()) %dopar% read.csv(i)
于 2014-04-11T08:15:35.137 に答える