Github Ссылка на проект

Как специалист по анализу данных, вы наверняка сталкивались с дискуссиями о кулерах, в которых отбрасывались слова «Apache Spark», за которыми обычно следовали другие, такие как «вычислительные кластеры», «JVM»… а иногда «вы пытались перезапустить ядро ​​снова? '. Вы знаете, это просто стандартный отраслевой жаргон. В идеале у вас может быть хотя бы представление о том, что Spark как-то связан с масштабированием ваших проектов в области науки о данных. Или вы можете знать, какую огромную мощь обладает SystemML, благодаря собственному опыту управления огромным потоком данных и получению на их основе каких-либо практических идей. Итак, приступим прямо к делу!

Кластерные вычисления на Apache Spark

В большинстве реальных возможных сценариев машинного обучения сами данные генерируются в реальном времени с датчиков Интернета вещей или мультимедийных платформ и хранятся в соответствующем формате с использованием облачных решений, начиная с HDFS, ObjectStore, NoSQL или баз данных SQL. Во многих случаях запуск рабочего процесса аналитики на ограниченных ресурсах, предоставляемых локальным узлом (на котором ваша виртуальная машина Java запускает записную книжку iPython), вероятно, не поможет. Быстрый, надежный и надежный рабочий процесс машинного обучения может использовать преимущества больших вычислительных кластеров без трудоемкого редактирования кода и адаптации его для параллельной обработки. Как спросите вы? Что ж, это секретный соус знаменитой Распределенной файловой системы Hadoop, которая позволяет вам получить объединенную емкость всех дисков как одну большую виртуальную файловую систему.

По сути, HDFS делит ваши данные на куски равного размера и распределяет их по физическим дискам, создавая виртуальное представление поверх этих кусков, чтобы его можно было рассматривать как один большой файл, охватывающий весь кластер. Основное преимущество технологии проистекает из концепции локальности данных. Поскольку HDFS отслеживает местонахождение отдельных фрагментов файла, вычисления могут выполняться параллельно с использованием ЦП или ГП, находящихся на одном физическом рабочем узле. Некоторые из вас могут прямо спросить: Зачем это нужно?. Что ж, простой ответ на этот вопрос можно продемонстрировать с помощью небольшой популярной викторины:

У вас есть хороший вычислительный кластер, содержащий 256 узлов, 8 ЦП на узел, 16 ядер ЦП на ЦП и 4 гиперпотока на ядро. Каково максимально возможное количество одновременно работающих параллельных потоков?

Ответ на это, конечно, ‹вставьте барабанную дробь сюда›: 131 072 одновременно запускает параллельные потоки, каждый из которых выполняет часть вашей работы. ! (= 256 узлов * 8 ЦП на узел * 16 ядер ЦП на ЦП * 4 гиперпотока на ядро). Таким образом, Apache Spark предоставляет распределенную универсальную платформу кластерных вычислений с открытым исходным кодом, которая позволяет управлять данными и выполнять вычисления параллельно.

Устойчивый, всегда

Первичная абстракция данных в ApacheSpark - это почтенный Устойчивый Распределенный набор данных (RDD). Это распределенная неизменяемая коллекция или список данных, которые могут быть записаны со строковыми или двойными значениями и могут быть созданы с использованием различных решений для хранения данных, от баз данных MongoDB с открытым исходным кодом до более эксклюзивных решений SQL и NoSQL. Вы даже можете создавать RDD из своей локальной файловой системы. После создания RDD располагается распределенным в основной памяти различных рабочих узлов. Наконец, вы обнаружите, что RDD довольно ленивы. Это означает, что ваши данные считываются из базовой системы хранения только в том случае, если они действительно необходимы для выполнения определенных вычислений. По умолчанию любые преобразования, которые вы применяете к фрейму данных (например, удаление переменных или нормализация ваших функций), не выполняются мгновенно. Вместо этого ваш выбор запоминается и вычисляется только тогда, когда действие требует возврата результата в программу драйвера. Оказывается, это совсем неплохая идея и позволяет сэкономить довольно много вычислительной мощности. для настоящих тяжеловесов впереди.

Три потрясающие функции Apache Spark, которые делают его мощным инструментом для анализа данных и машинного обучения:

1. Получение структурированных данных: Spark SQL

Бесчисленные специалисты по данным, аналитики и обычные пользователи бизнес-аналитики полагаются на интерактивные запросы SQL для исследования данных. К счастью, Spark хорошо об этом знает и поставляется с модулем Spark для структурированной обработки данных, который называется Spark SQL. Он обеспечивает ту абстракцию программирования, которой мы все так дорожим, - DataFrames. Spark SQL также может выступать в качестве механизма распределенных запросов SQL и позволяет немодифицированным запросам Hadoop Hive работать до 100 раз быстрее в существующих развертываниях и данных. Он также обеспечивает мощную интеграцию с остальной частью экосистемы Spark (например, интеграцию обработки SQL-запросов с машинным обучением).

