В статье автор сравнивает эффективность технологий распараллеливания компьютерных вычислений на примере задачи реализации и обучения нейронной сети репликации.
Ключевые слова: CUDA, OpenCL, нейронная сеть репликации, машинное обучение, техническая реализация, сравнение эффективности.
Введение
На сегодняшний день технологии шагнули далеко вперёд, особенно в областях, связанных с компьютерной графики. Каждый год грань между фотореалистичным рендером и снимком фотоаппарата становится всё тоньше и незаметней. Число транзисторов, используемых для изготовления видеокарт перевалило за миллиард и медленно, но верно движется к триллиону. В связи с этим особую актуальность приобрела задача распараллеливания вычислений, используя вычислительные мощности графических ускорителей. На данный момент существует две основных технологии, позволяющих это сделать: CUDA и OpenCL. Их эффективность на примере конкретной задачи и будет сравниваться в данной работе.
1. Предметная область
1.1 Основные сведения об автоэнкодерах
Согласно [1], нейронная сеть репликации (или автоэнкодер) — это нейронная сеть, удовлетворяющая ряду условий:
1) Входной и выходной слои имеют одинаковый размер k;
2) Размер скрытого слоя n строго меньше k;
3) Сеть является полносвязной.
То есть, на самом деле, автоэнкодер — не самая сложная возможная архитектура нейронной сети, но важно представлять себе, как она выглядит. Схематично изобразить представителя данного класса сетей можно следующим образом (рис. 1).
Рис. 1. Схематичное представление автоэнкодера
Из рисунка 1 видно, что цель, с которой были разработаны нейронные сети репликации, заключается в извлечении признаков и других интересных данных, которые выделяет для себя нейросеть в процессе обучения. Эти данные, очевидно, содержатся в закодированном сигнале s (рис. 1). Таким образом, понятно, что существование промежуточного слоя необходимо, иначе задача предсказания и обучения сводилась бы к тривиальному копированию «входа» на «выход».
1.2 Задачи, решаемые автоэнкодерами
Как уже было отмечено ранее, автоэнкодеры применяются для извлечения полезной информации из входного сигнала, однако этим их применение не ограничивается. Они также используются для решения следующих задач:
1) Предварительное обучение нейронных сетей;
2) Сжатие информации;
3) Снижение размерности данных;
4) Сглаживание шума.
В рамках данной работы будет реализована нейронная сеть репликации, которая будет извлекать информацию из изображений. В качестве изображений будут использоваться стандартный обучающий набор со сканами рукописных цифр MNIST. Такая тривиальная задача выбрана для того, чтобы не отвлекаться на вопросы и проблематику машинного обучения, а сосредоточиться на программировании графических процессоров.
2. Компьютерный эксперимент
2.1 Важное замечание
Прежде всего, стоит сделать важное замечание, которое скорее относится к тонкостям технической реализации, нежели к особенностям предметной области, рассмотренным в предыдущей главе. Дело в том, что входной сигнал искусственного нейрона есть линейная комбинация вектора входных данных и вектора весов этого нейрона [1]. Соответственно, если рассматривать процесс прямого прохода сигнала по всей сети, от слоя к слою, то окажется, что этот процесс можно представить в более лаконичном виде, нежели набор скалярных произведений, а именно в виде умножения вектора входных данных на матрицу весов слоя. Соответственно, основная трудность технической реализации состоит в реализации операции умножения матрицы на вектор-столбец. Благо, [2] и [3] содержат нужные примеры и заготовки, которые остаётся эффективно использовать.
2.2 Гипотеза
Для начала стоит представить сведения о тестовом стенде (таблица 1).
Таблица 1
Список характеристик тестового стенда
Название характеристики |
Значение характеристики |
Операционная система |
Windows 10 Home, 64 bit |
Версия CUDA Toolkit |
10.2 |
Версия OpenCL |
1.2 CUDA |
Процессор |
Intel(R) Core (TM) i5–8300H CPU @ 2.30GHz |
Видеокарта |
NVIDIA GeForce GTX 1050 |
Объём оперативной памяти, Гб |
16 |
Версия драйвера видеокарты |
442.50 |
Я выдвигаю гипотезу, что результаты эксперимента будут примерно одинаковыми, но несмотря на то, что OpenCL входит в поставку NVIDIA CUDA Toolkit, CUDA покажет чуть более высокие результаты, так как технология создавалась специально для видеокарт фирмы NVIDIA.
2.3 Содержание эксперимента
Общее время выполнения программы не имеет смысла замерять в связи с задержками, которые могут быть вызваны разными факторами во время чтения и записи информации, вывода отладочных логов и тому подобного. Поэтому сравнение эффективности будет вестись по трём тестам, выполнение которых будет происходить непосредственно на графическом процессоре. Первый тест — матричное умножение (матрица на вектор-столбец), так как, очевидно, это ключевая операция, используемая при реализации подобного рода алгоритмов машинного обучения. Следующие два теста — предсказание сети, то есть прямой проход входного сигнала от слоя к слою по всей сети, и обучение, самый важный процесс в жизненном цикле нейронных сетей.
Как уже упоминалось ранее в главе 1, используемая для сравнения эффективности нейронная сеть репликации будет работать с набором данных MNIST (рис. 2).
Рис. 2. Фрагмент набора данных MNIST
В результате обучения из среднего слоя сети можно будет извлекать изображения, показывающие, что именно сеть научилась извлекать из этой информации (рис. 3).
Рис. 3. Визуальное представление «признаков», выявленных автоэнкодером
Ну а используемая сеть будет иметь 784 входа, 64 скрытых нейрона и 784 выхода.
2.4 Результат
Результаты были получены путём замера времени выполнения функций, реализующих тесты, указанные в таблице 2. Для программы, использующей технологии CUDA, была применена утилита nvprof [3], а для программы, использующей технологии OpenCL, были выполнены вызовы специальной функции самого фреймворка — clGetEventProfilingInfo [2]. Результаты представлены ниже, в ранее упомянутой таблице 2.
Таблица 2
Результаты эксперимента
Название теста |
Результат CUDA, с |
Результат OpenCL, с |
Умножение матрицы 784х64 на вектор длиной 784 |
1,04 * 10– 4 |
4,7 * 10– 5 |
Предсказание сети |
1,37 * 10– 4 |
6,7 * 10– 5 |
Обучение сети |
147,7 |
101,5 |
Заключение
В рамках данной работы были получены базовые навыки программирования графических процессоров и изучены основы технологий CUDA и OpenCL. Удивительно, но эксперимент опроверг мою гипотезу. Возможно, загрузка для видеокарты была небольшой в случае CUDA, и я не смог полностью раскрыть потенциал технологии. А может быть дело в том, что мною, при использовании OpenCL, были приняты во внимание рекомендации [4], например, использование нативных (native) математических функций в коде ядра. В любом случае, результаты довольно интересные.
Литература:
- Хайкин, С. Нейронные сети. Полный курс [Текст] / С. Хайкин. — М.: Издательский дом «Вильямс», 2006. — 1104 с.
- Scarpino, M. OpenCL in Action: How to accelerate graphics and computations [Текст] / M. Scarpino, — M.: Manning Publications Co., 2011. — 456 c.
- CUDA Toolkit Documentation [Электронный ресурс]: официальная документация к инструменту NVIDIA — Электрон. текстовые дан. — 2019. — Режим доступа: https://docs.nvidia.com/cuda/
- Минин, С. А. Исследование способов оптимизации нейросетевых вычислений [Текст] / С. А. Минин // Каталог инновационных разработок участников Московского молодёжного научного форума (г. Москва, 21–24 ноября 2017 г.). — Москва, 2017. — С. 17–25.