Содержание


Программирование для BOINC

Часть 7. Автоматическая генерация подзаданий с помощью bash-сценария

Comments

Серия контента:

Этот контент является частью # из серии # статей: Программирование для BOINC

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Программирование для BOINC

Следите за выходом новых статей этой серии.

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

Теперь пришла очередь изучения технологии, используемой при разработке приложений, поддерживающих распределенные вычисления. В прошлой статье серии было начато изучение технологии разработки программ для проведения распределенных вычислений на примере приложения UpperCase, поставляемого вместе с исходным кодом BOINC.

Представленная статья продолжает тему разработки программ для платформы BOINC и посвящена автоматической генерации подзаданий. В рамках статьи будет подробно рассмотрена утилита create_work, используемая для регистрации подзаданий в проекте BOINC, и представлен bash-сценарий для автоматической генерации подзаданий.

В следующей статье будут разбираться два других способа создания большого количества подзаданий на основе различных файлов с исходными данными: с помощью программы на языке C/C++ и путем непосредственной вставки необходимых значений в базу данных проекта BOINC.

Автоматическая генерация заданий

Основная идея распределенных вычислений заключается в том, чтобы разбить исходную «большую» (т.е. вычислительно сложную) задачу на большое число «мелких» независимых подзаданий. Тогда каждое из таких подзаданий может выполняться на отдельном компьютере (или в общем случае — вычислителе), а в итоге — все они будут выполняться параллельно, что приведет к значительной экономии времени.

Как правило, при проведении распределенных вычислений по принципам volunteer computing, используется одна и та же программа, запускаемая на большом количестве различных исходных данных. Таким способом обеспечивается взаимная независимость подзаданий.

При развертывании сервера BOINC (см. третью статью серии) подзадания для тестирования приложения создавались с помощью утилиты create_work, как показано ниже:

boincadm@boincserver:~/projects/myapp> ./bin/create_work -appname uppercase
-wu_name test -wu_tiplate tiplates/upper_case_wu -result_tiplate
tiplates/upper_case_result in

Однако если количество подзаданий велико, то такой «ручной» подход уже не подходит, и требуется автоматизированное решение. Поэтому в данной статье будут описаны параметры утилиты create_work, и на их основе будет подготовлен bash-сценарий для автоматизации процесса создания подзаданий.

Подготовка к работе

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

Для иллюстрации работы с задачей, которую можно разбить на большое число сравнительно небольших подзадач, потребуется достаточно объемный текст, например, пьеса «Гамлет» Уильяма Шекспира. Задача состоит в том, чтобы получить текст пьесы, в котором все символы переведены в верхний регистр.

Предварительно необходимо выяснить, сколько символов содержится в тексте. Для этого можно использовать следующую команду:

boincadm@boincserver:~> wc -c pg1524.txt
193082 pg1524.txt

После этого исходный файл необходимо разбить на фрагменты по 1000 символов каждый. Для этого используется утилита split, и в результате ее работы должно получиться 194 фрагмента:

boincadm@boincserver:~> split -a 3 -d -b 1000 pg1524.txt

Теперь в домашнем каталоге находятся 194 текстовых файла с именами вида x157, которые послужат исходными данными для проведения распределенных вычислений на базе платформы BOINC.

Параметры подзадания

Прежде чем переходить к непосредственному созданию подзаданий необходимо определить, какие параметры можно (или нужно) при этом указывать. Подзадания для проекта BOINC создаются с помощью утилиты create_work, расположенной в подкаталоге bin каталога проекта. Формат вызова этой утилиты следующий:

create_work [параметры] &<входной файла 1&> &<входной файл 2&> ... &<входной файл N&>

В таблице 1 приведен список параметров, которые могут быть переданы утилите через командную строку.

Таблица 1. Список параметров, передающихся утилите create_work в командной строке.
параметрназначение

обязательные параметры

--appname &<имя приложения&>

