NumPy быстрее, чем PyTorch для больших поперечных или внешних продуктов - PullRequest
0 голосов
/ 25 января 2019

Я вычисляю огромные внешние продукты между векторами размером (50500,) и обнаружил, что при этом NumPy (намного?) Быстрее, чем PyTorch.

Вот тесты:

# NumPy

In [64]: a = np.arange(50500) 
In [65]: b = a.copy()  

In [67]: %timeit np.outer(a, b) 
5.81 s ± 56.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

-------------

# PyTorch

In [73]: t1 = torch.arange(50500)
In [76]: t2 = t1.clone()

In [79]: %timeit torch.ger(t1, t2) 
7.73 s ± 143 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

В идеале я бы хотел, чтобы вычисления выполнялись в PyTorch. Итак, как я могу ускорить процесс вычисления внешнего продукта в PyTorch для таких огромных векторов?


Примечание: я пытался переместить тензоры в GPU, но мне дали MemoryError, потому что ему нужно около 19 ГБ места. Итак, мне в конечном итоге придется сделать это на процессоре.

1 Ответ

0 голосов
/ 25 января 2019

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

Объяснение и опции

Причина, по которой функция numpy np.outer() такая быстрая, в том, что она написана на C, что вы можете увидеть здесь: https://github.com/numpy/numpy/blob/7e3d558aeee5a8a5eae5ebb6aef03de892a92ebd/numpy/core/numeric.py#L1123 где функция использует операции из исходного кода umath C.

Функция Pytorch torch.ger() написана на C ++ здесь: https://github.com/pytorch/pytorch/blob/7ce634ebc2943ff11d2ec727b7db83ab9758a6e0/aten/src/ATen/native/LinearAlgebra.cpp#L142, что делает ее немного медленнее, как вы можете видеть в своем примере.

Ваши варианты «ускорить вычисление внешнего продукта в PyTorch» будут состоять в том, чтобы добавить реализацию C для внешнего продукта в собственном коде pytorch или создать собственный внешний продукт, взаимодействуя с C, используя что-то вроде Cython, если вы действительно этого не делаете. не хочу использовать numpy (что не имеет особого смысла).

приписка

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...