Я столкнулся с проблемой, когда мне нужно выполнить матричное умножение между двумя большими матрицами 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 Я приложил свой текущий код.
Предполагая, что у вас есть для этого память, вы можете переместить geno на RAM-диск. Это должно значительно сократить время ввода-вывода вычислений.
Почему бы не разделить матрицы на подматрицы (вместо строк), чтобы увеличить коэффициент повторного использования всех данных, чтобы связь больше не была проблемой? Почему бы не использовать несколько уровней «разделяй и властвуй», пока не достигнешь размера 100x100? Если этого недостаточно, попробуйте умножение Штрассена, которое уменьшает данные на 1/8 для каждого уровня «разделяй / властвуй».






Если возможно, попробуйте использовать тензорный поток для умножения больших матриц, как вы можете видеть из этого статья, что тензорный поток работает значительно лучше в случае больших матриц при многих обстоятельствах. Причина того же, скорее всего, в том, что он в первую очередь создан для этой цели - эффективной обработки больших матриц.
для получения дополнительных сведений о конкретном использовании умножения матриц см. документация.
Я тестировал его на матрице (1000,1000) на умножение:
для numpy.matmul = 60 мс ± 5,35
для tensorflow.matmul = 42,5 мс ± 2,47 м
Было проведено 100 прогонов для каждого с общим средним и стандартным отклонением.
P.S. Использовалась только версия процессора Tensorflow
будет ли использование версии Tensorflow для ЦП преимуществом умножения матриц здесь?
Если у вас есть доступ к графическому процессору, использование тензорного потока и графического процессора значительно сократит время вычислений.
Попробуйте использовать TensowFlow для оптимизации графического процессора, он очень хорош для умножения матриц, так как позволяет распараллеливать каждую операцию.
Это должен быть комментарий.
тайминги мне кажутся большими. Покажите свой текущий код, чтобы увидеть, можно ли его оптимизировать.