Песочница R для Кондора (в Linux)
В моем университете работает вычислительная сетка condor (вычислительные узлы работают под управлением Linux), и я хотел бы использовать ее для запуска симуляций в R. Проблема в том, что только на некоторых машинах в сетке установлен R. Пока я вижу два варианта, но я не знаю, как реализовать ни один из них, поэтому я надеюсь, что вы мне поможете (помните, что я не являюсь системным администратором и не могу многое сделать, чтобы изменить настройки вычислить узлы):
1) Поставьте галочку в ClassAds, которые идут вместе с моим файлом condor submit, чтобы потребовать, чтобы работа вычислялась на узлах, которые имеют /usr/bin/R
,
2) Пакет R и все его зависимости в автономный каталог, который может быть отправлен на вычислительные узлы и для которого можно запустить мое моделирование. Я пытался сделать это несколько часов, но версия R для Linux (в отличие от версий для OSX и Windows), кажется, работает с библиотеками, которые распределены по файловой системе, и я не могу придумать практического способа их собрать все в место, где R может найти их.
Есть идеи? Заранее спасибо.
2 ответа
То, что в итоге сработало для меня, было предложено решение (1). Здесь я обсуждаю, как я реализовал (1) в моем файле condor submit и моем рабочем сценарии оболочки.
Вот сценарий оболочки. Важным изменением было проверить, установлен ли 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
Вау, хорошо, это было сложнее, чем я думал. Начнем с предложенного решения (2):
По предложению Хадли я использовал Renv для установки R в известный локальный каталог (также используя R-build для сборки R-2.15.2). К сожалению, эта локальная установка по-прежнему опиралась на общесистемные библиотеки из таких мест, как /usr/lib
,
MvG предложила вытащить локальную R-установку из шалфея. Этот пакет поставляется с локальными копиями всех необходимых системных библиотек и является методом, который, вероятно, подойдет большинству людей, которые сталкиваются с моей ситуацией. Тем не менее, мой R
код опирается на несколько R
пакеты, которые совместимы только с R
>= 2.15.
Поэтому я взял все библиотеки из lib
каталог sage и скопировал их в установку R-2.15.2 из Renv. Это бы сработало, но некоторые машины в сети моего университета должны иметь странную архитектуру, потому что примерно 1 из 10 заданий возвращался с ошибками, связанными с попыткой использовать неправильную версию libc.so
, На этом этапе я отказался от предложенного решения (2) и перешел к предложенному решению (1).