2010-06-29 10 views
8

Tôi đang chạy R trên một cụm Linux nhiều nút. Tôi muốn chạy phân tích của mình về R bằng cách sử dụng tập lệnh hoặc chế độ hàng loạt mà không cần sử dụng phần mềm tính toán song song như MPI hoặc tuyết.Lập trình R - gửi công việc trên một cụm Linux nhiều nút bằng PBS

Tôi biết điều này có thể được thực hiện bằng cách chia dữ liệu đầu vào sao cho mỗi nút chạy các phần khác nhau của dữ liệu.

Câu hỏi của tôi là làm thế nào để tôi thực hiện chính xác điều này? Tôi không chắc làm thế nào tôi nên mã kịch bản của tôi. Một ví dụ sẽ rất hữu ích!

Tôi đã chạy tập lệnh của mình cho đến nay bằng PBS nhưng dường như nó chỉ chạy trên một nút vì R là một chương trình chuỗi đơn. Do đó, tôi cần tìm ra cách điều chỉnh mã của mình để phân phối lao động cho tất cả các nút.

Dưới đây là những gì tôi đã và đang làm cho đến nay:

1) dòng lệnh:

> qsub myjobs.pbs 

2) myjobs.pbs:

> #!/bin/sh 
> #PBS -l nodes=6:ppn=2 
> #PBS -l walltime=00:05:00 
> #PBS -l arch=x86_64 
> 
> pbsdsh -v $PBS_O_WORKDIR/myscript.sh 

3) myscript .sh:

#!/bin/sh 
cd $PBS_O_WORKDIR 
R CMD BATCH --no-save my_script.R 

4) my_script.R:

> library(survival) 
> ... 
> write.table(test,"TESTER.csv", 
> sep=",", row.names=F, quote=F) 

gợi ý Bất kỳ sẽ được đánh giá cao! Cảm ơn bạn!

-CC

+0

bạn có chắc là pbs ra mắt nhiều phiên bản không? thử thêm 'echo $ (tên máy chủ)' vào tệp lô công việc – Anycorn

Trả lời

2

Đây đúng hơn là câu hỏi PBS; Tôi thường thực hiện một kịch bản R (với đường dẫn Rscript sau #!) Và làm cho nó thu thập một tham số (sử dụng chức năng commandArgs) điều khiển "phần nào của công việc" trường hợp hiện tại này nên thực hiện. Bởi vì tôi sử dụng multicore rất nhiều, tôi thường phải sử dụng chỉ 3-4 nút, vì vậy tôi chỉ cần gửi vài công việc gọi này kịch bản R với mỗi một giá trị đối số kiểm soát có thể.
Mặt khác, việc sử dụng pbsdsh của bạn nên thực hiện công việc ... Sau đó, giá trị PBS_TASKNUM có thể được sử dụng làm thông số điều khiển.

+2

Đây là một gợi ý thú vị. Bạn có thể vui lòng chia sẻ với chúng tôi Rscript của bạn bằng cách sử dụng "commandArgs" và "PBS" kịch bản? Nó không phải là rõ ràng về cách người ta sẽ đi về nó. Cảm ơn – Tony

1

Đây là câu trả lời cho câu hỏi liên quan - nhưng đó cũng là câu trả lời cho nhận xét ở trên (cũng).

Đối với hầu hết công việc của chúng tôi, chúng tôi chạy nhiều phiên R song song bằng cách sử dụng qsub (thay vào đó).

Nếu nó là dành cho nhiều file tôi thường làm:

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

call_r.pbs:

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

analyse_file.R:

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

Sau đó, tôi kết hợp tất cả các đầu ra sau đó ...

1

Điều này vấn đề có vẻ rất phù hợp để sử dụng GNU song song. GNU song song có một hướng dẫn tuyệt vời here.Tôi không quen thuộc với pbsdsh và tôi mới sử dụng HPC, nhưng đối với tôi, có vẻ như pbsdsh phục vụ một mục đích tương tự như GNU parallel. Tôi cũng không quen thuộc với phóng R từ dòng lệnh với các đối số, nhưng đây là dự đoán của tôi tại tập tin PBS của bạn sẽ trông như thế nào:

#!/bin/sh 
#PBS -l nodes=6:ppn=2 
#PBS -l walltime=00:05:00 
#PBS -l arch=x86_64 
... 
parallel -j2 --env $PBS_O_WORKDIR --sshloginfile $PBS_NODEFILE \ 
    Rscript myscript.R {} :::: infilelist.txt 

nơi infilelist.txt liệt kê các file dữ liệu bạn muốn để xử lý, ví dụ:

inputdata01.dat 
inputdata02.dat 
... 
inputdata12.dat 

myscript.R của bạn sẽ truy cập đối số dòng lệnh để tải và xử lý tệp đầu vào được chỉ định.

Mục đích chính của tôi với câu trả lời này là chỉ ra sự sẵn có của GNU song song, xuất hiện sau khi câu hỏi ban đầu được đăng. Hy vọng rằng một người khác có thể cung cấp một ví dụ hữu hình hơn. Ngoài ra, tôi vẫn lúng túng với việc sử dụng của tôi là parallel, ví dụ, tôi không chắc chắn về tùy chọn -j2. (Xem số related question của tôi.)