2. Машинное обучение: MLlib

Машинное обучение быстро превратилось в критически важный элемент в изучении больших данных для получения практических идей. MLlib - это масштабируемая библиотека машинного обучения, созданная на основе Spark, которая обеспечивает как высококачественные алгоритмы, так и молниеносную скорость, если они говорят сделай сам (до 100 раз быстрее, чем MapReduce). Библиотеку можно использовать в Java, Scala и Python как часть приложений Spark, так что вы можете включать ее в полные рабочие процессы.

Самое замечательное в этом то, что Apache SystemML обеспечивает оптимальное рабочее место для машинного обучения с использованием данных от больших до огромных, поскольку он не только предоставляет средства для использования широко настраиваемых алгоритмов, но также позволяет использовать некоторые отличные предварительно реализованные алгоритмы (например, Деревья с усиленным градиентом, K-Nearest Neighbours, и это лишь некоторые из них). Более того, он взаимодействует с множеством известных фреймворков глубокого обучения, таких как Keras и Caffe, как мы увидим позже.

3. Потоковая аналитика: потоковая передача Spark

Наконец, многие приложения в наши дни нуждаются в возможности обрабатывать и анализировать не только пакетные данные, но и потоки новых данных в режиме реального времени. Spark Streaming, работающий поверх Spark, позволяет создавать мощные интерактивные и аналитические приложения как для потоковых, так и для исторических данных, наследуя при этом простоту использования и характеристики отказоустойчивости Spark. Он легко интегрируется с широким спектром популярных источников данных, включая HDFS, Flume, Kafka и Twitter.

Некоторые могут заявить, что указание здесь только трех функций не оправдывает ожиданий Apache Spark. Функциональные возможности, такие как вольфрамовый ускоритель и дерево выполнения синтаксиса, также весьма примечательны и в равной степени приносят пользу современным специалистам по данным. Я, конечно, мог бы подробно рассказать вам об Apache Spark, распределенной файловой системе Hadoop и библиотеке mllib. Отправьтесь в путешествие как бы «под капотом». Но, пожалуй, следующая статья. Для целей этой статьи нам достаточно понять, что SystemML Apache Spark может работать во встраиваемом, автономном и в кластерном режиме, поддерживает различные API-интерфейсы на Scala, Python и Java и идеально подходит для масштабирования моделей глубокого обучения. Как спросите вы?

Масштабирование машинного обучения с помощью SystemML

Откройте для себя SystemML, одно из семи чудес мира больших данных. Эта гибкая система машинного обучения способна автоматически масштабироваться до кластеров Spark и Hadoop. Фактически, в зависимости от размера данных, разреженности, размера вычислительного кластера, а также конфигурации памяти вашего локального компьютера, SystemML решит, компилировать ли план с одним узлом, план Hadoop или Spark. Он поставляется с R-подобным функциональным языком программирования под названием Declarative Machine Learning, который позволяет вам реализовать предпочтительный алгоритм машинного обучения или, что еще лучше, разработать собственный с нуля. Говорят, что SystemML имеет недорогой компилятор, который автоматически генерирует гибридные планы выполнения во время выполнения, которые состоят из одного узла и распределенных операций. Его можно запустить поверх Apache Spark, где он автоматически масштабирует ваши данные построчно, определяя, должен ли ваш код запускаться в драйвере или в кластере Apache Spark.

Реализация модели глубокого обучения в SystemML

Есть три разных способа реализовать модель глубокого обучения в SystemML:

  1. Использование библиотеки NN на основе DML: Эта библиотека позволяет пользователю использовать полную гибкость языка DML для реализации вашей нейронной сети.
  2. Использование экспериментального Caffe2DML API: этот API позволяет импортировать модель, выраженную в прото-формате Caffe, в SystemML. Этот API не требует установки Caffe на вашем SystemML.
  3. ** Использование экспериментального Keras2DML API: этот API позволяет импортировать модель, выраженную в API Keras, в SystemML. Однако этот API требует, чтобы в вашем драйвере был установлен Keras. **

Разработки SystemML включают дополнительное глубокое обучение с возможностями графического процессора, такими как импорт и запуск архитектур нейронных сетей и предварительно обученные модели для обучения. В следующей части этой статьи будет показано, как сериализовать и обучить модель Keras с помощью MLContext API. Я также рекомендую вам ознакомиться с некоторыми подробными учебниками, опубликованными Apache Spark, о том, как начать работу с DML, распараллелить алгоритмы, такие как автоэнкодеры, и попробовать старую добрую классификацию изображений.

