Мы рады объявить о нашем новом проекте Mars, который представляет собой универсальную платформу распределенных вычислений на основе матриц. Открытый исходный код Mars уже доступен на GitHub: https://github.com/mars-project/mars.

Задний план

Python

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

Hadoop, Spark и Java по-прежнему доминируют в области больших данных. Однако на веб-сайте Spark также есть большое количество пользователей PySpark.

В области глубокого обучения большинство библиотек (TensorFlow, PyTorch, MXNet и Chainer) поддерживают Python, который является наиболее широко используемым языком для этих библиотек.

Пользователи Python также считаются важной группой в MaxCompute.

PyData (NumPy, SciPy, Pandas, scikit-learn, matplotlib и scikit-learn)

Для Python доступны различные пакеты в области науки о данных. На следующем рисунке показан весь стек технологий науки о данных Python.

Как мы видим, NumPy является основой, а поверх NumPy находятся такие библиотеки, как SciPy для науки и техники, Pandas для анализа данных, библиотека машинного обучения scikit-learn и matplotlib для визуализации данных.

В NumPy наиболее важной базовой концепцией является ndarray (многомерные массивы). Все библиотеки, такие как Pandas и scikit-learn, построены на основе этой структуры данных.

Проблемы с существующими вычислительными механизмами

Популярность Python в вышеупомянутых областях продолжает расти, а стек технологий PyData предоставляет специалистам по данным вычисления и анализ многомерных матриц в DataFrame, а также алгоритмы машинного обучения на основе двумерных матриц. Однако все эти библиотеки для Python ограничены вычислениями на одной машине. В эпоху больших данных эти библиотеки не могут удовлетворить требования к вычислительной мощности в сценариях с очень большими объемами данных.

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

С другой стороны, хотя ndarray / tensor также является самой базовой структурой данных в области глубокого обучения, они ограничены глубоким обучением и не подходят для крупномасштабных операций с многомерными матрицами.

Исходя из этих соображений, мы разработали Mars, универсальную платформу распределенных вычислений на основе тензоров. На начальном этапе мы сосредоточились на том, как сделать лучший тензорный слой.

Детальный анализ Марса

Ядро Марса реализовано на Python. Это позволяет нам использовать существующие достижения сообщества Python. Мы можем полностью использовать библиотеки, такие как NumPy, CuPy и Pandas, в качестве наших небольших вычислительных единиц, чтобы мы могли быстро и стабильно построить всю нашу систему. Кроме того, сам Python обеспечивает легкое наследование C / C ++, и нам не нужно беспокоиться о производительности самого языка Python, потому что мы можем переписать модули оценки производительности на C / Cython.

Следующий раздел посвящен тензору Марса, то есть операциям с многомерными матрицами.

Numpy API

Одна из причин успеха NumPy - его простой и легкий в использовании API. API можно напрямую использовать в качестве нашего интерфейса в тензоре Марса. На основе NumPy API пользователи могут гибко писать код для обработки данных и даже реализовывать различные алгоритмы.

Два следующих абзаца кода реализуют функцию с использованием NumPy и тензора Марса соответственно.

import numpy as np
a = np.random.rand(1000, 2000)
(a + 1).sum(axis=1)
import mars.tensor as mt
a = mt.random.rand(1000, 2000)
(a + 1).sum(axis=1).execute()

В предыдущем примере создается матрица случайных чисел размером 1000x2000, добавляется 1 к каждому элементу и выполняется операция суммирования для оси = 1 (строка).

Марс реализовал около 70% распространенных интерфейсов NumPy.

Мы видим, что заменена только строка «импорт». Пользователям нужно только вызвать «выполнить», чтобы явно запустить вычисление. Преимущество использования «выполнения» для явного запуска вычислений состоит в том, что мы можем иметь больше оптимизаций промежуточного процесса для эффективного выполнения вычислений.

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

Используйте GPU для вычислений

Тензор Марса также поддерживает вычисления на GPU. Для интерфейсов, созданных в матрице, доступна опция gpu=True, позволяющая указать назначение графическому процессору. Последующие вычисления с этой матрицей будут выполняться на графическом процессоре.

import mars.tensor as mt
a = mt.random.rand(1000, 2000, gpu=True)
(a + 1).sum(axis=1).execute()

В предыдущем примере a назначается графическому процессору, поэтому последующие вычисления будут выполняться на графическом процессоре.

Разреженная матрица

Тензор Марса поддерживает создание разреженных матриц (в настоящее время поддерживаются только двумерные матрицы). Например, чтобы создать разреженную единичную матрицу, просто укажите sparse=True.

import mars.tensor as mt
a = mt.eye(1000, sparse=True, gpu=True)
b = (a + 1).sum(axis=1)

В предыдущем примере показано, что параметры GPU и Sparse можно указать одновременно.

Надстройки на основе тензора Марса

