Песочница 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).

Другие вопросы по тегам