трансляция по тензорам в `пыторх` - PullRequest
1 голос
/ 16 февраля 2020

Я использую Pytorch в качестве языка обработки массивов (не для традиционных целей глубокого обучения), и мне интересно, каков канонический способ сделать «пакетный» параллелизм.

Например, предположим, что я хочу вычислить svds двухмерных слоев трехмерного тензора (скажем, используя torch.svd()), и я хочу вернуть кортеж из u s, сложенных s, сложены v.

Предположительно, через магию c SIMD-параллелизма, это должно быть выполнено примерно в то же время, что и однослойный SVD (на GPU), но как его запрограммировать?

1 Ответ

2 голосов
/ 16 февраля 2020

PyTorch - это высокоуровневая программная библиотека с множеством оболочек python для высоко оптимизированного скомпилированного кода. Функция или оператор поддерживает пакетные данные или нет. Нет другого пути, кроме как написать собственный код C / C ++ / CUDA и вызвать его с помощью python.

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

Обратите внимание, что размер партии всегда является первым размером тензора. PyTorch поддерживает вещание для обычных операторов, таких как +, -, *, /, как описано здесь . Из-за возможных двусмысленностей вам иногда необходимо соответствующим образом изменить свои данные, чтобы прояснить, что вы хотите. Например, если вы хотите добавить пакет скаляров в пакет векторов, вам нужно сделать что-то вроде:

a = torch.zeros(2, 2)
b = torch.arange(2)
a + b.view(2, 1) # or b.reshape(2, 1)
# tensor([[0., 0.],
          [1., 1.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...