Умножение крупномасштабных матриц с использованием Numpy

Я столкнулся с проблемой, когда мне нужно выполнить матричное умножение между двумя большими матрицами A [400000 x 70000] и B [70000 x 1000]. Две матрицы плотные и не имеют специальной структуры, которую я мог бы использовать.

В настоящее время моя реализация состоит в том, чтобы разделить A на несколько блоков строк, скажем, sub_A [2000 x 70000] и perfrom sub_A * B. Заметил, что много времени тратится на ввод / вывод, т.е. чтение в sub_A. Считывание в матрице занимает около 500 секунд, а вычисление - около 300 секунд.

Будет ли здесь полезно использовать PyTables для повышения эффективности ввода-вывода? Есть ли какая-нибудь библиотека, которая поможет повысить эффективность использования времени?

Вот код:

def sim_phe_g(geno, betas, chunk_size):
    num_indv = geno.row_count
    num_snps = geno.col_count
    num_settings = betas.shape[1]

    phe_g = np.zeros([num_indv, num_settings])
    # divide individuals into chunks
    for i in range(0, num_indv, chunk_size):
        sub_geno = geno[i : i + chunk_size, :]
        sub_geno = sub_geno.read().val
        phe_g[i : i + chunk_size, :] = np.dot(sub_geno, betas)
    return phe_g

geno имеет размер [400000 x 70000], а betas - размер [70000 x 1000]. geno - это большая матрица, которая хранится на диске. Оператор sub_geno = sub_geno.read().val загружает в память фрагмент генотипа. И на это заявление уходит много времени.

Кроме того, я делю большую матрицу на куски из-за ограничения объема памяти 32 ГБ.

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

Daniel 22.07.2018 20:56

@Daniel Я приложил свой текущий код.

david 22.07.2018 22:00

Предполагая, что у вас есть для этого память, вы можете переместить geno на RAM-диск. Это должно значительно сократить время ввода-вывода вычислений.

Mr. Llama 22.07.2018 22:06

Почему бы не разделить матрицы на подматрицы (вместо строк), чтобы увеличить коэффициент повторного использования всех данных, чтобы связь больше не была проблемой? Почему бы не использовать несколько уровней «разделяй и властвуй», пока не достигнешь размера 100x100? Если этого недостаточно, попробуйте умножение Штрассена, которое уменьшает данные на 1/8 для каждого уровня «разделяй / властвуй».

huseyin tugrul buyukisik 23.07.2018 22:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
815
2

Ответы 2

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

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

Я тестировал его на матрице (1000,1000) на умножение:

для numpy.matmul = 60 мс ± 5,35

для tensorflow.matmul = 42,5 мс ± 2,47 м

Было проведено 100 прогонов для каждого с общим средним и стандартным отклонением.

P.S. Использовалась только версия процессора Tensorflow

будет ли использование версии Tensorflow для ЦП преимуществом умножения матриц здесь?

david 22.07.2018 22:01

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

David 23.07.2018 00:17

Попробуйте использовать TensowFlow для оптимизации графического процессора, он очень хорош для умножения матриц, так как позволяет распараллеливать каждую операцию.

Это должен быть комментарий.

David 23.07.2018 00:17

Другие вопросы по теме