Apache Spark в IBM Watson Studio

Теперь мы, наконец, обучим нашу модель Keras с помощью экспериментального Keras2DML API. Чтобы иметь возможность выполнить следующий код, вам необходимо создать учетную запись бесплатного уровня в облачной учетной записи IBM и войти в систему, чтобы активировать студию Watson.

(пошаговая настройка Spark в облаке IBM здесь, дополнительная информация о искре с облаком IBM).

Если у вас есть учетная запись студии Watson с активным планом Spark, вы можете создать блокнот Jupyter на платформе, выбрать конфигурацию облачной машины (количество процессоров и ОЗУ) и план Spark и приступить к работе!

Студия Watson поставляется с бесплатным тарифным планом Spark, включая 2 рабочих Spark. Хотя этого достаточно для демонстрационных целей, таких как сейчас, для реальных сценариев настоятельно рекомендуется получить платный план Spark. Больше рабочих Spark в основном означает больше потоков, с которыми вычисления могут быть параллельны, а значит, меньше зомби-ожидания результатов перед экраном. Наконец, прежде чем мы начнем, я также отмечу, что другие альтернативы, такие как Deep Cognition, с не менее интересными функциями и иллюстративными средними статьями, существуют и заслуживают изучения.

Распознавание рукописных цифр в SystemML

Ах, MNIST. Настолько знаковый, что его можно считать привет миром наборов данных машинного обучения. Фактически, это даже один из шести стандартных наборов данных, который поставляется с установкой Keras. И будьте уверены, любой алгоритм, который вы имеете в виду, от линейных классификаторов до сверточных нейронных сетей, был опробован и протестирован на этом наборе данных где-то в последние 20 лет. Все для распознавания рукописных цифр. То, что мы, люди, сами делаем с такой легкостью (настолько, что делать это как работу, безусловно, очень удручающе).

Фактически, эта задача была идеальным кандидатом для довольно большого количества проектов генезиса машинного обучения из-за отсутствия достаточно больших наборов данных, которые существовали в то время для… ну, на самом деле, чего угодно. Хотя это уже не так, и Интернет наводнен наборами данных от цен на авокадо до вулканов на Венере. Сегодня мы соблюдаем традицию MNIST, расширяя масштаб нашего проекта распознавания рукописных цифр. Мы делаем это, обучая наш алгоритм машинного обучения на вычислительном кластере, и потенциально значительно сокращаем время обучения при этом.

1. Начнем с импорта некоторых библиотек:

import keras
from keras.models import Sequential
from keras.layers import Input, Dense, Conv2D
from keras.layers import MaxPooling2D, Dropout,Flatten
from keras import backend as K
from keras.models import Model
import numpy as np
import matplotlib.pyplot as plt

2. Загрузите данные

Теперь мы можем загрузить набор данных MNIST из Keras, используя эту простую строку кода ниже.

from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# Expect to see a numpy n-dimentional array of (60000, 28, 28)
type(X_train), X_train.shape, type(X_train)

3. Формируйте свои данные

Здесь мы делаем некоторые изменения, наиболее подходящие для нашей нейронной сети. Мы преобразовываем каждое изображение размером 28 х 28 в один вектор из 784 пикселей.

#Flatten each of our 28 X 28 images to a vector of 1, 784
X_train = X_train.reshape(-1, 784)
X_test = X_test.reshape(-1, 784)
#Check shape
X_train.shape, X_test.shape

4. Нормализуйте свои данные.

Затем мы используем MinMaxScaler Scikit-Learn для нормализации наших пиксельных данных, которые обычно находятся в диапазоне 0–255. После нормализации значения будут находиться в диапазоне от 0 до 1, что значительно улучшает результаты.

from sklearn.preprocessing import MinMaxScaler
def scaleData(data):       
    scaler = MinMaxScaler(feature_range=(0, 1))
    return scaler.fit_transform(data) 
X_train = scaleData(X_train)
X_test = scaleData(X_test)

5. Постройте сеть.

Затем мы строим нашу сеть с помощью Keras, определяя соответствующую форму ввода, затем складываем несколько слоев Сверточный, Максимальный пул, Плотный и выпадающий, как показано ниже. (Некоторые основы нейронной сети: убедитесь, что ваш последний слой имеет такое же количество нейронов, что и ваши выходные классы. Поскольку мы прогнозируем рукописные цифры в диапазоне от 0 до 9, у нас есть плотный слой из 10 нейронов в качестве последнего слоя. .)

