Что нужно чтобы вскопать огород? При наличии огорода, нужны рабочие инструменты и рабочая сила (работники). А что делать если нужно вскопать быстрей или больше? Можно позвать друзей или нанять других людей, то есть увеличить число работников. Вот это и является примером высокопроизводительного вскапывания огорода. Не всегда можно увеличивать производительность вскапывания огорода путём поиска сильных работников, так как производительность каждого отдельно взятого работника ограничена. Потому и приходится прибегать к услугам большего числа работников.
Аналогично и с высокопроизводительными вычислениями. Работниками (анг. workers) так и называются отдельные компьютеры и процессорные ядра в вычислительных кластерах, если опираться на терминологию пакета МАТЛАБ (англ. MATLAB). В документации других кластеров эти ядра и компьютеры называются нодами (англ. nodes), так и буду их называть в этой заметке.
Просто о сложном: высокопроизводительные вычисления для инженерных и научно-исследовательских задач
Введение
На Хабрахабре уже много писалось о высокопроизводительных, распределённых и параллельных вычислениях (ВВ). freetonik уже сделал подробное и наглядное введение в параллельные вычисления и продолжение тут, ВВ были рассмотрены автором keleg в тут, теория распределённых вычислений была раскрыта в заметке автора mkosyakov, Melges описал опыт организации параллельных вычислений по сети на Си и XakepRU описал как можно распараллелить процессы в Linux. Перечитав их я понял что нет заметки которая могла бы помочь начать использовать ВВ для решения инженерных и научных задач. Это скорее всего общая особенность многих источников информации по данной тематике. Программисты пишут хорошие программы которые выполняют возложенные на них задачи. Университетские преподаватели доступно объясняют как и почему стоит использовать высокопроизводительные вычисления. Но как только исследователи осознают что им пора воспользоваться ВВ, то они сталкиваются с малым числом 'мостиков' которые связывают понимание ВВ с непосредственным использованием ВВ систем в их работе. В университетах студенты могут найти такой 'мостик' на лабораторных и практических работах. А я попробую восполнить этот пробел в надежде что материал будет полезным для тех кто этого не изучал и поможет им начать пользоваться ВВ. Сначала будет краткое введение в ВВ, после чего будут рассмотрены возможности использования МАТЛАБ, HPCondor суперкомпьютеров.
Высокопроизводительные вычисления (ВВ) приходят на помощь в тех случаях когда нужно сократить время расчётов или получить доступ к большему объёму памяти. Например, ваша программа может проводить необходимые вычисления в течение недели, но вам нужно получить результаты завтра. Если разделить эту программу на части и выполнять каждую из них на отдельном ноде, то теоретически можно ускорить расчёты пропорционально числу вовлечённых нодов. Но это только теоретически, а на практике этому всегда что-то мешает (о чём подробно писалось тут). Тут стоит упомянуть и другой случай, когда ваша программа требует большой объём оперативной памяти. Например, в вашем компьютере установленно только 4 Гб оперативной памяти, но для расчётов нужно хотя бы 64 Гб. В системах ВВ на каждом ноде установленна память определённой ёмкости. Так если каждому ноду доступно 2 Гб памяти, то опять же можно разделить программу на 32 части, каждая из которых будет выполняться на отдельном ноде, будет взаимодействовать с другими частями, обмениваться данными и, в конечном итоге, программа в целом будет иметь доступ к 64 Гб памяти.
Из этих примеров вы наверняка поняли что высокопроизводительные вычисления – это вычисления проводимые на компьютерных системах со спецификациями, которые значительно превышают обычные компьютеры. Это понятие условное, возможно есть и более точное определение, но я его сейчас не смог найти. Существуют параллельные, распределённые ВВ, а так же их комбинации.
Параллельные вычисления предусматривают разработку программ, которые во время их выполнения представляют собой несколько параллельных и взаимодействующих между собой процессов. Например, моделирование характеристик ячейки солнечной батареи предусматривает взаимодействие трёх моделей описывающих: перенос носителей заряда, распространение падающего света внутри ячейки, температурные эффекты, растяжение-сжатие. Так перенос носителей, растяжение-сжатие и показатель преломления материала, который используется в оптической модели падающего света, зависят от температуры и модели, описывающие эти эффекты, должны взаимодействовать друг с другом в процессе расчёта. Чтобы ускорить расчёты можно код модели описывающей транспорт носителей выполнять на одном ноде, код отвечающий за распространение света – на другом, температурную модель – на третьем, и так далее. То есть, ноды будут выполнять взаимодействующие расчёты параллельно.
Распределённые вычисления предусматривают использование нескольких не взаимодействующих друг с другом нодов и процессов. Очень часто в таком случае выполняется один и тот же код на разных нодах. Например, нам нужно оценить растяжение и сжатие той же ячейки солнечной батареи в зависимости от температуры. В таком случае, температура – входной параметр модели и один и тот же программный код этой модели можно выполнить на разных нодах для разных значений температуры.
Выбор между распределёнными и параллельными расчётами зависит от организации программного кода используемого для расчётов, самой физической модели, доступности систем ВВ для конечного пользователя. Далее в этой заметке о том
- как конечный пользователь взаимодействует с системой ВВ;
- какие ВВ системы доступны и какие у них ограничения;
- о кластерах построенных при помощи ПО Кондор (англ. Condor) и МАТЛАБ (выбор пал на них просто по причине опыта автора с ними);
- немного о суперкомпьютерах и гридах;
- и о том как всем этим хозяйством можно можно воспользоваться.
Взаимодействие пользователя с системой высокопроизводительных вычислений
Если пользователь использует ВВ системы удалённо, то ему нужен компьютер, на котором он будет:
- подготавливать программы для запуска на системах ВВ;
- запускать расчёты на системах ВВ либо подключаться к системам ВВ для запуска программ;
- на котором он будет обрабатывать результаты расчётов.
Тут многое зависит от личного предпочтения пользователя, доступности нужного программного обеспечения и других требований. Есть возможность выбора языка программирования, операционной системы рабочего компьютера и кластера, используемых программных библиотек и ПО для организации кластеров. Лично я всё время пытаюсь писать программы на С или С++ с использованием MPI и openMP для Линукс (тут и тут уже есть хорошие статьи по этой теме этих пап и мам высокопроизводительных вычислений ), но по разным причинам это не всегда получается. Типичная ситуация – приходит шеф в пятницу и говорит что нам срочно нужны результаты. Заканчивается это тем что пишется программа в МАТЛАБ для проведения нужных расчётов. А чтобы быстрей получить результаты, эта программа работает на кластере МАТЛАБ нашей организации до понедельника.
Что касается операционной системы рабочего компьютера пользователя, то в большинстве случаев удобней всего использовать ту же операционную систему и её дистрибутив что установленна на системе ВВ. В данный момент большинство ВВ систем работает под управлением различных дистрибутивов Линукс. Если на нашем кластере стоит Scientific Linux, то и на рабочий компьютер проще поставить эту же систему чтобы в дальнейшем не путаться в командах. Если планируете использовать кластер на базе МАТЛАБ, то выбор операционной системы роли не играет, так как программы написанные на МАТЛАБ могут выполняться на компьютерах с любыми ОС (доступными для установки МАТЛАБ, естественно).
Если же вы выбираете смешанную схему, при которой у вас на компьютере установлена ОС семейства MS Windows, а ВВ система построена на ОС Линукс, то вам понадобится клиент для подключения к удалённой системе (например, PuTTY), и, возможно X-сервер или же сразу Cygwin, в котором это всё есть. В выборе программного обеспечения вам всегда помогут локальные администраторы ВВ системы.
Важный момент: ВВ системы обычно либо не поддерживают программы требующие работы в интерактивном режиме (которые в процессе выполнения запрашивают ввод данных, ожидают других действий пользователя таких как нажатие клавиш или манипуляций мышкой) или поддерживают их ограниченно. Аналогично и в отношении графического интерфейса – его использование чаще всего не предусмотренно и ВВ системы используются в текстовом режиме из командной строки (исключение — тот же МАТЛАБ). Перед использованием вашей программы в ВВ системе, она должна быть отлажена и потом преобразована так чтобы она могла быть запущенна на ВВ системе и без дальнейшего вмешательства человека она провела расчёты и сохранила результаты в файлах либо передала их пользователю другим способом.
К производительности компьютера пользователя требования минимальны, так как основные расчёты всё равно планируется проводить на системах ВВ. Следить за состоянием расчётов, запускать и прерывать их можно с компьютера минимальной конфигурации и с мобильного телефона.
Некоторые системы ВВ
Общий обзор
Чаще всего для проведения ВВ используются суперкомпьютеры, компьютерные кластеры и гриды (англ. computing grids).
Суперкомпьютеры – компьютерные системы, значительно превышающие большинство существующих компьютеров по своим параметрам таким как производительность, доступная оперативная память, доступное число процессоров. Для большей информации о них вы можете посмотреть список пятиста самых производительных суперкомпьютеров мира.
Компьютерный кластер – группа компьютеров, которые могут взаимодействовать друг с другом для наращивания доступной памяти и числа процессоров вовлечённых в работу. Чаще всего такие кластеры строятся внутри исследовательских групп или организаций.
Гриды – это группы кластеров и суперкомпьютеров, разбросанных по разным городам и странам. Так, например, вы можете передать свою вычислительную задачу на сервер в Швейцарии, но она будет выполняться либо на кластерах в Германии, Франции или Польше. Наиболее известный пример грида – европейская грид-система EGEE, объединяющая в себе около сорока тысяч процессоров и несколько петабайтов дискового пространства.
Конечному пользователю часто сложно или не возможно различить суперкомпьютеры и кластеры. Вот три примера:
1. Не редко суперкомпьютерами называют и группу компьютеров подключённых друг к другу через высокоскоростные сети связи, что по сути — тот же самый компьютерный кластер;
2. В то же время существуют кластеры построенные на базе программного обеспечения HPCondor, это так же группа компьютеров взаимодействующих с сервером в локальной сети (часто – медленной сети) и не кто не рискнёт назвать такие кластеры суперкомпьютерами;
3. Есть же суперкомпьютеры NVIDIA (которые имеют системный блок большего размера чем обычные офисные компьютеры) у которых вся вычислительная система не разбросана по сети, а умещается в этом системном блоке.
Если взять примеры 2 и 3, то разница между суперкомпьютером и кластером очевидна. В первом и третьем, особой грани не видно, опять же обе системы из этих двух примеров называют суперкомпьютерами.
Кластеры HPCondor (англ. Condor, после 2012 года — HTCondor)
Программное обеспечение для организации такого кластера можно загрузить бесплатно со страницы проекта. Кластеры данного типа состоят из рабочих компьютеров и сервера. Преимущество такого кластера в том что рабочими компьютерами могут выступать обыкновенные офисные и лабораторные компьютеры на которых установленно клиентское ПО. В дневное время эти компьютеры могут использоваться для основной работы, но как только ими перестают пользоваться (это зависит от настроек) сервер начинает запускать на этих компьютерах задачи которые были переданы ему ранее. Обязательным условием использования этого кластера является установка клиентского ПО и на тот компьютер, с которого пользователи передают задачи. То есть и их компьютер должен быть частью кластера. Поддерживаемые операционные системы: MS Windows, MacOS и Linux.
Для выполнения программы, эта программа должна быть скомпилирована в исполняемый код для нужной ОС и вместе с необходимыми библиотеками передана на сервер. Это применимо и к программам написанным для МАТЛАБ – вам так же необходимо откомпилировать их используя компилятор C, который поставляется с МАТЛАБ. Для запуска этой программы в кластере, необходимо написать простой конфигурационный скрипт, в котором записаны требования к среде выполнения вашей программы (размер оперативной памяти, операционная система и так далее) и список передаваемых вместе с этой программой файлов. В качестве примера ниже приведён текст из одного из таких файлов (назовём его cost_top.txt):
universe = vanilla
executable = cost_top.bat
transfer_input_files = cost_top.exe
output = dump.txt
error = errdump.txt
log = foo.log
requirements = (OpSys == "WINNT51")
rank = kflops
transfer_files = ALWAYS
queue
Уверен что Вы уже догадались — этот файл “объясняет” ПО Кондор такие важные моменты как имя исполняемой программы, какие файлы необходимо передать в кластер, в какой файл записывать результаты выполнения программы, в какой – сообщения об ошибках, в какой – дополнительные сообщения, какие именно требования выдвигаются к ОС нода и её производительности и передавать ли файлы.
Содержимое файла cost_top.bat, который выполняется на ноде:
path=c:windowssystem32;c:windows;c:windowssystem;p:matlab6binwin32
cost_top.exe
Скорее всего вы поймёте, что первая строка в этом скрипте отвечает за добавление нужных путей в переменную окружения, вторая – за запуск нужной нам программы.
Для передачи вашей задачи на сервер кластера, необходимо будет в командной строке набрать 'condor_submit cost_top.txt'. После этого ваша задача будет поставлена в очередь и через некоторое время сервер будет готов запустить вашу задачу на клиентских компьютерах. Время ожидания в очереди зависит приоритета каждого из пользователей и нагрузки на кластер и выбирается системой балансировки задач сервера.
У кластеров данного типа есть ограничения:
- с момента постановки задачи в очередь и до момента окончания расчёта ваш клиентский компьютер должен быть включён и подкючен к локальной сети так как сервер и клиент обмениваются файлами;
- данный кластер поддерживает только распределённые ВВ задачи;
- есть сложности в использовании какой-либо сторонней программы (отличной от написанной и откопелированной вами) и программ требующих множества библиотек.
Кластеры МАТЛАБ
МАТЛАБ сам по себе способен создать кластер. Для этого вам понадобится соответствующие библиотеки и сервер — Distributed Computing Toolbox и Distributed Computing Server. Сейчас современные процессоры компьютеров имеют более чем одно ядро и МАТЛАБ способен развернуть ваш собственный локальный кластер прямо на базе вашего рабочего компьютера. Такая конфигурация кластера известна как локальная конфигурация. Она удобна в тех случаях когда хочется немного ускорить расчёты без особых усилий как и тогда когда требуется протестировать программу перед её стартом на более серьёзной ВВ системе такой как суперкомпьютер или кластер.
Наряду с локальной конфигурацией существует и другие конфигурации. Например для кластера объединяющего группу компьютеров в локальной сети, группу компьютеров в кластере или в гриде. Если у администраторов есть возможность и они не ленятся, то они обычно настраивают кластеры МАТЛАБ и проводят обучающие курсы для того чтобы пользователям было легко пользоваться такими кластерами.
Преимущества кластеров МАТЛАБ:
- клиентский компьютер, с которого передаются задачи для расчёта, может быть выключен после передачи задачи и пользователь может забрать результаты расчётов позже;
- могут выполнять как распределённые так и параллельные вычислительные задачи;
- пользователям МАТЛАБ легче начать пользоваться такими кластерами, так как язык программирования уже знаком;
- программы не требуют компиляции;
- адаптация программы для параллельных расчётов в которой уже есть операторы цикла 'for' очень проста – достаточно заменить такой оператор на 'parfor' и добавить пару строк для инициализации кластера и его закрытия после окончания работы.
Например, код без использования parfor:
clear all;
Na=4:50;
Nc=4:30;
for i1=1:length(Na),
for i2=1:length(Nc),
[out1,out2]=fom(Na(i1),Na(i1),Nc(i2),0) ;
end
end
save FigOM.dat FigOM -ascii
save dF.dat dF -ascii
exit
А теперь то же самое с использованием parfor и четырёх нодов:
clear all;
matlabpool open 4
Na=4:50;
Nc=4:30;
for i1=1:length(Na),
parfor i2=1:length(Nc),
[out1,out2]=fom(Na(i1),Na(i1),Nc(i2),0)
end
end
matlabpool close
save FigOM.dat FigOM -ascii
save dF.dat dF -ascii
exit
Недостатки:
- МАТЛАБ – не бесплатный продукт и части пользователей он просто не по карману;
- кластерное ПО не поставляется с программой для балансировки нагрузки (она может быть установленна отдельно), что приводит к ситуациям когда некоторые пользователи занимают все ноды кластера и блокируют доступ других пользователей.
Суперкомпьютеры и гриды
Как уже было выше упомянуто, иногда сложно найти отличие между суперкомпьютером, вычислительным кластером и гридом. С этой стороны окна терминала все они выглядят одинаково. Все они имеют большое число процессоров и памяти в ВВ системе. Среди установленного программного обеспечения у них есть компиляторы и библиотеки MPI и OpenMP. Иногда установлен МАТЛАБ и другие программы поддерживающие использование группы нод и их памяти.
Наиболее часто встречающийся алгоритм работы такой:
- пользователь подключается (как правило по SSH) к специальным нодам (англ. login nodes) на которых он интерактивно может выполнять часть команд и с которых может контролировать свои расчёты;
- загружает модули, необходимые для выполнения той или иной задачи, например, компилятор gcc и библиотеку MPI;
- если необходимо, то компилирует свою программу с поддержкой нужных библиотек;
- аналогично кластеру HPCondor, готовит файл настроек и команд для выполнения своей программы (англ. job submiossion file);
- передаёт этот файл настроек и команд при помощи команды 'qsub имя_файла' в очередь на выполнение;
- как только выполнение программы будет завершено, пользователь может получить результаты её выполнения (и проще их сохранять в файлы).
Файлы настроек аналогичны файлам кластеров HPCondor. Например для того чтобы запустить вышеприведённый пример с parfor можно воспользоваться следующим файлом:
#!/bin/sh
#$ -l h_rt=10:00:00
/usr/local/bin/matlab /home/el/calmap.m
Во второй строке указывается максимальное время необходимое для выполнения данной задачи, а в третьей – команда которую необходимо выполнить на данной системе для запуска нужного пользователю программного кода МАТЛАБ.
Ещё один пример файла для запуска программы которая использует библиотеки MPI:
#!/bin/bash
#$ -l h_rt=4:00:00
#$ -pe mvapich2-ib 12
#
LDFLAGS="-L$HOME/opt/lib -lm" export LDFLAGS
CPPFLAGS="-I$HOME/opt/include" export CPPFLAGS
LD_LIBRARY_PATH="$HOME/opt/lib:$LD_LIBRARY_PATH" export LD_LIBRARY_PATH
PATH=$PATH:$HOME/opt/bin export PATH
module add compilers/intel/12.1.15
module add mpi/intel/mvapich2/1.8.1
mpirun -np 12 m-mpi test7.ct
Во второй строке – максимальное время необходимое для расчёта, в третьей – указание имени среды для параллельных расчётов (задано администраторами) и число запрашиваемых нодов, далее 4 строки с присвоением нужного значения переменным окружения, после чего две строки которые отвечают за подключение нужных модулей и в конце скрипта – запуск нужной программы которая будет использовать 12 нодов.
Заключение
Нельзя объять необъятное, но пытаться можно и нужно. В этой заметке я попытался сделать обзор систем высокопроизводительных вычислений, помочь начинающим пользователям разобраться со спектром возможностей и понять что доступно и как это можно использовать. Как вы видите, даже если у вас нет доступа к суперкомпьютерам и гридам, то можно построить свой кластер на основе МАТЛАБ или бесплатного ПО Кондор.
p.s. Если можете дополнить эту заметку или нашли ошибку, то прошу написать об этом ниже. В конце концов это будет только на пользу знаниям и пониманию вопроса и это даст возможность улучшить заметку.
p.p.s. Есть ещё возможность использования технологии CUDA для ускорения расчётов в С/C++ и МАТЛАБ путём вовлечения ядер графического процессора в работу, но об этом написано много.
Автор: piva