Способ распараллеливания программ в вычислительной системе
PROGRAM MULTI-SEQUENCING METHOD IN THE COMPUTER SYSTEM

Предлагаемое изобретение относится к вычислительной технике и, в частности, к области параллельных вычислений и может быть использовано для решения задач интеллектуального анализа данных.
Уровень техники
Реализация параллельного выполнения вычислений в общем случае является сложной задачей. В большинстве случаев распараллеливание для выполнения задач осуществляется применительно к конкретному приложению и конкретной задаче. Такой подход является весьма трудоемким, и при этом может быть малоэффективным, по причине ошибок, которые может допустить разработчик при осуществлении.
Особенно это характерно для задач интеллектуального анализа данных (ИАД). Такой вид анализа данных обычно предполагает обработку больших объемов данных, что, соответственно, требует использования значительных вычислительных ресурсов для обеспечения приемлемого времени выполнения анализа. Поэтому актуальным направлением в разработке и реализации алгоритмов ИАД является ориентация на выполнение алгоритмов анализа в распределенной вычислительной среде, которое должно поддерживаться поддерживается методами реализации алгоритмов ИАД с целью их распараллеливания.
Известен способ автоматического распараллеливания цикловых областей в алгоритмической части программы (патент РФ №2411569, приоритет от 29.01.2009 г.), позволяющий максимизировать количество параллельных циклов путем применения межпроцедурных и внутрипроцедурных оптимизаций, характеризующийся встраиванием в программу динамических проверок на эффективность распараллеливания, включающий следующие шаги:
• предварительно, на этапе промежуточного представления программы при выполнении преобразований строят любыми известными способами, а если уже построены, то используют, по крайней мере, следующие аналитические структуры данных: граф потока управления, дерево доминаторов, дерево циклов, граф потока данных;
• выполняют подстановки промежуточного представления процедур в места вызовов;
• выполняют межпроцедурный анализ потока данных, для обнаружения эквивалентных операций;
• выполняют анализ потока данных, предпочтительно способом нумераций значений;
• выполняют анализ переменных цикла на инвариантность и индуктивность;
• выполняют анализ операций доступа в массивы,
• строят индексы доступа в массивы в виде канонических форм сумм произведений;
• выполняют слияния циклов;
• выполняют вынос инвариантных условий;
• изменяют порядок обхода итерационного пространства циклов,
• выполняют анализ параллельных циклов,
причем при выполнении межпроцедурного анализа потока данных применяют метод, чувствительный к контексту и чувствительный к потоку управления,
причем подстановку осуществляют в цикловых областях для получения максимального количества циклов, не содержащих вызовы процедур,
причем способ нумераций значений дополнительно проверяют анализом, уточняющим эквивалентность для операций доступа в память,
причем при построении канонических форм используют результаты анализа потока данных методом нумераций значений,
причем при анализе параллельных циклов дерево циклов
• обходят рекурсивно от корневого узла с проверкой на возможность распараллеливания текущего цикла,
• при этом выполняют следующие виды анализа: анализ структуры цикла на наличие единственного выхода, поскольку
распараллеливать возможно только циклы с одним выходом, управление которым осуществляется индуктивной переменной с инвариантными верхней и нижней границами, а также инвариантным шагом;
анализ на наличие редукций цикла, распознанные редукции исключают при анализе межитерационных зависимостей;
анализ межитерационных зависимостей в цикле, преимущественно с помощью решения диофантовых уравнений;
анализ массивов на локальность,
причем для параллельных циклов осуществляют построение копии цикла и динамически осуществляют проверку на время исполнения итераций и сравнение этого времени с затратами ресурсов на запуск параллельного цикла,
причем для параллельных циклов выполняют построение операций, которые обеспечат параллельное исполнение циклов, при параллельном исполнении выполняют запуск нескольких потоков, каждый из которых выполняет часть итераций цикла,
причем тело параллельных циклов выделяют в новую процедуру, параметрами которой назначают нелокальные данные итераций цикла, а локальные структуры данных итераций цикла назначают локальными структурами данных созданной процедуры.
Известный способ относится к области компьютерного программирования и, в частности, к области оптимизирующей компиляции - преобразованию текста программы в машинные коды.
Оптимизирующий компилятор выполняет это преобразование так, чтобы достичь наилучшего показателя для получаемого кода по некоторому критерию. Чаще всего этим критерием является максимальная скорость исполнения программы на целевой архитектуре (платформе).
Однако, известный способ имеет недостатки.
Для использования данного способа разработчик должен иметь заранее реализованные компиляторы и среды выполнения программ, при разработке которых использовался данный способ. При этом подобные компиляторы редко реализованы заранее, могут не иметь совместимости с нужными аппаратными и программными платформами. Реализация компиляторов в соответствии с данным способом является отдельной специальной задачей, требующей соответствующих навыков и опыта.
Известный способ позволяет увеличить быстродействие программ на отдельной вычислительной машине. Однако, ИАД связан с анализом больших объемов данных, что, соответственно, требует использования значительных вычислительных ресурсов для обеспечения приемлемого времени выполнения анализа. По данным причинам актуальным направлением в разработке и реализации алгоритмов ИАД является ориентация на выполнение алгоритмов анализа в распределенной вычислительной среде, поэтому для алгоритмов ИАД одной вычислительной машины недостаточно.
Известен также способ выполнения обработки данных в среде распределенной и параллельной обработки (патент США №9612883, приоритет от 06.12.2013 г.), который также иногда называют MapReduce.
Способ включает:
• в совокупности соединенных между собой вычислительных систем, каждая из которых имеет один или несколько процессоров и память:
выполнение множества рабочих процессов;
выполнение не зависящего от приложения контрольного процесса в совокупности соединенных между собой вычислительных систем, для:
определение, для входных файлов, множества задач обработки данных, включая множество данных, специфицирующих задачи отображения из входных файлов, которые будут обработаны [для получения] промежуточных значений данных, и множества задач сокращения, определяющие промежуточные значения данных, которые будут переработаны в финальные выходные данные;
присвоение задачам обработки данных статуса незанятых в рабочих процессах:
использование совокупности не зависящих от приложения функций отображения, выполняемых 1-м подмножеством из множества рабочих процессов, чтобы считывать части входных файлов, содержащих данные, и сформировать промежуточные значения данных посредством применения, по крайней мере, одной, определенной пользователем, специализированной приложением операции отображения к данным;
• сохранение промежуточных значений данных в совокупности промежуточных структур данных, распределенных среди множества соединенных между собой вычислительных систем; и
• использование совокупности не зависящих от приложения функций сокращения, отличных от совокупности не зависящих от приложения функций отображения, чтобы сформировать финальные выходные данные посредством применения, по крайней мере, одной, определенной пользователем, специализированной приложением операции сокращения с промежуточными значениями данных, причем совокупность не зависящих от приложения функций сокращения выполняется 2-м подмножеством из множества рабочих процессов;
причем совокупность не зависящих от приложения функций отображения и совокупность не зависящих от приложения функций сокращения независимы от специализированных приложением операторов и операций, включая, по крайней мере, одну определенную пользователем, специализированную приложением операцию отображения и, по крайней мере, одну, определенную пользователем, специализированную приложением операцию сокращения.
Способ может также включать применение операции разделения, по крайней мере, к подмножеству промежуточных значений данных, причем для каждого соответствующего промежуточного значения данных, по крайней мере, в подмножестве промежуточных значений данных, операция разделения определяет соответствующую промежуточную структуру данных множества промежуточных структур данных, в которых сохраняются соответствующее промежуточное значение данных.
Способ может также предусматривать, что соответствующая специализированная приложением операция отображения включает специализированную приложением операцию объединения для объединения начальных значений, сформированных посредством выполнения соответствующей специализированной приложением операцией отображения, так чтобы сформировать промежуточные значения данных.
В ходе выполнения способа количество задач отображения превышает значение множества процессов, которым контролирующий процесс может назначить задачи отображения; и контролирующий процесс поддерживает информацию о состоянии относительно задач отображения, ждущих назначения в рабочий процесс.
Описанный способ принят за прототип.
Основным недостатками известного способа являются то, что известный способ подходит только для некоторых задач ИАД. При этом существуют алгоритмы ИАД, например, Apriori, PageRank и др., для которых данный способ не походит, так как алгоритмы не обладают списочным гомоморфизмом (Gorlatch S. Extracting and Implementing List Homomorphisms in Parallel Program Development // Science of Computer Programming, 1999, v. 33, pp. 1-27; Dean J., Ghemawat S. MapReduce: Simplified Data Processing on Large Clusters // In Proceedings of the USENIX Symposium on Operating SystemsDesign & Implementation (OSDI), 2004, pp. 137-147; Harmelen R, Kotoulas S., Oren E., Urbani J. Scalable Distributed Reasoning using Map Reduce // Proceedings of the International Semantic Web Conference, 2009, v. 5823, pp. 293-309).
Алгоритмами не обладающие списочным гомоморфизмом являются алгоритмы, которые дают разные результаты, в случае, если применять их к полному набору данных, и в случае, если применять алгоритм к частям исходных данных с последующим объединением результатов. Если разделить исходные данные алгоритма ИАД, не обладающего списочным гомоморфизмом, на части, и далее применить алгоритм отдельно к полученным частям, а после получения результатов для отдельных частей исходных данных объединить полученные результаты, то финальные результаты будут некорректными (Gibbons J. The Third Homomorphism Theorem // Journal of Functional Programming, 1996, v. 6, pp. 657-665).
Раскрытие сущности изобретения
Техническим результатом является расширение класса решаемых задач, включая задачи (алгоритмы), которые не обладают списочным гомоморфизмом.
Для этого предлагается способ распараллеливания программ в вычислительной системе, включающей совокупность соединенных между собой систем, каждая из которых имеет один или несколько процессоров и память, причем каждая система содержит установленное на каждую систему и сконфигурированное программное обеспечение, выполненное с возможностью
• передачи данных из множества рабочих процессов в главный рабочий процесс,
• приема данных в главном рабочем процессе из множества рабочих процессов,
• определения номера рабочего процесса в системе,
• выполнения множества рабочих процессов, в том числе главного рабочего процесса
• передачи рабочих процессов в системы для выполнения множества рабочих процессов, в том числе и главного рабочего процесса
• считывания из входных файлов или баз данных множества исходных данных, специфицирующих задачу,
• сохранения промежуточных и финальных значений данных;
способ заключается в том, что
• получают входные данные и приложение для их обработки,
• формируют функции отображения, преобразующие исходные данные D из файлов или баз данных в набор списочных структур данных, содержащих списки атрибутов и списки векторов;
• осуществляют декомпозицию приложения в последовательность обособленных функций, реализующих шаги приложения и представляющих собой функции без последействия, причем каждая отдельная функция выполнена с возможностью
считывать модели знаний и структуры данных,
выполнять заданные преобразования;
• формируют специализированную приложением функцию разбиения исходных данных на части для работы одного из множества рабочих процессов;
• формируют специализированную приложением функцию объединения результатов работы множества рабочих процессов в единые промежуточные модели знаний в виде набора списочных структур данных;
• формируют специализированную приложением функцию для формирования финальной выходной модель знаний из промежуточной модели знаний, полученной на последнем этапе;
• формируют функцию приема данных главного рабочего процесса, выполненную с возможностью принимать данные из множества рабочих процессов;
• формируют функцию главного рабочего процесса, выполненную с возможностью запускать выполнение
функции разбиения исходных данных на части;
обособленных функций на множестве рабочих процессов;
функции объединения;
функцию приема данных главного рабочего процесса;
• формируют функцию рабочих процессов, выполненную с возможностью запускать на выполнение
о обособленные функции в данном рабочем процессе;
функцию передачи результатов работы обособленных функций в главный рабочий процесс;
• запускают выполнение функцию главного рабочего процесса, с помощью которой выполняет следующие действия
преобразуют с помощью функции отображения исходные данные D из файлов или баз данных в набор списочных структур данных, содержащих списки атрибутов и списки векторов;
передают исходные данные D и входную модель знаний М на первом шаге в первую обособленную функцию, реализующую шаг приложения;
выполняют последовательность обособленных функций, реализующих шаги приложения, начиная с первой, на множестве рабочих процессов, причем на каждом шаге
выполняют заданные преобразования в обособленной функции;
передают после завершения работы обособленной функции промежуточные структуры данных из множества рабочих процессов в главный рабочий процесс;
принимают данные из множества рабочих процессов в главном рабочем процессе;
объединяют с помощью функций объединения результаты работы множества рабочих процессов в единую промежуточную модель знаний;
передают исходные структуры данных и единую промежуточную модель знаний в следующую обособленную функцию;
после окончания работы всех обособленных функций объединяют полученные на последнем шаге единые промежуточные модели знаний в финальную выходную модель знаний;
получают финальную выходную модель знаний.
Предлагаемый способ подразумевает подход к распараллеливанию программ на функциональных языках программирования, реализующих алгоритмы ИАД. Способ подразумевает использование функциональных языков программирования. Использование функциональных языков программирования снижает вероятность ошибки пользователя, по сравнению с реализацией на императивных языках. Это достигается, в том числе, благодаря отсутствию при функциональном подходе потенциальных ошибок, связанных с переменными и присваиванием им новых значений. При этом программы на функциональных языках являются менее эффективными по критерию быстродействия (Себеста Роберт У. Основные концепции языков программирования, 5-е изд.: М.: Изд. дом «Вильяме», 2001 г., 672 с.).
Способ предполагает разделение программ на функциональных языках, реализующих алгоритмы ИАД, на отдельные шаги, которые представляют собой обособленные функции без последействия, каждая из которых может выполняться в параллельном режиме. Выполнение в параллельном режиме каждой отдельной обособленной функции, а не всего алгоритма сразу, позволяет, в отличие от MapReduce, применять данный способ для распараллеливания алгоритмов, которые не обладают списочным гомоморфизмом.
Алгоритмы ИАД на входе принимают набор входных данных, а результатом их работы является финальная выходная модель знаний. Таким образом, каждый алгоритм ИАД задает функцию, так как получает на вход набор входных данных и выдает результат применения алгоритма к входным данным в виде финальной выходной  модели знаний. Следовательно, алгоритм ИАД можно представить в виде функции, которой в качестве аргумента передается набор входных данных D, а возвращаемым значением является построенная финальная выходная модель знаний М.
В ходе работы алгоритмы ИАД анализируют набор данных и строят промежуточную модель знаний на каждом шаге. Построенная промежуточная модель знаний передается на следующий этап. Таким образом, каждый шаг алгоритма ИАД должен принимать набор данных и промежуточную модель знаний в качестве входных аргументов. Результатом работы шага является новая промежуточная модель знаний.
Таким образом, алгоритм ИАД можно представить в виде последовательности вызовов функций без последействия, представляющих шаг алгоритма. Далее такие функции будут называться обособленными функциями, имеющие вид
i
где F - обособленная функция, реализующая i-й шаг алгоритма ИАД, принимает на вход набор исходных данных (D) алгоритма ИАД и промежуточную модель знаний.
Чистой функцией называется детерминированная функция без последействия. Детерминированной функцией называется функция, результат которой зависит только от входных параметров. Функцией без последействия называется функция, которая не изменяет состояния программы, т.е. не изменяет переменные и другие области памяти, значения которых могут обрабатываться после завершения выполнения функции.
1
При этом обособленная функция F реализующая 1-й шаг алгоритма ИАД, принимает набор данных и пустую модель знаний в качестве входных аргументов.
n
Результатом работы функции является промежуточная модель знаний, которая используется на следующем шаге, а результатом работы функции F является финальная выходная модель знаний.
При этом при реализации алгоритма ИАД одна и та же обособленная функция или группа обособленных функций может вызываться рекурсивно до достижения определенного условия, в зависимости от алгоритма.
Ниже приведен пример определения обособленной функции, которая принимает на вход набор исходных данных (D) алгоритма ИАД и промежуточную модель знаний. Здесь и далее для примеров будет использоваться нотация языка функционального программирования Common Lisp
[статья по адресу: http://www.lispworks.com/documentation/HyperSpec/Front/Contents.htm].
Промежуточная модель знаний в примере обозначена параметром функции с именем MP.
(defun <имя_функции> (D MP)
<тело_функции>)
В примере выше <имя_функции> - это имя обособленной функции. D и MP -входные параметры. В языке Common Lisp в определении функции отсутствуют возвращаемые результаты, при этом возвращаемые результаты определяются телом функции. В примере <тело_функции> - реализации тела функции, которое формирует промежуточную модель знаний.
Использование функционального подхода, и, соответственно, чистых функций позволяет обеспечить отсутствие потенциальных ошибок, связанных с переменными и присваиванием им новых значений. На результат работы функций влияют только входные параметры, что исключает появление ошибок, которые трудно обнаружить. Подобные ошибки могут быть связанны, например, с присваиваниями значений одной и той же переменной в различных участках кода.
Кроме того, повышается удобство тестирования и отладки программы. На результат работы функций влияют только входные параметры, поэтому для тестирования функций достаточно проверить значения функций при различных входных параметрах.
Набор исходных данных (D) алгоритма ИАД нужно представить в виде списочных структур данных функционального языка программирования: списка атрибутов и списка векторов. На языке Common Lisp набор исходных данных (D) можно представить в виде структуры, содержащей список атрибутов (attributes_list), список векторов (vectors_list) и список всех возможных классов целевого атрибута (class_list):
Список из K атрибутов attributes_list можно определить следующим образом (defparameter attributes_list (list attr0, …, attrK)),
где attr<i> - список возможных значений i-ro атрибута.
Ниже приведен пример для атрибута 0, который может иметь пять значений:
(defparameter attr0 (list 0.5 3.0 4.5 5.4 2.5))
Список из L векторов можно определить следующим образом
(defparameter vectors list (list vector0, vector 1, vectorL))
где vector<i> - список конкретных значений каждого атрибута и значения целевого атрибута.
Значение i-ro атрибута располагается на i-м месте в списке. Если значение целевого атрибута неизвестно, то в языке Common Lisp оно может быть задано символом nil. Значение целевого атрибута можно расположить в конце списка. Ниже приведен пример для вектора 0, в котором первые четыре значения соответствуют значениям атрибутов, а последнее значение соответствует значению целевого атрибута:
(defparameter vector0 (list 1.5 4.0 4.2 5.5 8.5))
Структура промежуточной (MP) и финальной выходной модели знаний (М) зависит от алгоритма и функции, реализующей ИАД. Промежуточную (MP) и финальную выходную модель знаний (М) удобно представлять в виде списочных структур данных. Например, распространенной среди алгоритмов ИАД является модель знаний в виде деревьев решений. Для деревьев решений узлы дерева и соответствующие им множества, можно представить в виде списков. В общем виде промежуточную модель знаний можно представить в виде структуры, содержащей список параметров текущего шага step_list и списка правил rules_list:
Список параметров текущего шага step_list может содержать, например, список атрибутов, которые еще не использовались для построения модели знаний, и, следовательно, должны быть обработаны на следующих шагах. Список правил rules_list представляет собой часть сформированной на данный момент финальной выходной модели знаний.
Предложенный подход предполагает введение функций циклов по векторам и атрибутам, так как в алгоритмах ИАД данные циклы являются достаточно частой операцией. Следует отметить, что при функциональном подходе для организации повторений допустима только рекурсия. Использование указанных встроенных функций должно обеспечить однотипность реализации и снизить вероятность ошибки при реализации циклов, так как функционал для циклов по векторам или атрибутам реализуется один раз, а далее должен использоваться в качестве шаблона.
Приложения ИАД в основном характеризуются параллелизмом данных. В этом случае требуется добавление функционала разбиения данных и объединения результатов, полученных в разных рабочих процессах. Выполнение в параллельном режиме каждой отдельной обособленной функции, а не всего алгоритма сразу, позволяет, в отличие от MapReduce, применять данный способ для распараллеливания алгоритмов, которые не обладают списочным гомоморфизмом.
Для параллельного выполнения приложения подход целесообразно добавление функций, которые позволит распараллеливать приложение для системы MPI (Message Passing Interface; статья по адресу: http://parallel.ru/tech/tech_dev/mpi.html). При этом правильно сконфигурированная MPI система, установленная на совокупность соединенных между собой систем, каждая из которых имеет один или несколько процессоров и память, обладает возможностью
• передачи данных из множества рабочих процессов в главный рабочий процесс,
• приема данных в главном рабочем процессе из множества рабочих процессов,
• определения номера рабочего процесса в системе,
• выполнения множества рабочих процессов, в том числе главного рабочего процесса
• передачи рабочих процессов в системы для выполнения множества рабочих процессов, в том числе и главного рабочего процесса
В число функций, которые нужно реализовать для параллельного выполнения приложения входят:
• специализированная приложением функция разбиения исходных данных на части для работы одного из множества рабочих процессов;
• специализированная приложением функция объединения результатов работы множества рабочих процессов в единые промежуточные модели знаний в виде набора списочных структур данных;
• специализированная приложением функция для формирования финальной выходной модель знаний из промежуточной модели знаний, полученной на последнем этапе;
• функция приема данных главного рабочего процесса, выполненная с возможностью принимать данные из множества рабочих процессов;
• функция рабочего процесса, выполненная с возможностью запускать выполнение
обособленных функций в данном рабочем процессе;
функцию передачи результатов работы обособленных функций в главный рабочий процесс;
• функция главного рабочего процесса, выполненная с возможностью запускать выполнение
функции разбиения исходных данных на части;
функции объединения;
функцию приема данных главного рабочего процесса.
Исходные данные D из файлов или баз данных (БД) должны быть считаны главным рабочим процессом в набор списочных структур данных, содержащих списки атрибутов и списки векторов. Функционалом для считывания из входных файлов или БД множества исходных данных, специфицирующих задачу, должна обладать сконфигурированная MPI система. Так как главный рабочий процесс может быть запущен на любой машине, входящей в систему, то доступ к файлам или БД должен быть у любой машины в системе.
С целью упрощения реализации для некоторых случаев каждый рабочий процесс может считать самостоятельно входные данные из файлов или БД. При этом рабочий процесс может считать не все данные, а только ту часть данных, которая предназначена ему для обработки. Диапазон данных для обработки рабочий процесс может получить от главного рабочего процесса, а также может вычислить его с помощью функции разбиения исходных данных на части, в зависимости от удобства реализации.
При запуске рабочего процесса в системе ему присваивается порядковый номер. Каждый рабочий процесс имеет свой порядковый номер. Каждый процесс может отличить является ли он главным или рабочим процессом по порядковому номеру, порядковый номер главного процесса должен быть изначально задан и соответствующим образом интерпретироваться. На одной машине, входящей в совокупность соединенных между собою систем, может быть запущено несколько рабочих процессов, в зависимости от числа процессорных ядер на машине.
Осуществление изобретения
Реализация предложенного способа может быть осуществлена в вычислительной системе, работающей, например, под управлением операционной системы Linux.
Для реализации способа достаточно реализовать выполнение предложенных операций на каком-либо языке функционального программирования, например, на языке Common Lisp (статья по адресу: http://www.lispworks.com/ documentation/HyperSpec/Front/Contents.htm).
Реализовать действия предложенного способа в составе программы или функции может специалист в области программирования (программист), зная выполняемые действия.
В качестве примера рассмотрим алгоритм С4.5 (Hssina В. et al. A comparative study of decision tree ID3 and C4.5, статья по адресу:
http://saiconference.com/Downloads/SpecialIssueNolO/Paper_3-A_comparative_study_of_decision_tree_ID3_and_C4.5.pdf;
Деревья решений - C4.5 математический аппарат. Часть 1, статья по адресу:
https://basegroup.ru/community/articles/math-c45-partl)
Для реализации использовалась ОС Linux, Steel Bank Common Lisp (SBCL) v1.0.29.11, MPICH (статья по адресу: http://www.mpich.org/downloads/). Алгоритм базируется на теоретико-информационном подходе и является усовершенствованной версией алгоритма ID3 (Iterative Dichotomizer). Алгоритм включает четыре основных шага:
• формируется корневой узел дерева, с которым ассоциируется все множество векторов V из набора исходных данных D; в (2) множество векторов V задает vectors_list;
i
• для каждого формируемого узла дерева решений и ассоциированного с ним множества векторов V выбирается атрибут А для разбиения;
1
2
1n
i
i1
i2
in
1
2
n
• если выбранный атрибут А принимает п значений А, А … A, то выбранный атрибут А разбивает множество векторов V на подмножества V, V … V, при А равном, соответственно, А, А  … A;
• шаги повторяются до тех пор, пока в каждом строящемся узле дерева не окажутся векторы, соответствующие одному классу, либо пустое множество векторов.
На втором шаге для выбора наиболее подходящего атрибута используется следующий критерий:
где А - атрибут по которому производится разбиение на текущем шаге;
n - количество значений независимого атрибута А;
t - количество значений зависимого атрибута - классов;
j
c - класс, для которого производится вычисление;
j
i
i
j
freq(c, V) - количество векторов из множества V, относящихся к классу c;
ir
i
V - подмножество данных V, у которых атрибут А имеет r-е значение;
i
V - подмножество векторов ассоциированных с текущим узлом дерева.
Здесь и далее для примеров будет использоваться нотация языка функционального программирования Common Lisp (статья по адресу:
http://www.lispworks.com/documentation/HyperSpec/Front/Contents.htm).
Алгоритм С4.5 может быть представлен в виде:
где
recursion_build_tree - рекурсивная функция, которая на последнем шаге возвращает финальную модель знаний в виде дерева решений. Может быть представлена, как композиция обособленных функций (1):
Функция recursion_build_tree на первом шаге строит корневой узел дерева, с которым ассоциируется все множество векторов V из набора исходных данных D. Выставляет корневой узел в качестве обрабатываемого узла.
Далее построенная промежуточная модель знаний MP передается в качестве параметра функциям из композиции для выполнения шага. После выполнения данные функции возвращают промежуточную модель знаний MP. Из step_list, определенном в (3), функция recursion_build_tree получает список вычисленных критериев (4) для каждого атрибута, выбирает наиболее подходящий атрибут А, добавляет соответствующие значениям атрибута А узлы дерева решений к промежуточной модели MP. Функция recursion_build_tree проверяет, существуют ли узлы дерева решений в промежуточной модели, для которых требуется раскрытие с помощью функции is_finished(D MP). Если существуют, то производится рекурсивный вызов функции recursion build tree. Если такие узлы отсутствуют, то функция recursion_build_tree возвращает в качестве результата финальную выходную модель знаний М. В качестве дополнительного входного параметра функция имеет флаг is_first_call, сообщающий является ли данный вызов функции первым или рекурсивным.
Функция for_all_attributes_cycle - обособленная функция, которая выполняет итерацию по атрибутам,
A
j
i
Функция calculate_attr_gain - обособленная функция, которая вычисляет Gain {А) из (4) для обрабатываемого атрибута A. Выполняет итерацию по возможным значениям атрибута А для вычисления Info(V) из (4), а также, выполняет итерацию по всем классам для вычисления Info(V) из (4),
Функция build_final_model - специализированная приложением функция для формирования финальной выходной модель знаний из промежуточной модели знаний, полученной на последнем этапе.
Входные данные (D) для алгоритма С4.5 можно представить в виде таблицы, каждая строка которой содержит значения входных атрибутов и соответствующий им класс целевого атрибута.
Для реализации алгоритма С4.5 введем следующее представление для входных данных
где attributes list - список атрибутов;
vectors list - список векторов;
class list - список всех возможных классов целевого атрибута.
Финальная выходная модель знаний (М) для алгоритма С4.5 представляется в виде дерева решений. Промежуточная модель знаний (MP) для алгоритма С4.5 представляется в виде неполного дерева решений rules_list в (3). Также промежуточная модель знаний включает список обработанных на данный момент атрибутов, список вычисленных на последнем шаге критериев (4) для атрибутов, обрабатываемый на данном шаге узел дерева решений. Данная часть промежуточной модели обозначена как step_list в (3). Дерево решений можно представить в виде структуры вложенных списков. Первый элемент в списке содержит номер атрибута, которому соответствует данный узел, все следующие элементы являются вложенными списками, причем первым элементом в списках является значение атрибута, а вторым элементом является вложенный список, который аналогичным образом описывает узел, соответствующий данному значению атрибута:
где node_root - корневой узел дерева.
Корневой узел дерева в свою очередь можно представить в виде:
где attr_N - номер атрибута, который был выбран для построения корневого узла дерева решений, данный атрибут имеет K значений;
attr_N_value_1 - значения атрибута, соответствующее следующему узлу дерева node_1;
attr_N_value_K - значения атрибута, соответствующее следующему узлу дерева node_K.
Узлы второго яруса дерева решений node__1 … node_K определяются аналогично узлу node_root. Таким же образом определяются узлы всех последующих ярусов дерева решений.
Для параллельного выполнения алгоритма реализацию алгоритма С4.5 в (5) и (6) требуется добавление функционала разбиения данных и объединения результатов, полученных в разных рабочих процессах.
Рассмотрим вариант параллельного алгоритма, выполняющего параллельную обработку по атрибутам, реализованного с применением предложенного подхода:
где recursion_build_tree_parall - реализация функции recursion_build_tree для параллельного выполнения алгоритма с распараллеливанием по атрибутам.
В предложенном подходе функция recursion_build_tree_parall представляет собой функцию главного рабочего процесса.
где
mpi_work_process_funct - функция рабочего процесса. Получает на вход часть исходных данных, предназначенную для определенного рабочего процесса. Определяет номер процесса в MPI системе, и если номер процесса не является номером главного процесса, то запускает на выполнение обособленные функции в данном рабочем процессе. В конце своей работы передает результаты работы обособленных функций в главный рабочий процесс;
mpi_divide_attr_parall - специализированная приложением функция разбиения исходных данных на части для работы одного из множества рабочих процессов. Функция выполняет разделение списка атрибутов на части, предназначенные для каждого рабочего процесса, на основании номера рабочего процесса MPI системе, на котором она в данный момент выполняется и в качестве результат возвращает часть исходных данных D, которые должны быть в текущем рабочем процессе.
mpi_merge_attr_parall - специализированная приложением функцию объединения результатов работы множества рабочих процессов в единую промежуточную модели знаний в виде структуры (3).
Если достигнут конец алгоритма, то функция recursion_build_tree_parall формирует и возвращает в качестве результата финальную выходную модель знаний М в виде структуры (7).
Функция рабочего процесса может быть определена в виде:
где for_all_attributes_cycle и for_all_attributes_cycle - рассмотренные ранее обособленные функции.
В примере для упрощения отсутствует функционал для передачи результатов работы обособленных функций в главный рабочий процесс.
Таким образом, рассмотрена реализация распараллеливания по атрибутам алгоритма С4.5 на основе предложенного подхода.
Если применить концепцию MapReduce без доработок к последовательному варианту (5) алгоритма С4.5 для распараллеливания по атрибутам, то на фазе Map исходный набор атрибутов будет разбит на N частей, где N это количество рабочих процессов в системе. Каждая из N частей предназначена для обработки одним процессом на фазе Reduce. После завершения фазы Reduce будет получено N деревьев решений, при этом отсутствует возможность получить из этих N деревьев решений финальную выходную модель знаний, так как алгоритма С4.5 не обладает списочным гомоморфизмом. Отсюда следует, что применение концепции MapReduce к данному алгоритму требует дополнительных методов. Таким образом, предложенный способ позволяет получить корректный результат, а применение концепции MapReduce к данному алгоритму напрямую - не позволяет.