Какая абстракция pyspark подходит для моего большого умножения матриц? - PullRequest
1 голос
/ 24 мая 2019

Я хочу выполнить большое матричное умножение C = A * BT и затем отфильтровать C, применяя строгий порог, собирая список формы (индекс строки, индекс столбца, значение).

A и B являются разреженными, с в основном нулевыми записями.Первоначально они представлены в виде разреженных матриц csr scipy.

Размеры матриц (в плотном формате):
A: 9G (900 000 x 1200)
B: 6,75G (700 000 x1200)
C, до порога: 5000G
C, после порога: 0,5G

Какая стратегия, по вашему мнению, будет наиболее эффективной здесь при использовании pyspark?Какую абстракцию я должен использовать для распараллеливания A и B?О чем еще мне следует подумать, чтобы оптимизировать размеры разделов?


Стоит ли мне придерживаться своих скудных объектов с разреженными матрицами и просто распараллеливать их в RDD (возможно, с некоторой настраиваемой сериализацией)?

Должен ли я хранить ненулевые записи моих матриц A и B, используя DataFrame, а затем преобразовывать их в локальные типы матриц pyspark, когда они находятся на исполнителях?

Должен ли я использовать абстракцию DistributedMatrix изMLlib?Для этой стратегии, я думаю, я сначала преобразовал бы свои scipy csr матрицы в формат coo, затем создал pyspark CoordinateMatrix, а затем преобразовал в

  1. BlockMatrix?Плотное представление, но допускает умножение матриц с другими распределенными BlockMatrix.
  2. IndexedRowMatrix?Разреженное представление, но допускает только умножение матриц на локальную матрицу (например, широковещательную рассылку SparseMatrix?)

* РЕДАКТИРОВАНИЕ При просмотре документов было также приятно обнаружить функцию IndexedRowMatrix columnShorsities (), которая может быть хорошейвариант, когда целью является вычисление косинусного сходства.


Сейчас я ищу локальное решение.У меня есть две машины для прототипирования: 16 ГБ ОЗУ, 10 ЦП или 64 ГБ ОЗУ, 28 ЦП.Планирую запустить это на кластере, как только у меня будет хороший прототип.

...