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- счет-мит-математика-профессор-бьет рекорды-рекорд-самая большая-когда-либо-работа-вычислительная машина
Если вы интересуетесь машинным обучением и любите решать сложные задачи, приходите пообщаться с командой Моментон.