4

我的大学运行一个 condor 计算网格(计算节点运行 Linux),我想用它在 R 中运行模拟。问题是网格上只有一些机器安装了 R。到目前为止,我看到了两个选项,但我不知道如何实现任何一个,所以我希望你能帮助我(请记住,我不是系统管理员,不能做太多更改设置计算节点):

1) 在与我的 condor 提交文件一起发出的 ClassAds 中进行检查,以要求在具有/usr/bin/R.

2) 将 R 及其所有依赖项打包到一个独立的目录中,该目录可以发送到计算节点,并且可以针对该目录运行我的模拟。我已经尝试了几个小时来执行此操作,但是 R 的 Linux 版本(与 OSX 和 Windows 版本不同)似乎针对分布在文件系统中的库运行,我想不出一种实用的方法来收集它们全部放到 R 可以找到它们的位置。

有任何想法吗?提前致谢。

4

2 回答 2

1

最终对我有用的是提出的解决方案(1)。在这里,我将讨论我是如何在我的 condor 提交文件和我的 worker shell 脚本中实现 (1) 的。

这是shell脚本。重要的变化是通过以下方式检查 R 是否安装在计算节点上:if [ -f /usr/bin/R ]. 如果找到 R,我们沿着返回值 0 结束的路径前进。如果没有找到 R,我们返回 1(这就是行exit 0和的含义exit 1)。

mkdir output
if [ -f /usr/bin/R ]
then
    if $(uname -m |grep '64')
    then
            Rscript code/simulations-x86_64.r $*
    else
            Rscript code/simulations-i386.r $*
    fi

    tar -zcvf output/output-$1-$2.tgz2 output/*.csv
    exit 0
else
    exit 1
fi

现在神鹰提交文件。关键的变化是倒数第二行 ( on_exit_remove = (ExitBySignal == False) && (ExitCode == 0))。它检查来自计算节点的每个作业的返回值——如果返回值不为零(即,如果在计算节点上未找到 R),则将作业放回队列中以重新运行。否则,作业被认为已完成并从队列中删除。

universe = vanilla
log = logs/log_$(Cluster)_$(Process).log
error = logs/err_$(Cluster)_$(Process).err
output = logs/out_$(Cluster)_$(Process).out
executable = condor/worker.sh
arguments = $(Cluster) $(Process)
requirements = (Target.OpSys=="LINUX" && regexp("stat", Machine))
should_transfer_files = YES
when_to_transfer_output = ON_EXIT_OR_EVICT
transfer_input_files = code, R-libs, condor, seeds.csv
transfer_output_files = output
notification = Never
on_exit_remove = (ExitBySignal == False) && (ExitCode == 0)
queue 1800
于 2013-02-25T16:06:17.777 回答
0

哇,好吧,这比我想象的要难。让我们从建议的解决方案(2)开始:

在 hadley 的建议下,我使用Renv将 R 安装到已知的本地目录(也使用R-build构建 R-2.15.2)。不幸的是,这个本地安装仍然依赖于来自诸如/usr/lib.

MvG 建议将本地 R 安装从sage中提取出来。这个附带了所有必要系统库的本地副本,并且是一种可能适用于大多数面临我情况的人的方法。但是,我的R代码依赖于一些仅与>= 2.15R兼容的包。R

因此,我从 sage 目录中取出所有库,lib并将它们复制到 Renv 的 R-2.15.2 安装中。这本来可行,但我大学的 condor 网格上的某些机器必须具有奇怪的架构,因为大约十分之一的工作返回与尝试使用错误版本的libc.so. 在这一点上,我放弃了建议的解决方案(2)并转向建议的解决方案(1)。

于 2013-02-25T15:49:30.177 回答