Как использовать результат ninsy einsum_path? - PullRequest
0 голосов
/ 01 февраля 2019

Я выполняю довольно сложную операцию над каким-то 3- и 4-мерным тензором, используя numey einsum.

Мой настоящий код -

np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi)

Это делает то, что я хочуdo.

Используя einsum_path, получается:

>>> path = np.einsum_path('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi)

>>> print(path[0])
['einsum_path', (0, 1), (0, 3), (0, 1), (0, 1)]

>>> print(path[1])
  Complete contraction:  oij,imj,mjkn,lnk,plk->op
         Naive scaling:  8
     Optimized scaling:  5
      Naive FLOP count:  2.668e+07
  Optimized FLOP count:  1.340e+05
   Theoretical speedup:  199.136
  Largest intermediate:  7.700e+02 elements
--------------------------------------------------------------------------
scaling                  current                                remaining
--------------------------------------------------------------------------
   4                imj,oij->moj                     mjkn,lnk,plk,moj->op
   5               moj,mjkn->nok                          lnk,plk,nok->op
   4                plk,lnk->npk                              nok,npk->op
   4                 npk,nok->op                                   op->op

Это указывает на теоретическое ускорение примерно в 200 раз.

Как я могу использовать этот результат для ускорения моего кода?Как мне «реализовать» то, что говорит мне einsum_path?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Проведите несколько тестов времени

path = np.einsum_path('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi)

np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi, optimize=False)
np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi, optimize=True)         
np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi, optimize=path[0])

В моем тестировании вторые 2 бегут с той же скоростью.Для небольшой проблемы optimize=False быстрее, вероятно, потому что анализ и перестановка занимают время.Для большой проблемы с большим теоретическим ускорением фактическое ускорение для True может быть больше, чем теоретическое.Предположительно управление памятью замедляет дело False.

theoretical speedup - это всего лишь оценка, основанная только на подсчете FLOPS.Это будет верно только в той степени, в которой FLOPS доминирует в вычислениях.

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

0 голосов
/ 01 февраля 2019

Из исходного кода

Theoretical Speedup = speedup = naive_cost / opt_cost
naive_cost = _flop_count(idx_contract, idx_removed, len(input_sets), idx_dict)

Итак, исходя из этого, для ускорения процесса вам понадобится получить FLOPS (операций с плавающей запятой в секунду) опущен.Поскольку наивная стоимость - это стоимость неоптимизированного выражения, вам необходимо переписать ваше выражение таким образом, чтобы вы удалили любой «мусор», связанный с выражением, оставив без изменения базовой структуры выражения.

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

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

...