DataProc - это управляемая служба Apache Hadoop Google Cloud. Это быстрый, простой и относительно недорогой способ создания кластеров Hadoop от нескольких экземпляров до сотен тысяч. Хотя Hadoop превосходно справляется с обработкой больших данных, мы рассмотрим его способность выполнять вычисления для класса вычислений с высокой пропускной способностью и высокой задержкой. Это открывает возможность проводить численные эксперименты в масштабе, который ранее был бы трудным или ограничивался бы областью суперкомпьютеров.

Недавно Эндрю Сазерленд из Массачусетского технологического института использовал облачную платформу Google для« исследования обобщений гипотезы Сато-Тейта и гипотезы Берча и Суиннертона-Дайера на кривые более высокого рода» [1]. Он использовал 580 000 ядер и побил рекорд по объему работы Compute Engine. Хотя он не использовал DataProc, он демонстрирует способность облачной платформы Google выполнять высокопроизводительные вычисления.

Будущее облачных вычислений будет включать в себя специализированные услуги высокопроизводительных вычислений (HPC). Alibaba уже нацелена на это пространство, предлагая E-HPC, свою облачную платформу HPCaaS, предоставляющую универсальный высокопроизводительный сервис общедоступных вычислений.

Выборка Монте-Карло

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

Для метода Монте-Карло мы генерируем случайную выборку из равномерно распределенных точек x₁, x₂…. в Ω и аппроксимируем интеграл выражением

где V - объем области Ω.

По закону больших чисел предел приближения существует, а по центральной предельной теореме он будет сходиться с N ^ -½. Несмотря на то, что скорость сходимости низкая, она не зависит от количества измерений. Это важное отличие от детерминированных методов, которые зависят от размера измерения и страдают от проклятия размерности для больших измерений.

В частности, мы вычислим значение интеграла с помощью:

Этот интеграл дает нам объем единичной сферы в первом квадранте с центром в начале координат, значение которого равно π / 6 или приблизительно 0,523598.

DataProc

Использовать DataProc просто; подготовьте кластер, а затем выполните на нем код. Код можно запустить через интерактивную оболочку или отправить как задание. Мы запустим задание в нашем кластере Dataproc, используя gcloud dataproc job submit команду Cloud SDK.

Чтобы создать кластер, обратитесь к документации Google. Есть один важный флаг --num-preemptible-workers, который указывает количество вытесняемых рабочих процессов в кластерах. Вытесняемые экземпляры - это недолговечные экземпляры с максимальным сроком службы 24 часа, которые можно вернуть в Google в любое время. Преимущество вытесняемых рабочих состоит в том, что они значительно дешевле, примерно на 80% от стоимости обычного рабочего. Нас не волнует, будут ли наши экземпляры уничтожены, поскольку мы выполняем случайное моделирование.

Для нашего численного эксперимента мы создадим кластер с 10 000 рабочих. Создание кластера с 10 000 рабочих займет всего несколько минут.

Следующий код будет использоваться для создания нашего приближения:

#!/usr/bin/python
import pyspark
import random
import time
from operator import add

def integrand(x):
    return  1 if sum([i*i for i in x]) <=1 else 0

def sampler(seed):
    random.seed(seed)
    x = [random.random(), random.random(), random.random()]
    return  integrand(x)

sampleSize = 1000000*10000
sc = pyspark.SparkContext()

print sc.parallelize([time.time() + i for i in xrange(sampleSize)])\
     .map(sampler).reduce(add)/sampleSize

Операция parallelize создает устойчивый распределенный набор данных (RDD), оптимизированный для параллельной обработки. В этом случае RDD содержит начальные числа, основанные на текущем системном времени. При создании RDD Spark разделяет данные в зависимости от количества рабочих и ядер.

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

gcloud dataproc jobs submit pyspark \
    --cluster <cluster-name> --region <region> \
    gs://<bucket-name>/integrate.py

где ‹cluster-name›, ‹region› и ‹bucket-name› - заполнители для соответствующих значений.

После того, как мы запустим задание, через несколько секунд мы получим в выводе терминала следующее:

Waiting for job output... 
…
0.523597843
…
Job finished successfully.

Мы успешно вычислили приблизительное значение интеграла π / 6 с точностью до шести знаков после запятой.

Заключение

Мы представили довольно наивный пример, но он показывает возможности DataProc для массового масштабирования вычислений для десятков тысяч рабочих с минимальными усилиями. С таким же успехом мы могли бы использовать сто тысяч или двести тысяч узлов. Хотя не все алгоритмы подходят для этого подхода, он хорошо работает с вычислениями с высокой пропускной способностью, которым не требуется низкая задержка между узлами.

Возможность без особых усилий выделять ресурсы в любом масштабе изменит высокопроизводительные вычисления: «Это меняет все ваше мировоззрение… когда вы можете задать вопрос и получить ответ за часы, а не за месяцы… Вы задаете разные вопросы» [1].

[1]: 220 000 ядер, и их количество растет: профессор математики Массачусетского технологического института побил рекорд по крупнейшей в истории работе Compute Engine https://cloud.google.com/blog/products/gcp/220000-cores-and- счет-мит-математика-профессор-бьет рекорды-рекорд-самая большая-когда-либо-работа-вычислительная машина

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