2013-02-19 1 views
4

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

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

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

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

+0

Для 2, https://github.com/viking/Renv может быть полезным – hadley

+0

[шалфея] (http://www.sagemath.org/) расслоения R (среди многих других) в path- независимой моды.Возможно, вы можете посмотреть, как они это делают. Во многих случаях экспорт LD_LIBRARY_PATH в каталог, где лежат библиотеки, будет достаточным. – MvG

+0

Спасибо, вы оба. @MvG: Я не знал, что пакеты мудрецов R - возможно, я могу использовать это, просто отправив шалдера на вычислительные узлы. – Wesley

ответ

1

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

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

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

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

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

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

+0

вы можете принудительно установить/загрузить пакеты из определенного каталога, используя install.packages (lib.loc =) и библиотеку (lib.loc =) – RockScience

Смежные вопросы