имя приложения, к которому относится подзадание. Так как в рамках одного проекта могут проводиться вычисления с помощью различных приложений, этот параметр дает возможность отделить подзадания, относящиеся к разным приложениям.

--wu_name &<имя подзадания&>

уникальное имя, по которому сервер BOINC обращается к подзаданию.

--wu_tiplate &<имя файла&>

путь к xml-файлу, содержащему шаблон подзадания.

--result_tiplate &<имя файла&>

путь к xml-файлу, содержащему шаблон результата, который будет получен при успешном выполнении подзадания.

необязательные параметры

--config_dir &<название каталога&>

каталог, содержащий файл настроек проекта (файл config.xml)

--batch &<x&>

идентификатор пакета рабочих заданий (по умолчанию 0).

Однако помимо параметров, перечисленных в таблице 1, существуют еще четыре группы необязательных параметров, которые можно передать утилите create_work как через командную строку, так и в шаблоне подзадания.

Таблица 2. Список необязательных параметров, передающихся утилите create_work через командную строку или в шаблоне подзадания.
параметрназначение

оценки и ограничения ресурсов

--rsc_fpops_est &<x&>

(по умолчанию 3600*109) — среднее число операций с плавающей точкой, требуемых для выполнения подзадания: используется для оценки времени выполнения рабочего задания на каждом конкретном компьютере.

--rsc_fpops_bound &<x&>

(по умолчанию 86400*109) — максимально допустимое количество операций с плавающей точкой, требуемых для выполнения подзадания: если это значение будет превышено, приложение будет принудительно завершено. Этот параметр можно использовать для борьбы с зациклившимися приложениями.

--rsc_miory_bound &<x&>

(по умолчанию 5*108) — максимально допустимый объем оперативной памяти (в байтах), необходимый для выполнения подзадания: если компьютер не обладает таким объемом оперативной памяти, то ему подзадание отправлено не будет.

--rsc_disk_bound &<x&>

(по умолчанию 1*109) — максимально допустимый объем места на жестком диске (в байтах), занимаемого приложением, включая все входные, выходные и временные файлы: если компьютер не обладает таким объемом места на жестком диске, то подзадание ему отправлено не будет; кроме того, если это значение будет превышено работающим приложением, то оно будет принудительно завершено.

--rsc_bandwidth_bound &<x&>

(по умолчанию 0.0) — минимально допустимая пропускная способность канала связи: если пропускная способность канала связи компьютера ограничена меньшим значением, то подзадание отправлено ему не будет.

параметры избыточности вычислений

--delay_bound &<x&>

(по умолчанию 7*86400 — т.е. 7 суток) — верхняя граница времени (в секундах), которое может пройти с момента отправки экземпляра подзадания клиенту до момента получения результата: если клиент вернет результат позже, чем указано в параметре, планировщик не будет обрабатывать полученный результат — автоматически будет создан новый экземпляр подзадания для отправки другому клиенту.

--min_quorum &<x&>

(по умолчанию 2) — минимальное количество "участников кворума": валидатор будет обрабатывать результаты подзаданий только при получении необходимого их количества.

--target_nresults &<x&>

(по умолчанию 2) — количество первоначально создаваемых экземпляров подзадания, оно должно быть не меньше значения параметра min_quorum.

--max_error_results &<x&>

(по умолчанию 3) — максимально допустимое количество экземпляров подзадания, завершившихся с ошибкой на стороне клиента: при превышении этого значения рабочее задание помечается как завершившееся с ошибкой.

--max_total_results &<x&>

(по умолчанию 10) — максимально допустимое количество экземпляров подзадания: при превышении этого значения подзадание помечается как завершившееся с ошибкой.

--max_success_results &<x&>

(по умолчанию 6) — максимально допустимое количество экземпляров подзадания, завершившихся успешно: если это значение превышено, но единый (канонический) результат не был достигнут, подзадание помечается как завершившееся с ошибкой.

