свп производительность pyspark vs scipy - PullRequest
0 голосов
/ 06 ноября 2019

Вычисление SVD с использованием pyspark:

rdd = MLUtils.convertVectorColumnsFromML(df.select("ID", "TF_IDF")).rdd
index_mat = IndexedRowMatrix(rdd)

print('index_mat rows = {}'.format(index_mat.numRows()))
print('index_mat columns = {}'.format(index_mat.numCols()))

svd = index_mat.computeSVD(k=100, computeU=True)

Вывод:

index_mat строки = 2000

index_mat столбцы = 6000

spark df имеет 100 разделов, и я выполняю эту работу с 20 исполнителями.

Это занимает больше часа. Пока подобный код с использованием scipy выполняется за 1 минуту.

from scipy.sparse.linalg import svds

u, s, vt = svds(tfidf_sparse, k=100)

1 Ответ

2 голосов
/ 11 ноября 2019

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

Вот неполный список возможных других причин, по которым искра медленнее, чем scipy:

  1. Сначала из-за времени сетевого взаимодействия:

    Для небольших наборов данных, которые помещаются в память одного компьютера, такие инструменты, как pandas, numpy и scipy, использующие один узел, будут тратить меньше времени на перемещение данныхвокруг и сосредоточиться на фактических вычислениях. В то время как 20 исполнителей, которые вы используете в spark, должны будут тратить больше времени на перемещение данных по сети. Таким образом, для распределенной системы другие факторы, такие как скорость сети, полоса пропускания и уровень перегрузки, могут влиять на производительность.

  2. Установка scipy с оптимальными настройками проще, чем установка spark с оптимальными настройками:

    Проще установить / настроить Scipy с BLAS: набор ускоренных процедур линейной алгебры, по сравнению с установкой тех же зависимостей для искры. Например, если вы используете Scipy через conda (из дистрибутива anaconda ), он уже поставляется с хорошо настроенными зависимостями blas. Принимая во внимание, что Spark по умолчанию использует реализацию Java линейных операций алгебры и просит вас настроить blas самостоятельно (для каждого исполнителя), чтобы получить лучшую производительность (для получения дополнительной информации проверьте зависимости mllib ). Скорее всего, в вашей системе не установлены зависимости BLAS.

  3. Вы используете старую библиотеку машинного обучения на основе RDD: API mllib.

    Вы должны использовать более новую версию ML API. Несколько потоков переполнения стека объясняют, почему вы должны перейти на более новый API. Вы можете проверить это, чтобы получить общее представление: В чем разница между пакетами Spark ML и MLLIB

    В общем, вы должны использовать API из pyspark.ml вместо pypsark.mllib (org.apache.spark.ml вместо org.apache.spark.mllib, если вы используете scala). Поэтому попробуйте переписать свой код с помощью ml API и повторить тест снова.

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

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

...