input_shape = (1,28,28) if K.image_data_format() == 'channels_first' else (28,28, 1)
keras_model = Sequential()
keras_model.add(Conv2D(32, kernel_size=(5, 5), activation='relu', input_shape=input_shape, padding='same'))
keras_model.add(MaxPooling2D(pool_size=(2, 2)))
keras_model.add(Conv2D(64, (5, 5), activation='relu', padding='same'))
keras_model.add(MaxPooling2D(pool_size=(2, 2)))
keras_model.add(Flatten())
keras_model.add(Dense(512, activation='relu'))
keras_model.add(Dropout(0.5))
keras_model.add(Dense(10, activation='softmax'))
keras_model.summary()

Если вы видите это резюме модели Keras ниже, у вас пока все хорошо.

5. Создайте модель SystemML.

Используйте оболочку Keras2DML и загрузите ее в нашу недавно построенную сеть Keras. Это делается путем вызова метода Keras2DML и передачи ему сеанса искры, модели Keras, ее формы ввода и предопределенных переменных. Переменная «эпоха» обозначает, сколько раз ваш алгоритм перебирает данные. Затем у нас есть «batch_size», который указывает количество обучающих примеров, которые наша сеть будет видеть за один обучающий пакет. Наконец, «samples» просто кодирует количество образцов в нашем обучающем наборе. Также просим отображать результаты обучения каждые 10 итераций.

Затем мы используем параметр fit в нашей недавно определенной модели SystemML и передаем ей обучающие массивы и метки, чтобы начать сеанс обучения.

from systemml.mllearn import Keras2DML
epochs = 5
batch_size = 100
samples = 60000
max_iter = int(epochs*math.ceil(samples/batch_size))
sysml_model = Keras2DML(spark, keras_model, input_shape=(1,28,28), weights='weights_dir', batch_size=batch_size, max_iter=max_iter, test_interval=0, display=10)

sysml_model.fit(X_train, y_train)

Теперь вы должны увидеть что-то вроде этого на экране:

6. Время забивать! Мы делаем это, просто вызывая параметр score в нашей обученной модели SystemML, например:

sysml_model.score(X_test, y_test)

Подождите, пока запустится искровое задание, а затем - вуаля! вы должны увидеть свою точность на тестовом наборе. Как вы можете видеть ниже, мы достигли значения 98,76, что не так уж и плохо.

Обратите внимание, что мы смогли развернуть модель Keras через оболочку SystemML Keras2DML, которая по существу сериализует вашу модель в модель Caffe, а затем преобразует эту модель в декларативный скрипт машинного обучения. В противном случае та же модель Keras была бы связана с ресурсами одной JVM, если бы вы выбрали обучение ее с помощью Keras, без значительной адаптации вашего кода для параллельной обработки. Аккуратно, не так ли? Теперь вы можете обучать свои нейронные сети на локальных графических процессорах или использовать облачную машину, как мы это делали в студии Watson.

Хотя всегда приятно иметь некоторую локальную огневую мощь с точки зрения обработки, ничто не сравнится с облаком. Вы действительно можете масштабировать свои проекты и выбирать подходящие конфигурации машины и планы зажигания за небольшую часть стоимости альтернативного оборудования. Это идеально подходит для работы с различными средами и вариантами использования, которые сильно различаются по требованиям, от визуализации данных небольшого масштаба до проектов больших данных, требующих анализа петабайт данных в реальном времени. Возможно, вы просто пытаетесь проанализировать большой объем данных IoT из вашей распределенной складской сети, например Wallmart. Или, может быть, вы заглянули в субатомные глубины, пытаясь определить ткань нашего космоса, как ЦЕРН. В любом из этих широко варьирующихся вариантов использования можно было бы извлечь выгоду из переноса своих вычислений в облако, и, скорее всего, так оно и было.

Спасибо за уделенное время

Надеюсь, что эта статья оказалась для вас информативной и интересной. Мне, со своей стороны, действительно понравилось исследовать содержание этого поста и составлять соответствующий код. Вот ссылка на мой репозиторий с полным кодом, а также версия скрипта без использования SystemML. Если у вас есть какие-либо вопросы или отзывы, касающиеся охваченного контента или предоставленного исходного кода, сообщите мне об этом в комментариях. До скорого!

использованная литература

1. Начало работы со Spark: https://databricks.com/product/getting-started-guide-2

2. Веб-страница SystemML: http://systemml.apache.org/

3. Руководство по контекстному программированию Spark ML: https://systemml.apache.org/docs/0.15.0/spark-mlcontext-programming-guide

4. Руководство по Keras2DML: https://systemml.apache.org/docs/1.0.0/beginners-guide-keras2dml

5. Керас: https://keras.io/

6. Репозиторий Github для кода: https://gist.github.com/NiloyPurkait/1c6c44f329f2255f5de2b0d498c3f238