--priority &<x&>

приоритет подзадания. Подзадания с более высоким значением приоритета назначаются клиентам раньше подзаданий с низким приоритетом.

параметры назначаемых подзаданий

--assign_all

назначить подзадание всем клиентам.

--assign_host &<ID&>

назначить подзадание клиенту с идентификатором ID.

--assign_user_one &<ID&>

назначить подзадание одному из клиентов, принадлежащих пользователю с идентификатором ID.

--assign_user_all &<ID&>

назначить подзадание всем клиентам, принадлежащим пользователю с идентификатором ID.

--assign_team_one &<ID&>

назначить подзадание одному из клиентов, принадлежащих команде с идентификатором ID.

--assign_team_all &<ID&>

назначить подзадание всем клиентам, принадлежащим команде с идентификатором ID.

прочие параметры

--additional_xml &<x&>

дополнительные параметры в формате XML: например, число кредитов, начисляемых за выполнение подзадания: "&<credit&>12.4&</credit&>".

--wu_id &<x&>

идентификатор существующего подзадания (служебный параметр, используемый утилитой boinc_submit).

При указании параметров необходимо учесть, что имена файлов с шаблонами входных данных и результатами подзадания указываются в виде относительных путей от корневого каталога проекта. Как правило они помещаются в каталог tiplates.

Значение параметра в файле шаблона подзадания записывается в виде xml-тега, как показано ниже:

<max_error_results>3</max_error_results>

Все параметры подзадания, передаваемые утилите create_work, должны располагаться между открывающим тегом &<workunit&> и закрывающим &</workunit&>.

Bash-сценарий для автоматической генерации подзаданий

Первый и наиболее простой способ для автоматической генерации подзаданий заключается в создании сценария, последовательно выполняющего все действия, которые ранее выполнялись из командной строки.

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

В листинге 1 приведен XML-файл с шаблоном подзадания, в котором установлены необходимые параметры (теги min_quorum и delay_bound).

Листинг 1. Шаблон подзадания
<file_info>
        <number>0</number>
</file_info>
<workunit>
        <file_ref>
                <file_number>0</file_number>
                <open_name>out_ham</open_name>
        </file_ref>
        <min_quorum>2</min_quorum>
        <target_nresults>3</target_nresults>
	      <delay_bound>3600</delay_bound>
</workunit>

Шаблон подзадания необходимо сохранить в файл upper_case_wu в каталоге tiplates. Там же будет храниться файл с шаблоном результата (можно использовать шаблон результата из предыдущей статьи).

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

Листинг 2. Сценарий для автоматической генерации подзаданий
#!/bin/bash
for i in $( ls ./workunits); do
  	cp ./workunits/$i `./bin/dir_hier_path $i`
  	./bin/create_work --appname uppercase --wu_name wu_$i --wu_template 
	templates/upper_case_wu --result_template templates/upper_case_result $i
done

Bash-сценарий запускается из корневого каталога проекта и для каждого исходного файла регистрирует подзадание с одними и теми же шаблонами подзадания и результата. При этом сами подзадания копируются в специальные каталоги BOINC-проекта и получают имена вида wu_x157 (за это отвечает параметр --wu_name wu_$i).

Отдельного упоминания заслуживает утилита dir_hier_path, использующаяся для копирования файлов исходных данных в специальные каталоги BOINC-проекта. Сервер крупного проекта может содержать огромное количество файлов, предназначенных для передачи клиентским компьютерам или полученных от них в рамках выполнения подзаданий. Если хранить все эти файлы в одном каталоге, то на поиск конкретного файла будет тратиться большое количество времени. Чтобы справиться с этой проблемой, BOINC-проекты используют иерархическую структуру каталогов upload и download.

