Почему вместо этого мой процессор выполняет матричные операции быстрее, чем графический процессор? - PullRequest
1 голос
/ 09 июля 2020

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

Я использовал процессор и графический процессор для умножения матриц соответственно. Среда программирования: M XNet и cuda-10.1.

с графическим процессором:

import mxnet as mx
from mxnet import nd
x = nd.random.normal(shape=(100000,100000),ctx=mx.gpu())
y = nd.random.normal(shape=(100000,100000),ctx=mx.gpu())
%timeit nd.dot(x,y)

50,8 мкс ± 1,76 мкс на л oop ( среднее ± стандартное отклонение из 7 прогонов, 10000 циклов в каждом)

с процессором:

x1 = nd.random.normal(shape=(100000,100000),ctx=mx.cpu())
y1 = nd.random.normal(shape=(100000,100000),ctx=mx.cpu())
%timeit nd.dot(x1,y1)

33,4 мкс ± 1,54 мкс на л oop (среднее ± стандартная разработка из 7 прогонов, 10000 циклов в каждом)

Почему процессор быстрее? Моя модель процессора - i5-6300HQ, а модель графического процессора - Nividia GTX 950M.

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

TL; DR: умножение вашей матрицы на самом деле не выполняется :)

M XNet - это асинхронная структура, которая накапливает рабочие запросы в очереди, обрабатываемой асинхронно при необходимости выполнения основа его движком исполнения. Итак, вы измеряете только время, необходимое для отправки запроса, а не для его выполнения. Вот почему он такой маленький (микросекунды на матрице 100k * 100k были бы удивительно быстрыми) и примерно равны как для CPU, так и для GPU. Чтобы принудительно выполнить выполнение, вам нужно добавить вызов, который принудительно создает результат, например print или nd.dot(x, y).wait_to_read(). См. Здесь код, очень похожий на ваш тест https://github.com/ThomasDelteil/MXNetParisWorkshop/blob/master/FromNDArrayToTrainedModel.ipynb

Дополнительные комментарии:

  1. Прибавка от использования GPU по сравнению с CPU с размером возможности параллелизма . В простых задачах этот выигрыш может быть небольшим или отсутствовать. Частоты ядра процессора на самом деле в 2–3 раза больше, чем частоты графического процессора (ваш i5-6300HQ работает с частотой 2,3 ГГц с возможностью повышения до 3,2 ГГц, а GTX 950M работает с частотой 0,9 ГГц с возможностью повышения частоты до 1,1 ГГц).

  2. M XNet ndarray очень быстро справляется с матричной алгеброй на CPU , потому что (1) его асинхронная парадигма оптимизирует порядок вычислений (2) его бэкэнд C ++ выполняет все параллельно и (3) я считаю сборка M XNet по умолчанию поставляется с Intel MKL, что значительно увеличивает возможности алгебры процессоров Intel (https://medium.com/apache-mxnet/mxnet-boosts-cpu-performance-with-mkl-dnn-b4b7c8400f98). Его способность выполнять вычисления на графическом процессоре в рамках того же API также является большим преимуществом, например, по сравнению с Numpy.

  3. Я не думаю, что ваш тест будет работать на графическом процессоре: создание экземпляра такого большая матрица на NVIDIA Tesla V100 (16 ГБ для мужчин, в 4 раза больше, чем у GTX 950M) работает с «большой ошибкой размера тензора»

0 голосов
/ 09 июля 2020

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

...