Надстройки на Марсе не реализованы. В этом разделе описаны компоненты, которые мы стремимся построить на Марсе.

DataFrame

Некоторые из вас могут знать библиотеку PyODPS DataFrame, которая является одним из наших предыдущих проектов. PyODPS DataFrame позволяет пользователям писать синтаксис, аналогичный синтаксису Pandas, и выполнять вычисления в ODPS. Однако из-за ограничений самого ODPS PyODPS DataFrame не может реализовать все функции Pandas (например, индексировать) и имеет другой синтаксис.

На основе тензора Марса мы предоставляем DataFrame, который на 100% совместим с синтаксисом Pandas. С Mars DataFrame пользователи не ограничены памятью одной машины. Это одна из наших основных задач в следующей версии.

Машинное обучение

Некоторые алгоритмы scikit-learn вводятся в виде двумерных массивов NumPy. Мы также предоставим алгоритмы распределенного машинного обучения. Для этого доступны три метода:

  1. Вызов алгоритмов scikit-learn непосредственно для каждого воркера, потому что некоторые алгоритмы scikit-learn поддерживают partial_fit.
  2. Предоставлять серверные части Joblib на Марсе. Поскольку scikit-learn использует Joblib для распараллеливания, мы можем реализовать бэкенды Joblib для запуска алгоритмов scikit-learn непосредственно в распределенной среде Mars. Однако этот метод по-прежнему требует ввода NumPy ndarrays. Таким образом, общий ввод данных по-прежнему ограничен памятью.
  3. Реализуйте алгоритмы машинного обучения на основе тензора Марса. Несмотря на самую высокую требуемую рабочую нагрузку, этот метод позволяет этим алгоритмам использовать возможности тензора Марса, например, вычисления на графическом процессоре. В будущем нам понадобится больше вас, чтобы вместе внести свой код и построить экологию Марса.

Детальные функции и классы

Ядро Марса - это механизм детального планирования, основанный на акторах. Таким образом, пользователи могут написать несколько параллельных функций и классов Python для реализации детализированного управления. Мы можем предоставить следующие типы интерфейсов.

Функция

Пользователи пишут общие функции Python и функции расписания by using mars.remote.spawn, чтобы заставить их работать на Марсе распределенным образом.

import mars.remote as mr
def add(x, y):
    return x + y
data = [
   (1, 2),
   (3, 4)
]
for item in data:
    mr.spawn(add, item[0], item[1])

mr.spawn позволяет пользователям легко создавать распределенные программы. Пользователи также могут использовать mr.spawn в функциях для написания очень детализированных распределенных исполнителей.

Класс

Иногда пользователям нужны классы с отслеживанием состояния для выполнения таких действий, как обновление статуса. Эти классы на Марсе называются RemoteClasses.

import mars.remote as mr
class Counter(mr.RemoteClass):
    def __init__(self):
        self.value = 0
    def inc(self, n=1):
        self.value += n
counter = mr.spawn(Counter)
counter.inc()

В настоящее время эти функции и классы не реализованы и находятся в стадии разработки. Таким образом, предыдущие интерфейсы могут быть изменены.

Внутренняя реализация

В этом разделе мы кратко покажем внутренние принципы тензора Марса.

Клиент

Фактические вычисления на клиенте не выполняются. Когда пользователь пишет код, мы записываем в память только операции этого пользователя с помощью графиков.

Тензор Марса имеет два важных понятия: операнды и тензоры (обозначены синими кружками и розовыми кубиками соответственно на следующей диаграмме). Операнд представляет оператор, а тензор представляет сгенерированный многомерный массив.

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

Когда этот пользователь явно вызывает "execute", мы отправляем граф в распределенную среду выполнения на Марсе.

Наш клиент не зависит от языков и требует только ту же сериализацию тензорного графа. Поэтому поддерживается реализация на любом языке. В зависимости от потребностей пользователей мы определим, собираемся ли мы предоставить тензор Марса для Java в следующей версии.

Распределенная среда выполнения

По сути, Mars - это система выполнения и планирования для мелкозернистых графиков.

Тензор Марса получает графики уровня тензора (крупнозернистые графики) и пытается преобразовать их в графики на уровне блоков (мелкозернистые графики). Во время процесса выполнения память должна иметь возможность хранить каждый фрагмент и его ввод. Мы называем этот процесс плиткой.

Когда получен детализированный график на уровне фрагментов, операнды на этом графике будут назначены отдельным исполнителям для выполнения.

Резюме

Марс был впервые выпущен в сентябре 2018 года и теперь имеет полностью открытый исходный код. В настоящее время открытый исходный код доступен на GitHub: https://github.com/mars-project/mars. Мы не просто публикуем свои коды; наш проект работает полностью с открытым исходным кодом.

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

Ссылка: https://www.alibabacloud.com/blog/mars-matrix-based-universal-distributed-computing-framework_594606?spm=a2c41.12696548.0.0