基于 R 的数组作业
Array job based on R
我正在尝试构建并提交一个数组作业 基于我大学的 HPC 中的 R。
我习惯于提交基于 Matlab 的数组作业 ,我对如何将整个过程转换为 R 有一些疑问。让我报告一个非常简单的 Matlab 示例和然后是我的问题。
代码基于 3 个文件:
- "main" 做一些初步的操作。
- “subf”应该由每个任务 运行 并使用一些由“main”创建的矩阵。
- 一个bash我在终端中qsub的文件。
1.主要:
clear
%% Do all the operations that are common across tasks
% Here, as an example, I create
% 1) a matrix A that I will sum to the output of each task
% 2) a matrix grid; each task will use some rows of the matrix grid
m=1000;
A=rand(m,m);
grid=rand(m,m);
%% Tasks
tasks=10; %number of tasks
jobs=round(size(grid,1)/tasks); %I split the number of rows of the matrix grid among the tasks
2。 subf:
%% Set task ID
idtemp=str2double(getenv('SGE_TASK_ID'));
%% Select local grid
if idtemp<tasks
grid_local= grid(jobs*(idtemp-1)+1: idtemp*jobs,:);
else
grid_local= grid(jobs*(idtemp-1)+1: end,:); %for the last task, we should take all the rows of grid that have been left
end
sg_local=size(grid_local,1);
%% Do the task
output=zeros(sg_local,1);
for g=1:sg_local
output(g,:)=sum(sum(A+repmat(grid_local(g,:),m,1)));
end
%% Save output by keeping track of task ID
filename = sprintf('output.%d.mat', ID);
save(filename,'output')
3。 bash
#$ -S /bin/bash
#$ -l h_vmem=6G
#$ -l tmem=6G
#$ -l h_rt=480:0:0
#$ -cwd
#$ -j y
#Run 10 tasks where each task has a different $SGE_TASK_ID ranging from 1 to 10
#$ -t 1-10
#$ -N Example
date
hostname
#Output the Task ID
echo "Task ID is $SGE_TASK_ID"
export PATH=/xx/xx/matlab/bin:$PATH
matlab -nodisplay -nodesktop -nojvm -nosplash -r "main; ID = $SGE_TASK_ID; subf; exit"
这些是我的问题:
假设我能够将“main”和“subf”翻译成 R 语言。我应该特别注意有关并行化的任何事情吗?比如我是否必须声明一些并行环境,比如parLapply或dopar?
在“主”文件中我还应该安装一些 R 包。我可以直接在“主”文件开头的文件夹中本地安装它们,还是应该联系 HPC 管理员在全局安装它们?
我在我的大学给出的说明中找不到 R 的任何 bash 文件示例。因此,我对如何重新适配上面的bash文件产生了疑惑。我想唯一要更改的行是:
export PATH=/xx/xx/matlab/bin:$PATH
matlab -nodisplay -nodesktop -nojvm -nosplash -r "main; ID = $SGE_TASK_ID; subf; exit"
你能给我一些关于我应该如何改变它们的提示吗?
并行化是由 HPC 处理的,对吗?在这种情况下,我认为“不”,没有什么特别需要的。
这取决于他们如何 allow/enable R。在我使用的 HPC(不是你的学校)中,各个节点无法直接访问互联网,因此需要特别小心;这可能是个例外,我不知道。
建议:如果有一个你和所有节点都可以访问的共享文件系统,那么在那里创建一个包含你需要的已安装包的 R“库”,然后在你的 R 中使用 .libPaths(...)
此处的脚本将其添加到包的搜索路径中。如果存在非 R 共享库(例如 .dll
、.so
、.a
)要求,唯一的问题可能是。为此,“docker”或“询问管理员”。
如果您没有共享文件系统,那么您可以询问集群管理员他们是否 use/prefer docker 图像(您可以提供图像或 DOCKERFILE
来创建一)或者如果他们有启用各种包的首选机制。
我不建议让他们安装软件包,原因有二:首先,想想他们需要对每个有工作的人都这样做 运行,对于任何数量的编程语言,然后意识到他们可能不知道如何为该语言做这件事。其次,软件包版本非常重要,您要求他们安装软件包可能会安装太新的软件包或覆盖其他人依赖的旧版本。 (有关 可重现环境 的讨论,请参阅 packrat
和 renv
。)
最重要的是,使用您控制的路径(并使用 .libPaths
)使您能够完全控制包版本。如果您没有被新版本软件包的意外后果所困扰,请稍等...恭喜您,您很幸运。
我建议您可以将 source("main.R")
添加到 subf.R
的开头,这将使您的 bash 文件可能像
一样简单
export PATH=/usr/local/R-4.x.x/bin:$PATH
Rscript /path/to/subf.R
(请注意,您需要在 subf.R
的某处引用 Sys.getenv("SGE_TASK_ID")
。)
我正在尝试构建并提交一个数组作业 基于我大学的 HPC 中的 R。 我习惯于提交基于 Matlab 的数组作业 ,我对如何将整个过程转换为 R 有一些疑问。让我报告一个非常简单的 Matlab 示例和然后是我的问题。
代码基于 3 个文件:
- "main" 做一些初步的操作。
- “subf”应该由每个任务 运行 并使用一些由“main”创建的矩阵。
- 一个bash我在终端中qsub的文件。
1.主要:
clear
%% Do all the operations that are common across tasks
% Here, as an example, I create
% 1) a matrix A that I will sum to the output of each task
% 2) a matrix grid; each task will use some rows of the matrix grid
m=1000;
A=rand(m,m);
grid=rand(m,m);
%% Tasks
tasks=10; %number of tasks
jobs=round(size(grid,1)/tasks); %I split the number of rows of the matrix grid among the tasks
2。 subf:
%% Set task ID
idtemp=str2double(getenv('SGE_TASK_ID'));
%% Select local grid
if idtemp<tasks
grid_local= grid(jobs*(idtemp-1)+1: idtemp*jobs,:);
else
grid_local= grid(jobs*(idtemp-1)+1: end,:); %for the last task, we should take all the rows of grid that have been left
end
sg_local=size(grid_local,1);
%% Do the task
output=zeros(sg_local,1);
for g=1:sg_local
output(g,:)=sum(sum(A+repmat(grid_local(g,:),m,1)));
end
%% Save output by keeping track of task ID
filename = sprintf('output.%d.mat', ID);
save(filename,'output')
3。 bash
#$ -S /bin/bash
#$ -l h_vmem=6G
#$ -l tmem=6G
#$ -l h_rt=480:0:0
#$ -cwd
#$ -j y
#Run 10 tasks where each task has a different $SGE_TASK_ID ranging from 1 to 10
#$ -t 1-10
#$ -N Example
date
hostname
#Output the Task ID
echo "Task ID is $SGE_TASK_ID"
export PATH=/xx/xx/matlab/bin:$PATH
matlab -nodisplay -nodesktop -nojvm -nosplash -r "main; ID = $SGE_TASK_ID; subf; exit"
这些是我的问题:
假设我能够将“main”和“subf”翻译成 R 语言。我应该特别注意有关并行化的任何事情吗?比如我是否必须声明一些并行环境,比如parLapply或dopar?
在“主”文件中我还应该安装一些 R 包。我可以直接在“主”文件开头的文件夹中本地安装它们,还是应该联系 HPC 管理员在全局安装它们?
我在我的大学给出的说明中找不到 R 的任何 bash 文件示例。因此,我对如何重新适配上面的bash文件产生了疑惑。我想唯一要更改的行是:
export PATH=/xx/xx/matlab/bin:$PATH matlab -nodisplay -nodesktop -nojvm -nosplash -r "main; ID = $SGE_TASK_ID; subf; exit"
你能给我一些关于我应该如何改变它们的提示吗?
并行化是由 HPC 处理的,对吗?在这种情况下,我认为“不”,没有什么特别需要的。
这取决于他们如何 allow/enable R。在我使用的 HPC(不是你的学校)中,各个节点无法直接访问互联网,因此需要特别小心;这可能是个例外,我不知道。
建议:如果有一个你和所有节点都可以访问的共享文件系统,那么在那里创建一个包含你需要的已安装包的 R“库”,然后在你的 R 中使用
.libPaths(...)
此处的脚本将其添加到包的搜索路径中。如果存在非 R 共享库(例如.dll
、.so
、.a
)要求,唯一的问题可能是。为此,“docker”或“询问管理员”。如果您没有共享文件系统,那么您可以询问集群管理员他们是否 use/prefer docker 图像(您可以提供图像或
DOCKERFILE
来创建一)或者如果他们有启用各种包的首选机制。我不建议让他们安装软件包,原因有二:首先,想想他们需要对每个有工作的人都这样做 运行,对于任何数量的编程语言,然后意识到他们可能不知道如何为该语言做这件事。其次,软件包版本非常重要,您要求他们安装软件包可能会安装太新的软件包或覆盖其他人依赖的旧版本。 (有关 可重现环境 的讨论,请参阅
packrat
和renv
。)最重要的是,使用您控制的路径(并使用
.libPaths
)使您能够完全控制包版本。如果您没有被新版本软件包的意外后果所困扰,请稍等...恭喜您,您很幸运。我建议您可以将
一样简单source("main.R")
添加到subf.R
的开头,这将使您的 bash 文件可能像export PATH=/usr/local/R-4.x.x/bin:$PATH Rscript /path/to/subf.R
(请注意,您需要在
subf.R
的某处引用Sys.getenv("SGE_TASK_ID")
。)