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

Из-за огромного размерного размера этих наборов данных часто важно извлечь скрытые переменные (или предполагаемые функции) с помощью глубокого обучения, чтобы уменьшить размер измерения для дальнейшего моделирования. Это включает поддержку традиционных методов, таких как обучение с учителем (прогнозирование метки по данным) и обучение без учителя (организация или объяснение данных). Цель машинного обучения в LifeOmic - дать исследователям возможность находить скрытые сведения о сочетании геномных данных и данных о пациентах, которые невозможно найти с помощью основных статистических методов.

Наличие стратегии эффективного обучения моделей глубокого обучения может быть проблемой. Apache Spark, единый аналитический движок для крупномасштабной обработки данных, и SparkML, библиотека машинного обучения, построенная на Apache Spark, предоставляют архитектуру для оркестровки сложных конвейеров на больших наборах данных. Однако в настоящее время Apache Spark не имеет готовой поддержки архитектур глубоких нейронных сетей, таких как сверточные нейронные сети для изображений, рекуррентные нейронные сети для обработки естественного языка и другие.

Конвейер разработки функций часто упускается из виду при обучении моделей машинного обучения. Конвейеры значительно упрощают процесс очистки, преобразования и подготовки необработанных данных к модели машинного обучения для выполнения прогнозов. В LifeOmic наличие правильных инструментов для проектирования функций позволяет нам автоматизировать этапы обработки необработанных данных до того, как данные будут отправлены в модель для обучения или прогнозирования. Хотя TensorFlow, высокопроизводительная библиотека численных вычислений, обычно используемая для глубокого обучения, отлично подходит для обучения различных архитектур нейронных сетей, ей не хватает инженерной поддержки функций для конвейеров на больших наборах данных по сравнению с Apache Spark.

Хотя существуют и другие библиотеки с открытым исходным кодом для обучения моделей TensorFlow на Apache Spark, очень немногие используют преимущества самой сильной стороны SparkML в области машинного обучения, заключающейся в интеграции моделей глубокого обучения с конвейерами.

Начало работы со SparkFlow

Имея это в виду, почти четыре месяца назад LifeOmic выпустила SparkFlow. SparkFlow использует удобный интерфейс API конвейера Spark и объединяет его с TensorFlow. Его можно загрузить с Github или установить через pip, используя pip install sparkflow. Ниже показан простой пример настройки конвейера в наборе данных MNIST (для классификации цифр) с помощью SparkFlow:

Разбор примера

Чтобы полностью понять, что происходит в примере, стоит пройтись по разделам SparkFlow.

def small_model():   
    x = tf.placeholder(tf.float32, shape=[None, 784], name='x')    
    y = tf.placeholder(tf.float32, shape=[None, 10], name='y') 
    layer1 = tf.layers.dense(x, 256, activation=tf.nn.relu)    
    layer2 = tf.layers.dense(layer1, 256, activation=tf.nn.relu)
    out = tf.layers.dense(layer2, 10)
    z = tf.argmax(out, 1, name='out')    
    loss = tf.losses.softmax_cross_entropy(y, out)    
    return loss

Выделенная ниже функция small_model инкапсулирует график TensorFlow. Граф представляет собой простую, полностью связанную сеть с 256 нейронами в каждом скрытом слое. Переменная «out» представляет логиты или необработанные выходные данные, которые будут использоваться для функции потерь, а переменная «z» представляет argmax, который будет использоваться для прогнозов в Spark Transformer. Наконец, функция возвращает переменную потерь, которая будет минимизирована указанным оптимизатором.

tensorflow_graph = build_graph(small_model)

После завершения функции small_model ее можно передать служебной функции build_graph, которая сериализует график TensorFlow. SparkFlow требует сериализованного графа, чтобы он мог транслировать сеть исполнителям Spark.

spark_model = SparkAsyncDL(    
    inputCol='features',    
    tensorflowGraph=tensorflow_graph,    
    tfInput='x:0',   
    tfLabel='y:0',    
    tfOutput='out:0',    
    tfLearningRate=.001,    
    iters=20)

Наконец, мы можем построить нашу модель. Есть еще несколько параметров, которые можно передать классу SparkAsyncDL, включая различные оптимизаторы (в настоящее время поддерживаются все оптимизаторы TensorFlow, начиная с версии 1.8.0), пакетные параметры и многое другое. Полный список этих опций можно найти здесь.

Архитектура SparkFlow

SparkFlow использует архитектуру драйвера / исполнителя Spark, используя драйвер в качестве сервера параметров, а исполнителей в качестве рабочих. Естественно, это создает простой путь для реализации алгоритмов асинхронного обучения, таких как Hogwild. Алгоритм Hogwild распараллеливает обучение нейронных сетей за счет наличия нейронной сети на главном узле и копий этой сети на каждом из экземпляров задачи. Затем экземпляры задач вычисляют градиенты для пакета данных и отправляют их драйверу для обновления весов. Hogwild отличается от асинхронного обучения, поскольку он предписывает подход без блокировок при обновлении основных сетевых градиентов. (Кстати, SparkFlow поддерживает как асинхронное обучение с блокировками, так и подходы без блокировок).

Используя реализацию Hogwild в SparkFlow в качестве примера, каждый раздел Spark получает копию графика и весов TensorFlow, затем вычисляет потери и градиенты по мини-пакету данных и отправляет информацию драйверу для обновления главной сети. После завершения заданного пользователем количества итераций рабочие берут веса с сервера параметров, чтобы обновить свою копию сети. Затем он может возобновить обучение.

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

Начиная с версии 0.3, SparkFlow теперь поддерживает ввод предварительно обученных моделей TensorFlow и присоединение их к конвейеру на основе Spark. Следовательно, существующие модели можно использовать для прогнозов в конвейере, что может быть полезно для компаний с существующими конвейерами Spark.

Где находится SparkFlow

Планы на будущее для SparkFlow включают реализацию оптимизации гиперпараметров для больших наборов данных, второй api, который точно отражает существующий api оценки Spark, и первоклассную поддержку нового api TensorFlow Probability. Документация и другие учебные пособия также будут оставаться приоритетными.

Резюме

По мере того, как становятся доступными все более крупные наборы данных, становится важной возможность запускать модели глубокого обучения в распределенных вычислительных системах, таких как Apache Spark. SparkFlow позволяет пользователю не только обучать модели глубокого обучения в Spark, но и присоединять обученную модель к конвейеру для непрерывного прогнозирования необработанных данных. Чтобы узнать больше о SparkFlow или следить за его развитием, вы можете посетить нашу страницу GitHub.

Мы всегда заинтересованы в обратной связи!

Дерек Миллер - архитектор машинного обучения в @lifeomic и автор SparkFlow.