Несколько лет назад у меня на прошлой работе состоялась интересная дискуссия с коллегой из отделения микроэлектроники. Его идея заключалась в том, что производительность в инференсе нейронных сетей на GPGPU от NVIDIA превосходит наше решение в связи с использованием более продвинутого тех. процесса, более высоких тактовых частот и из-за большей площади кристалла. Как программист, я не мог с этим согласиться, но на тот момент ни у кого не было времени и желания проверить эту гипотезу. Недавно в разговоре с уже нынешними коллегами мне вспомнилась эта дискуссия и я решил довести это до конца. В этой статье приведено сравнение производительности модуля NM Card от НТЦ Модуль и видеокарты GT730 от NVIDIA.
Disclaimer
Вся информация получена из открытых источников, открытой документации и/или докладов на конференциях.
Сравнение характеристик чипов
Модуль NM Card построен на базе процессора К1879ВМ8Я, также известного как NM6408, изготовленного на фабрике TSMC по технологическим нормам 28 нм в 2017 году. Площадь кристалла составляет 83 мм2, содержит 1.05 млрд транзисторов, потребляемая мощность не превышает 35 Вт [1]. Микросхема содержит контроллер PCIe 2.0 x4 и интерфейс к памяти DDR3. Пиковая (теоретическая) производительность составляет 512 GFLOPS в формате данных fp32. Процессорные ядра NMC4 работают на тактовой частоте 1ГГц.
Ближайшими аналогами этого чипа выглядят два графических процессора от NVIDIA: GK208B обновлённого поколения Kepler для дискретных видеокарт [2] и GM108S поколения Maxwell для сегмента ноутбуков [3]. Оба чипа практически идентичны, вышли в марте 2014 года. В связи с тем, что GM108S поставляется только в составе ноутбуков, а их цена на вторичном рынке высоковата для простого удовлетворения любопытства, был выбран первый вариант. Однако стоит отметить, что Maxwell является более новой архитектурой, поддерживается более актуальным стеком ПО и потенциально способен достичь большей производительности.
Чтобы не дублировать текстовое описание, сравнение характеристик чипов сведено в таблицу:
|
К1879ВМ8Я |
GK208B |
Фабрика и тех.процесс |
TSMC, 28нм |
TSMC, 28нм |
Площадь кристалла, мм2 |
83 |
87 |
Количество транзисторов, млрд |
1.05 |
1.02 |
Максимальная мощность, Вт |
35 |
23 |
Контроллер PCIe |
Gen 2, x4 |
Gen 2, x8 |
Интерфейс памяти |
DDR3 |
DDR3* |
Пиковая производительность, GFLOPS |
512 |
692.7 |
Частота, МГц |
1000 |
902 |
* — также поддерживается память GDDR5 |
Можно заметить, что по характеристикам чипы практически идентичны. Однако, GK208B обладает определённой гибкостью, в связи с чем важно выбрать правильную видеокарту для корректного сравнения.
Сравнение модулей
В качестве модуля на базе NM6408, как уже было сказано, выбран NM Card [4]. В плане производительности все модули с одним NM6408 показывают идентичную производительность, которая приведена в документации на фреймворк для инференса от Модуля под названием NMDL [5], на которую я и буду ссылаться в дальнейшем.
За пару дней поисков по местным барахолкам мне удалось найти за 14 евро видеокарту MSI GT 730 (N730K-2GD3H/LPV1) [6], в России на момент написания статьи можно найти на Авито за 500-1000 рублей. Видеокарта была произведена в 2016 году и достаточно близко соответствует модулю NM Card. Обе карты имеют пассивное охлаждение, однако у GT730 всего 2 ГБ памяти против 5 ГБ у NM Card. Это сказалось во время исследования на ограничении на размер батча, что потенциально ограничило пиковую производительность для нескольких сетей. Второе отличие заключается в штатной частоте: 902 МГц против 1000 МГц у NM6408, но её можно одним действием поднять в Afterburner. После этого пиковая производительность составит 768 GFLOPS, что соответствует разнице в 1.5 раза относительно NM6408.
Тестовый стенд и программное обеспечение
В качестве тестового стенда я достал лежащий без дела компьютер с весьма скромными характеристиками: i3-7100 и 8 ГБ памяти DDR4. Однако, поскольку осуществляется замер производительности видеокарты, это не должно оказать значительного влияния. В связи с достаточно старой архитектурой, последняя версия CUDA, которая работает с этой картой, является 11.6. Современный onnxruntime поставляется с зависимостью от CUDA 12.x, для CUDA 11.x требуется собирать onnxruntime самостоятельно.
В итоге, чтобы получить работающую версию onnxruntime с cuDNN и TensorRT, были найдены и выбраны следующие версии компонентов:
Компонент |
Версия |
onnxruntime |
1.14 |
CUDA |
11.6.2 |
cuDNN |
8.7.0 |
TensorRT |
8.5.3.1 |
В качестве бенчмарка была написана простая программа с применением onnxruntime, которая загружала модель, запускала инференс с разным размером батча и измеряла время исполнения на протяжении 10 секунд, после чего бралось среднее время выполнения. Для чистоты эксперимента была сделана попытка по максимуму использовать референсные модели, которые распространяются в качестве дополнительных данных к фреймворку NMDL.
Название модели |
Использована референсная модель |
Комментарий |
alexnet |
+ |
|
inception_229 |
+ |
|
resnet-18 |
- |
Некорректный параметр модели |
resnet-50 |
+ |
|
squeezenet |
- |
Некорректный параметр модели |
yolov2-tiny |
- |
Несовпадение размеров между слоями внутри модели |
yolov3-tiny |
+ |
|
yolov5s |
+ |
|
yolo3 |
+ |
|
inception_512 |
+ |
|
unet |
+ |
|
yolo5l |
- |
Не предоставлена модель |
Режимы обработки данных
NM6408 может работать в двух режимах: multi-unit и single-unit. Для понимания этих двух режимов следует вкратце описать архитектуру чипа. NM6408 содержит внутри четыре независимых вычислительных кластера, каждый из которых содержит четыре ядра NMC4 и одно управляющее ядро arm. Каждый кластер имеет свой контроллер DDR3, к которому подключён 1 ГБ памяти. Помимо этих четырёх кластеров, есть дополнительное (управляющее) ядро arm со своим контроллером DDR3 и дополнительным гигабайтом памяти. Все кластеры имеют прямой доступ к памяти друг друга, но этот доступ ограничен первыми 512 МБ памяти, что вызвано использованием 32-битного адресного пространства.
Режим single-unit представляет собой независимую работу каждого кластера. В случае работы одной и той же модели это можно представить как работу с батчем размера 4 и в режиме data parallelism.
В режиме multi-unit общий входной тензор обрабатывается одновременно на всех четырёх кластерах. Это так же можно представить как работу с батчем размера 1 и в режиме spatial paralellism.
Главное отличие работы NM6408 и традиционного GPGPU заключается в том, что в первом случае весь граф исполнения модели находится на устройстве и выполняется при минимальном участии хост-устройства. В какой-то степени это схоже с тем, как работают современные NPU. В то же время GPGPU работают с т.н. кернелами, т.е. отдельными слоями. Такой подход позволяет лучше распределить работу на множество параллельных вычислительных устройств, но об этом в другой раз.
В рамках данного исследования использование традиционного GPGPU позволяет достичь большей гибкости в плане выбора размера батча, тем самым увеличивая загрузку устройства.
Результаты сравнения
Важное отличие измеряемых величин заключается в том, что NMDL возвращает время выполнения по шкале времени управляющего ядра arm без учёта пересылок данных входных и выходных тензоров. Onnxruntime не предоставляет такого механизма, в связи с чем в этом эксперименте метки времени берутся по шкале CPU до и после выполнения запуска инференса через onnxruntime. Таким образом, при прочих равных, полученные значения производительности от onnxruntime будут ниже.
Для размера батча 1 наблюдаются следующие результаты:
Название модели |
Результат GT730, fps |
Результат NM Card, fps |
Ускорение, % |
alexnet |
42.05 |
12.6 |
233.7 |
inception_229 |
13.75 |
12.8 |
7.4 |
resnet-18 |
63.74 |
25 |
154.9 |
resnet-50 |
19.55 |
12.2 |
60.2 |
squeezenet |
149.8 |
74.4 |
101.3 |
yolov2-tiny |
25.96 |
21 |
23.6 |
yolov3-tiny |
29.14 |
27.3 |
6.7 |
yolov5s |
9.1 |
4.7 |
93.6 |
yolo3 |
2.89 |
3.7 |
-21.9 |
inception_512 |
4.69 |
3.93 |
19.3 |
unet |
1.68 |
2 |
-16 |
yolo5l |
1.66 |
1.39 |
19.4 |
Две модели из 12 оказались медленнее на GT730, производительность двух моделей оказалась на уровне, остальные получили значительный прирост производительности. Среднее улучшение относительно NM Card составило 56.8%
Следующий эксперимент состоял в поиске "оптимального" размера батча по степеням двойки, т.е. батч размером 1, 2, 4, ... 64.
Название модели |
Результат GT730, fps |
Результат NM Card, fps |
Ускорение, % |
Оптимальный размер батча |
alexnet |
259.06 |
13 |
1892.7 |
64 |
inception_229 |
17.42 |
20.3 |
-14.1 |
32 |
resnet-18 |
98.66 |
47 |
109.9 |
64 |
resnet-50 |
27.68 |
20.6 |
34.3 |
64 |
squeezenet |
170.6 |
100 |
70.6 |
64 |
yolov2-tiny |
35.18 |
30.4 |
15.7 |
16 |
yolov3-tiny |
36.53 |
35.3 |
3.4 |
16 |
yolov5s |
9.39 |
5.7 |
64.7 |
16 |
yolo3 |
2.89 |
4.5 |
-35.7 |
1 |
inception_512 |
5.24 |
5.44 |
-3.6 |
8 |
unet |
1.7 |
2 |
-14.5 |
2 |
yolo5l |
1.9 |
1.43 |
32.8 |
8 |
В этом эксперименте начинает сказываться тот факт, что на GT730 установлено на 3 ГБ меньше памяти. В своё время были выпущены варианты этой видеокарты с 4 ГБ GDDR5, но для чистоты эксперимента я специально купил карту с DDR3. ПО этим результатам можно заметить, что alexnet показывает колоссальный прирост, если эту модель исключить, то улучшение составляет примерно 24%.
Заключение
По проведённым измерениям можно судить, что GT730 в общем показывает лучшую производительность при идентичных технологических нормах производства системы-на-кристалле и схожих конструктивных решениях изготовления модуля. Определённый интерес могло бы представить сравнение также с GT940M на базе упомянутого выше GM108S, но стоимость ноутбуков в рабочем состоянии с этим чипом колеблется в пределах 100-150 евро, что несколько охлаждает моё любопытство.
Ссылки на источники
[1] https://www.elcomdesign.ru/netcat_files/File/48(7).pdf
[2] https://www.techpowerup.com/gpu-specs/nvidia-gk208b.g815
[3] https://www.techpowerup.com/gpu-specs/nvidia-gm108s.g1033
[4] https://www.module.ru/directions/iskusstvennyj-intellekt/nm-card
[5] https://www.module.ru/directions/iskusstvennyj-intellekt/neuromatrix-deep-learning
[6] https://www.msi.com/Graphics-Card/N730K-2GD3HLPV1/Overview
Автор: NelSon29