Студенческие суперкомпьютерные соревнования проводятся ежегодно в различных точках мира, и преследуют цель привлечения молодых талантов в область высокопроизводительных вычислений в индустрии и в науке. В этом году наша команда приняла участие в азиатских соревнованиях, и в этой статье пойдет речь об опыте и впечатлениях, полученных на этом мероприятии.
Задачи и ход отборочного этапа
В этом году впервые не было задач, которые требовалось решить, используя предоставленное организаторами оборудование: все задачи надо было запускать на своем железе. Благодаря настойчивости и упорству профессоров незадолго до начала отборочного этапа у нашей команды появился доступ к нескольким узлам с видеокартами NVIDIA P100 и P6000, которые очень помогли нам при подготовке. Задачи мало отличались от прошлого года. Они описаны ниже.
- Собрать конфигурацию кластера и описать почему были выбраны те или иные компоненты.
- Измерить производительность кластера с помощью Линпака и HPCG. Отличие от прошлого года состояло лишь в том, что в прошлом году Линпак надо было оптимизировать под предоставленный организаторами кластер с процессорами Intel Xeon Phi, а в этом — под любой доступный кластер.
- Оптимизировать Релион (программное обеспечение для распознавания снимков с криоэлектронного микроскопа) под видеокарты.
- Построить нейронную сеть для ответа на поисковые запросы пользователя, используя фреймворк CNTK и датасет MS MARCO.
Линпак и HPCG. Благодаря появлению новых узлов с видеокартами и Вадима, который занимался только тестами производительности, мы значительно продвинулись по первому и второму заданиям. Вадим смог произвести столько запусков тестов, сколько необходимо для уверенной подгонки параметров под конкретную систему. Также, на новых узлах стало возможным регулировать энергопотребление, что позволило подобрать конфигурацию кластера с учетом изменений частоты процессора и графического чипа. Появление новых узлов стало самым большим событием для команды.
Релион. Код, написанный химиками-биологами не отличался продуманной архитектурой и содержал трудно читаемые файлы по несколько тысяч строк кода. Синхронизация обеспечивалась системным вызовом sleep()
. Входных данных было десятки гигабайт, выходных еще больше, одна итерация занимала в среднем по сорок минут, и понять сходу, как это все оптимизировать, было невозможно. После двух недель поисков был написан собственный аллокатор памяти для видеокарты; преобразование Фурье и некоторые другие подпрограммы были перенесены на видеокарты. Из-за сложности кода и ограниченного времени остальные оптимизации были сделаны уже после предварительного этапа.
CNTK. Как обычно, в задаче на машинное обучение была дана базовая конфигурация нейронной сети, от которой стоит отталкиваться. Фреймворк и сама сеть из коробки не работала. CNTK требовал особенную версию OpenMP, в утилите для проверки результата у функций были несовместимые типы параметров, и не совпадало их количество. Когда все, наконец, запустилось — стали разбираться с архитектурой сети. Увы, нейронные сети все еще остаются слабым местом нашей команды, поэтому каких-то очень сложных изменений мы не делали. Меняли процент отбрасываемых нейронов, скорость обучения, начальное значение, экспериментировали с использованием GRU вместо LSTM в рекуррентной части.
Подготовка к финалу и поиск спонсора
Итак, ура, мы прошли в финал!
В этот раз мы сразу написали нашему прошлогоднему спонсору и начали готовиться. Вскоре случилось два события: прошлогодний спонсор нам отказал, а университет выделил средства, покрывающие часть стоимости перелета. Дальше была генерация идей где найти остаток средств. В итоге нам вызвалась помочь компания Devexperts, занимающаяся разработкой финансового ПО для бирж, брокеров и инвестиционных компаний. В отборочном туре команда решает задачи на том оборудовании, которое ей доступно. Иногда часть задач решается на оборудовании, предоставленном организаторами. В финале все точно так же за исключением одного но… этот самый кластер команде еще предстоит собрать!
В прошлом году ни один из участников команды не имел опыта настройки кластера, из-за чего у нас осталось мало времени на запуск конкурсных задач, поэтому в этом году мы провели серию тренировок на учебном кластере. На каждой тренировке мы создавали резервные копии узлов, полностью настраивали один узел, затем копировали его образ по сети на другие узлы. Как показала практика, это самый быстрый и безболезненный способ настройки кластера с нуля, который не требует глубокого знания низкоуровневых технологий. Нескольких тренировок хватило, чтобы полностью отладить и автоматизировать процесс.
Финал: день первый и второй
В первые два дня соревнований команды собирают и настраивают кластер, на котором впоследствии будут запускаться все приложения. Как правило, чем больше в вашей системе видеокарт, тем больше вы сможете получить производительности на большинстве заданий, и тем меньше узлов вы сможете установить в стойку из-за ограничения по мощности (мощность не должна превышать 3кВт, иначе результаты задания не засчитываются). Однако, есть приложения, в которых видеокарты никак не используются, и наличие большого количества узлов бывает выгодным.
В этом году спонсоры соревнования предоставили по четыре NVIDIA V100 каждой команде. Первыми найдя нужного человека и получив заветные ускорители, мы принялись за установку. Никто в команде (включая тренера) прежде не имел опыта установки видеокарт в сервер. После изучения инструкции, любезно предоставленной организаторами, мы справились с поставленной задачей, и нам даже не пришлось полностью вытаскивать и разбирать сервер, как это делают большинство команд (см. видео).
Далее нужно было установить и настроить операционную систему. Как правило, в этой области у студентов меньше всего уверенности, поскольку в ней используются нишевые технологии, знание которых никак не пригодится в других областях, поэтому мы предварительно провели несколько тренировок полной настройки системы из пяти узлов с нуля на учебном кластере с помощью Клонзиллы.
Скрипты конфигурации были отлажены на виртуальном кластере с помощью Вагранта, поскольку только в нем можно легко поднять несколько одинаковых виртуальных машин. Из-за низкого уровня программного обеспечения, которое мы используем, Докер и другие технологии, основанные на пространствах имен Линукса, нам не подходят. Конфигурационные скрипты попросту на них не работают.
Вооружившись опытом, полученным на тренировках, мы развернули операционную систему и остальные пакеты еще быстрее, чем на тренировках — производительность серверов не идет ни в какое сравнение с нашим учебным кластером. Одной из особенностей конкурса является отсутствие доступа к интернету с серверов, поэтому репозиторий с пакетами мы заранее скачали и записали на два USB-диска, которые взяли с собой.
После настройки кластера каждый участник команды принялся за настройку и проверку своего приложения под новую систему, и здесь нас ждал неприятный сюрприз. Версия Линпака, которая осталась с прошлого года соревнований, отказалась корректно работать на новой системе. Установка различных версий CUDA, перебор различных опций и настроек ядра не дали желаемого эффекта. В итоге, мы решили запустить обычную неоптимизированную версию, чтобы не потерять баллы за задание. (Это связано с новой системой начисления баллов в этом году: даже если ваш результат самый лучший по скорости или производительности, но вывод некорректен вы получите только половину от максимально возможного количества баллов. Вторая половина баллов набирается за корректность вывода.)
Чтобы понять суть проблемы, стоит рассказать, что из себя представляет Линпак. Линпак используется для измерения производительности суперкомпьютеров и составления списка TOP500 самых мощных суперкомпьютеров в мире. Самый простой способ занять высокое место в этом списке — приобрести кластер с большим количеством видеокарт (количество процессоров не так важно, потому что 99% задачи отдается видеокарте). Для каждого ускорителя существует оптимизированная версия Линпака, код которой, как правило, закрыт. Бинарник можно получить, только, если у вас есть суперкомпьютер, который может занять место в списке TOP500, или, если вы участвуйте в суперкомпьютерном соревновании. Несмотря на это организаторы соревнований бинарник не предоставили, российское отделение NVIDIA также отказалось это делать. В России нет кластеров с V100, которые бы могли войти в список TOP500, поэтому поиски по знакомым коллегам также не увенчались успехом. Непонятности ситуации добавляет и тот факт, что Линпак нигде не применяется, кроме как для тестирования производительности: ни в науке, ни в технике. Если вы хотите помочь команде и знаете, как получить заветную программу, милости прошу в личку. Ну а мы со свойственной нам непосредственностью отметили эту историю слайдом в финальной презентации, чем смогли порадовать членов жюри.
Финал: день третий
На третий день соревнований нас ждали Линпак, HPCG, Релион и секретное приложение, и этот день стал для команды самым тяжелым. Быстро расправившись с Линпаком (см. предыдущий раздел) и HPCG, мы получили рабочие задания (входные данные) для секретного приложения. Им оказалась программа для расчета молекулярной динамики Сиеста. Первым разочарованием стало то, что на части заданий Сиеста выдавала ошибку по адресу (при том, что написана она на Фортране, в котором такую ошибку не так просто получить), и отладить ее так и не удалось. Тем не менее, оставшиеся задания заработали и в конце дня мы успешно их сдали.
Параллельно с Сиестой нам пришлось запускать и заранее подготовленный Релион. Все узлы без видеокарт были отданы Сиесте, а узлы с видеокартами — Релиону, поэтому программы друг другу не мешали.
Код Релиона мы еще на предварительном этапе сильно изменили, чтобы он эффективно работал на видеокартах. В числе прочего, мы распараллелили множество функций, переписали аллокатор памяти на видеокарте, перенесли наиболее ресурсоемкие подпрограммы на видеокарту и добавили возможность использовать одновременно узлы с видеокартами и без. Это значительно ускорило программу, и она прекрасно работала на университетской технике. Однако, на конкурсе нам достались видеокарты с меньшим объемом памяти, из-за чего Релион вылетал с ошибкой. Более глубокий анализ ошибки показал, что код заработает, только если его переписать под новую систему. Времени на это у нас не было, и это стало вторым разочарованием третьего дня.
Финал: день четвертый
На четвертый день соревнований остались CFL3D и MSMARCO, и этот день прошел гораздо более спокойно. Освободившись от закрепленных за ними приложений, участники команды принялись помогать друг другу. Для CFL3D, который имеет весьма сложный формат входного файла, Руслан написал скрипт, который его генерирует. Поскольку узлов у нас было много по сравнению с командами с большим количеством видеокарт, мы запустили параллельно несколько заданий и после нескольких запусков каждого задания смогли подобрать оптимальные параметры.
Запуск заранее подготовленного MSMARCO также не вызвал серьезных проблем. Предварительная обработка данных заняла несколько часов, из-за чего времени на длительное обучение не оставалось, но благодаря более мощным видеокартам его удалось завершить, пусть и с меньшим количеством эпох. У нас осталась обученная на большем количестве эпох модель с отборочного этапа (в финале входные данные поменялись, а нового файла для верификации не было), но по правилам нужна была модель, обученная во время финала, и мы решили сдать честно обученную модель. Несмотря на слаженную работу и отсутствие сюрпризов, мы использовали все отведенное время и закончили поздно вечером.
Финал: день пятый
На следующий день нас ждала презентация. Вечером четвертого дня в заранее подготовленный шаблон мы вставили полученные результаты и написали речь. Презентация прошла легко, каких-либо интересных вопросов нам так и не задали, но почему-то разрешили снимать только докладчика и слайды.
Несколькими часами позже началась церемония награждения. Ощущения были смешанные: с одной стороны, мы выступили гораздо лучше прошлого года, с другой — мы могли выступить еще лучше, если бы не досадные ошибки с приложениями. В итоге, несмотря на то что наш кластер не отличался большим количеством видеокарт, за счет большего количества узлов и упорства мы обошли другие команды в CFL3D, за что удостоились отдельного приза соревнования. В общем зачете мы заняли одиннадцатое место из двадцати команд, прошедших в финал (и из трехсот команд, участвовавших в предварительном этапе). Чемпионом в общем зачете, как и в прошлом году, стал университет Синьхуа. Для нашей команды это стало победой над собой: мы выступили лучше, чем в прошлый раз, получили бесценный опыт, которым воспользуемся в следующем году, и обошли других в одном из заданий.
Выводы и общие впечатления
Конфигурация кластера, в которой видеокарт много больше чем процессоров, выигрышная в большинстве случаев, но не универсальная. Узлов становится меньше, и не каждое приложение может в принципе работать на видеокарте. К таким приложениям относятся программы на Фортране, которые по причине их почтенного возраста не переписывают под видеокарту, и чаще всего они даже не используют всех ядер процессора. Для таких приложений наличие большого количества узлов позволяет запустить больше параллельных заданий, а значит больше оптимизировать приложения.
Команда может не знать всех тонкостей установки операционных систем и разливки образов, но этот пробел легко заменяется тренировками. Всех тонкостей участники, конечно, не узнают, зато уверенно будут выполнять установку по пунктам. Скрипты для установки легко отлаживаются на виртуальных машинах.
Во время конкурса можно встретиться с самыми замечательными программами с открытым исходным кодом. Программы, которые собираются неразборчиво написанными скриптами, программы, использующие переписанные с ошибками библиотечные функции, программы, написанные на Фортране со вставками на Си, программы с жестко прописанными зависимостями и флагами компиляции. Я не могу вспомнить ни одной программы, которая бы собралась с первого раза или выдала понятную ошибку при сборке. (Свежий пример: старая версия OpenMPI на новых системах пытается подсоединить библиотеку с пустым именем. Проблема надежно решается лишь автозаменой в генерируемых make-файлах.) Конкурс учит не удивляться ничему и преодолевать возникающие трудности. Хочется верить, что человек, поработавший с таким программным обеспечением, никогда в жизни не создаст нечто подобное.
На конкурсе не перестаешь удивляться китайской изобретательности. В этом году под место, в котором должно проходить соревнование, китайцы переделали конференц-зал квадратной формы со срезанными углами. В него занесли стойки с серверами и систему охлаждения с выводом жидкости в ближайший санузел (я не эксперт в данной тематике и не знаю точного названия оборудования). Когда они поняли, что температура в зале не опускается ниже тридцати градусов по Цельсию, они принесли огромные ледяные глыбы в тазах. Ситуацию это, конечно, не поменяло, зато обеспечило команду охлажденными напитками.
Благодарности
Участие в соревновании было бы невозможно без нашего спонсора — компании Devexperts (http://devexperts.com/). Компания взяла на себя расходы на авиаперелет в Китай.
Впечатления от Китая
Некоторые участники команды были в Китае первый раз, что произвело на них небольшой культурный шок. Рассказывает Антон.
Знакомство со страной восходящего солнца началось с того, что у некоторых из нас отняли батареи для зарядки, потому что на них не было отметки о мощности. Если не считать этого заговора, то все остальное прошло дружелюбно. Нас встретили два волонтера с табличкой нашего университета, после чего на автобусе отвезли в отель. Стоит отметить, что после Питера, где вот-вот растаял снег, в Китае было довольно жарко (хотя, настоящие жители Волгограда, конечно, этого даже не почувствовали). По приезду нас расселили в комнаты. После суточных перелетов решил с усталостью плюхнуться на огромный матрас.
Тверд был матрас.
Приуныл самурай.
На тот момент было около десяти утра, поэтому через час мы отправились на осмотр местного университета. Сказать, что он большой — не сказать ничего. Если сравнивать территорию местного студенческого городка и СПбГУ, то Наньчанский университет раз в пять больше. Нам показали местную столовую, где на протяжении следующих пяти дней мы питались лапшой и рисом. По большей части первое общение с обычными китайцами, чье знание английского не такое хорошее, началось именно тут.
Столовая устроена таким образом, что каждое окошко — это мини торговая точка, где вы можете что-то купить. Оплата происходит специальной картой, которую вы, как и NFC карты, просто прикладываете к считывателю. Все происходит быстро, и в очереди подолгу стоять не приходиться. Понять, что именно ты берешь, бывает проблематично. Приходится применять старые дедовские методы и показывать пальцем на желаемое блюдо. На третий день в стойке с лапшой нас начали узнавать, что значительно упростило нам жизнь. Некоторые даже научились считать до десяти, чтобы не показывать пальцами и проявить уважение к жителям. Если говорить про саму еду, то там были неплохие и здоровые такие пельмени. С помощью волонтера мне удалось получить вкусный суп, но так как для этого надо взаимодействовать с продавцом устно, это было лишь один раз. Из-за приправ все мясо очень острое, со специфическим вкусом.
На второй день мы познакомились с третьим волонтером, которую звали Ксения. (Китайцы, как правило, придумывают легко произносимые имена для общения с иностранцами.) Она два года изучает русский, поэтому ее приставили к нам, своего рода полезный опыт.
Сам конкурс уже был подробно описан в других разделах, но здесь хотелось бы отметить, что было всего два стула на команду, поэтому приходилось сидеть на полу, после чего ноги просили лишь о пощаде, потому что сидеть так приходилось по десять часов все четыре дня соревнования.