Песочница R для Condor (в Linux)

В моем университете работает вычислительная сеть кондора (вычислительные узлы работают под управлением Linux), и я хотел бы использовать ее для запуска симуляций в R. Проблема в том, что только на некоторых машинах в сети установлена ​​R. Пока я вижу два варианта, но не знаю, как реализовать ни один из них, поэтому надеюсь, что вы мне поможете (имея в виду, что я не сисадмин и не могу сильно изменить настройку вычислительные узлы):

1) Поставьте галочку в ClassAds, которые выходят с моим файлом отправки кондора, чтобы требовать, чтобы задание выполнялось на узлах, которые имеют /usr/bin/R.

2) Упаковать R и все его зависимости в автономный каталог, который можно отправить на вычислительные узлы и для которого можно запустить мою симуляцию. Я пытался сделать это в течение нескольких часов, но версия R для Linux (в отличие от версий для OSX и Windows), похоже, работает с библиотеками, распределенными по файловой системе, и я не могу придумать практический способ их собрать. все в место, где R может их найти.

Любые идеи? Заранее спасибо.


person Wesley    schedule 19.02.2013    source источник
comment
Для версии 2 может оказаться полезным github.com/viking/Renv.   -  person hadley    schedule 19.02.2013
comment
sage объединяет R (среди многих других) независимым от пути способом. Возможно, вы сможете взглянуть, как они это делают. Во многих случаях будет достаточно экспорта LD_LIBRARY_PATH в каталог, где лежат библиотеки.   -  person MvG    schedule 19.02.2013
comment
Спасибо вам обоим. @MvG: я не знал, что sage объединяет R - может быть, я смогу использовать это, просто отправив sage на вычислительные узлы.   -  person Wesley    schedule 19.02.2013


Ответы (2)


То, что в конечном итоге сработало для меня, было предложенным решением (1). Здесь я обсуждаю, как я реализовал (1) в моем файле отправки кондора и моем сценарии рабочей оболочки.

Вот сценарий оболочки. Важным изменением стала проверка того, установлен ли 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
person Wesley    schedule 25.02.2013

Ничего себе, хорошо, это было сложнее, чем я думал. Начнем с предлагаемого решения (2):

По предложению Хэдли я использовал Renv для установки R в известный локальный каталог (также используя R-build для сборки R-2.15.2). К сожалению, эта локальная установка по-прежнему зависела от общесистемных библиотек из таких мест, как /usr/lib.

MvG предложил вытащить локальную установку R из sage. Этот поставляется с локальными копиями всех необходимых системных библиотек, и это метод, который, вероятно, сработает для большинства людей, столкнувшихся с моей ситуацией. Однако мой код R опирается на несколько пакетов R, совместимых только с R >= 2.15.

Поэтому я взял все библиотеки из каталога lib sage и скопировал их в установку R-2.15.2 из Renv. Это бы сработало, но некоторые машины в кондорной сетке моего университета должны иметь странную архитектуру, потому что примерно 1 из 10 заданий возвращался с ошибками, связанными с попыткой использовать неправильную версию libc.so. В этот момент я отказался от предложенного решения (2) и перешел к предложенному решению (1).

person Wesley    schedule 25.02.2013
comment
вы можете принудительно установить/загрузить пакеты из определенного каталога, используя install.packages(lib.loc=) и library(lib.loc=) - person RockScience; 07.09.2013