Как увеличить скорость параллельной обработки на вычислительных узлах в Linux-кластере?

Ниже приведен код, относящийся к вопросу, который я задаю. Я работаю с кластером, который имеет 13 вычислительных узлов и 1 верхний узел (он же главный узел). Верхний узел — это узел, который соединяет всех пользователей, поэтому ему выделяется больше памяти, чтобы он мог работать быстрее. Однако я хотел бы увеличить скорость других узлов, потому что они работают довольно медленно по сравнению с верхним узлом, и я хотел бы увеличить их скорость без каких-либо настроек сервера и/или оборудования. Учитывая эти ограничения, мне интересно, есть ли способ ускорить вычисления, основываясь на том, как я запускаю симуляции на вычислительных узлах. В настоящее время, чтобы запустить часть симуляции с определенными начальными условиями (это можно увидеть ниже), я просто подключаюсь к вычислительному узлу по ssh, а затем инициирую симуляцию. Есть ли лучший способ сделать это, чтобы увеличить скорость вычислений (я думаю, может быть что-то быстрее, чем ssh?). Буду очень признателен за любую помощь... Я понимаю, что есть что-то, называемое MPI, но для проекта, над которым я работаю, я не считаю, что реализация MPI будет необходима, если я могу просто увеличить скорость вычислений узлов ssh'd. ... Спасибо.

./NodeHopper.sh

#!/bin/sh
#NodeHopper uses shell script to run psuedo-parallel computing over a cluster

#The top node is not named sequentially, so its not in the proceeding loop.
#Instead, it is given the node value 13 for computations later

export PROG=13
nohup ./ParaCage.sh & #Runs ParaCage.sh on the main node for the cluster

#Does other nodes sequentially #0 through 12
for i in {0..12}
do
  export PROG=$i 
  #PROG is passed into ./ParaCage.sh and tells ./ParaKeet.sh which initial conditions  
  #to use for the simulation.
  ssh compute-0-$i PROG=$PROG ./ParaCage.sh &
  sleep 1
done

./ParaCage.sh

#!/bin/sh
echo "Tunneling to Node:"
echo $PROG
echo "Complete"

cd multichmoII/multichmo$PROG/chmo/
./ParaKeet.sh

ParaKeet.sh

ParaKeet.sh — это программа для запуска симуляции с различными начальными условиями в зависимости от того, какой узел используется.


person Loonuh    schedule 21.12.2012    source источник


Ответы (3)


Мне интересно, есть ли способ ускорить вычисления, основываясь на том, как я запускаю симуляции на вычислительных узлах.

Ну, в вашем стартовом сценарии SSH есть sleep. Вы можете попробовать удалить это.

SSH имеет некоторые накладные расходы (порождает новый процесс для каждого «сообщения»; выполняет только зашифрованные соединения, даже если вам это может не понадобиться). Таким образом, вы можете заменить SSH правильной распределенной очередью задач. Существует множество альтернатив, включая Celery и Resque. Фактически, вы можете легко написать свой собственный с помощью Redis или 0MQ.

Но не утруждайте себя заменой SSH, если ваша работа не является недолговечной. (т. е. сокращение 100 мс от 1-минутного задания не так уж полезно.)

Я хотел бы увеличить скорость других узлов

Серебряной пули не существует: лучше всего надеть шляпу детектива и попытаться выяснить, где находятся ваши узкие места:

1) Посмотрите "сверху" на другие узлы. Все процессоры загружены? (Если нет, вы можете создать одну задачу для каждого ЦП вместо одной задачи для блока или переписать свою задачу для использования нескольких потоков.)

2) Получает ли каждый узел файлы с центрального (и перегруженного) сервера NFS? (Если это так, может быть быстрее копировать/кешировать файлы локально, или иметь несколько серверов для извлечения данных, или использовать битторрент и т.д..)

3) Даже если ваш процессор перегружен, это потому, что вы написали на языке сценариев? Сначала оптимизируйте свои алгоритмы, а затем попробуйте переписать их на более быстром языке, таком как golang. (И получите многопоточность бесплатно.)

Помните, преждевременная оптимизация — корень всех зол. Вы всегда должны измерять, а затем пытаться оценить, насколько быстрее вы сможете изготовить каждую деталь. Сначала срывайте низко висящие плоды, а наименьшие выгоды оставляйте напоследок. (Возможно, вы никогда не доберетесь до небольших успехов, потому что появится что-то более важное.)

person BraveNewCurrency    schedule 06.04.2014

Может быть, вам стоит перейти с bash на python и использовать там многопоточность? Затем вы можете подключиться к узлам по ssh параллельно, и это может увеличить скорость.

person knesenko    schedule 22.12.2012
comment
Разве не этим занимается эта программа? Глядя на свои данные, я начинаю сомневаться в том, что... Те же условия выполняются для всех вычислительных узлов, и головной узел работает просто отлично.... Они действительно не работают параллельно? Я думал, что если сбросить их таким образом, они будут... - person Loonuh; 23.12.2012

В зависимости от характера симуляции, которую вы выполняете, может быть лучше разделить саму симуляцию на части и обработать ее параллельно. Это было бы в том случае, если бы каждый узел просто не был достаточно мощным, чтобы эффективно запускать программу самостоятельно. С другой стороны, если симуляция легко разбивается на параллельные потоки, каждый из которых использует гораздо меньше памяти/мощности процессора, тогда каждый узел может хорошо подходить для обработки каждого компонента, который вы ему назначаете.

person DilithiumMatrix    schedule 03.01.2013