Каждый из этих каталогов состоит из 1024 подкаталогов с именами от 0 до 3ff(т.е. от 0 до 1023). Каждый файл исходных данных для подзаданий размещается в одном из этих подкаталогов, причем принятие решения о том, куда именно будет скопирован файл, принимается на основе хэша от имени этого файла. Поэтому при создании подзадания необходимо убедиться, что входной файл займет правильное место в структуре подкаталогов download. Делается это с помощью специальной утилиты dir_hier_path, предоставляющей полный путь к подкаталогу, в котором будет размещаться исходный файл, и при необходимости создающей этот подкаталог. Таким образом, команда

boincadm@boincserver:~> cp file_name.txt `./bin/dir_hier_path file_name.txt`

копирует исходный файл file_name.txt подзадания в соответствующий подкаталог каталога download BOINC-проекта.

Запуск проекта

После запуска сценария необходимо убедиться, что подзадания были успешно добавлены в проект. Для этого в Web-интерфейсе управления проектом (см. статью «Интерфейс администрирования проекта BOINC») необходимо перейти по ссылке Workunits в разделе Browse database и в Query workunit table нажать кнопку Ok. Если регистрация подзаданий прошла успешно, то будет показан список подзаданий, изображенный на рисунке 1.

Рисунок 1. Список подзаданий проекта
Рисунок 1. Список подзаданий проекта
Рисунок 1. Список подзаданий проекта

Как только в проекте появятся свободные клиенты, планировщик начнет раздавать подзадания, и постепенно они начнут помечаться как выполненные. По завершении выполнения всех подзаданий в каталоге upload будут находиться файлы, содержащие текст пьесы «Гамлет», записанный буквами в верхнем регистре. (Примечание. Если использовался текст на русском языке, то может возникнуть непредвиденная проблема из-за функции toupper.)

Все файлы из каталога upload необходимо скопировать в одно место, например, в подкаталог workunits каталога проекта, как показано ниже:

boincadm@boincserver:~> cp upload/*/wu_x* workunits/

Чтобы проверить, что приложение UpperCase отработало без сбоев, можно просмотреть содержимое какого-нибудь файла:

boincadm@boincserver:~> head -n 2 workunits/wu_x091_0_0
RICH GIFTS WAX POOR WHEN GIVERS PROVE UNKIND.

Осталось только объединить все выходные файлы подзаданий с помощью команды cat:

boincadm@boincserver:~> cat workunits/wu_x* ] workunits/Hamlet.txt

В файле Hamlet.txt будет содержаться текст пьесы «Гамлет», переведенный в верхний регистр. В данном случае объединить результаты подзаданий в конечный результат вручную оказалось не так и сложно. Однако для более сложных задач одной команды будет уже недостаточно. Поэтому в одной из следующих статей будет рассказано, как заставить BOINC самостоятельно выполнить эту рутинную работу и уведомить об окончании выполнения проекта.

Заключение

В седьмой статье серии, посвященной платформе организации распределенных вычислений BOINC, рассказывается об автоматической генерации подзаданий для проекта. Были подробно рассмотрены параметры утилиты create_work, предназначенной для регистрации подзаданий в проекте BOINC. Для изучения этой утилиты использовался пример UpperCase и текст пьесы Уильяма Шекспира «Гамлет», разбитый на большое количество файлов. Каждый из этих файлов послужил входными данными для приложения UpperCase, выполняющегося параллельно в рамках проекта BOINC. Подзадания были созданы с помощью bash-сценария, выполнившего всю рутинную работу.

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

В следующей статье тема автоматической генерации подзаданий будет продолжена на примере программы, написанной на языке C и использующей API BOINC для создания большого количества подзаданий. Кроме того, будет рассмотрен «хакерский» вариант автоматической генерации подзаданий — запись напрямую в базу данных проекта BOINC.


Ресурсы для скачивания


Похожие темы


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=824278
ArticleTitle=Программирование для BOINC: Часть 7. Автоматическая генерация подзаданий с помощью bash-сценария
publish-date=07052012