Нарезка списка PyTorch на GPU медленнее, чем на CPU

Я хотел бы оптимизировать код машинного обучения (SSD в PyTorch) на NVIDIA Jetson Xavier NX (комплект для разработки ). Одним из узких мест, похоже, является нарезка списков на тензорах PyTorch (1.6.0) на устройстве с графическим процессором.

Та же проблема возникла на NVIDIA GeForce GTX 1050 Ti (GP107), процессор был примерно в 2 раза быстрее.

Позвольте мне сначала создать переменные

import torch
from time import time

cuda0 = torch.device('cuda:0')

probs = torch.ones([3000], dtype=torch.float64, device=cuda0)
mask = torch.ones([3000], dtype=torch.bool, device=cuda0)

probs_cpu = probs.cpu()
mask_cpu = mask.cpu()

Затем запустите логику (примерно одинаковые результаты получались при каждом запуске)

before = time()
probs[mask]
print(f'GPU {time() - before:.5f}') # output: GPU 0.00263


before = time()
probs_cpu[mask_cpu]
print(f'CPU {time() - before:.5f}') # output: CPU 0.00066

Почему нарезка списка в ~ 4 раза медленнее на GPU по сравнению с CPU с использованием библиотеки PyTorch vesrion 1.6.0 в комплекте разработчика NVIDIA Jetson Xavier NX в соответствии с приведенным выше кодом? Как это ускорить?

Сведения о коде: см. строку 51 в predictor.py, который является частью реализации SSD в PyTorch

Запустить его на ЦП?: весь алгоритм не будет быстрее, если я запущу его на ЦП, так как загрузка с ГП занимает слишком много времени (~ 0,00805 с).


person Petr Dvořáček    schedule 17.09.2020    source источник
comment
Я могу воспроизвести это на рабочем столе. Я предполагаю, что отправка инструкции графическому процессору требует времени.   -  person hkchengrex    schedule 17.09.2020
comment
Я не могу напрямую воспроизвести это в Google Colab с Tesla P4: GPU 0.00870 CPU 0.01367. Но результаты сильно разнятся. Так что @hkchengrex может иметь здесь смысл. Однако, когда вы берете более крупные тензоры, такие как 3000000, все меняется в пользу GPU: GPU 0.00115 CPU 0.03155. См. Также stackoverflow .com / questions / 53325418 /.   -  person MBT    schedule 17.09.2020
comment
Пожалуйста, проверьте здесь для измерения времени. на CUDA и связанном с ним обсуждении. Используя события, вы получите только время, потраченное GPU на эту операцию.   -  person Szymon Maszke    schedule 18.09.2020
comment
Вектор неизвестного размера является результатом операции - вероятно, поэтому она занимает так много времени на графическом процессоре.   -  person Petr Dvořáček    schedule 05.10.2020