Возможности применения GPU для нейронных сетей
-
Upload
zachery-franklin -
Category
Documents
-
view
159 -
download
7
description
Transcript of Возможности применения GPU для нейронных сетей
Нейронные сети в биологических системахНейрон
дендриты
сома
аксон
синапс
синапс
Схема нейрона головного мозга
Особенности строения мозга:
• общее число нейронов 1010
• число связей 1013
• время реакции нейрона 10-3с
Применение нейросетей
• Классификация• Кластеризация• Аппроксимация функций• Оптимизация• Прогнозирование• Автоассоциативная память• Управление• Визуализация многомерных данных
• Т.о. существует принципиальная возможность распараллеливания
• Реализация конкретных алгоритмов сильно зависит от используемых архитектур вычислительных систем
Возможные способы параллелизации
• фазы обучения• обучающей выборки• на уровне слоя• на уровне нейрона• на уровне весов
Проблемы:
• Распределение вычислений по процессорам
• Затраты на обмен данными(особенности алгоритмов, пропускная способность, латентность)
• Вычислительная сложность(специализированные процессоры, ограничения на используемые операции)
Используемые архитектуры
• Кластеры• Многопроцессорные системы• Одно- и многоядерные CPU• GPU• Нейрочипы
Пример: РЕАЛИЗАЦИЯ АЛГОРИТМА ОБУЧЕНИЯ САМООРГАНИЗУЮЩИХСЯ КАРТ КОХОНЕНА
• задачи кластеризации массивов данных и построения контекстных карт признаков
Карты Кохонена
1. Инициализация2. Подвыборка3. Поиск максимального подобия4. Коррекция
5. Продолжение (шаг 2)
• Задача: o 64 входа, карта 25 нейронов,
o 2790 примеров, 30 циклов обучения
• Платформы:o неоднородный кластер (Ethernet);
o однородный кластер (32 Dual-Pentium, оптоволокно);
o мультипроцессорная система (64 процессора)
Карты Кохонена
Пример:Карты Кохонена
• Задача:o 100 входов карты, 25х25, 50х50 и 100х100 нейронов, o 60000 примеров, 50 циклов обучения
• Платформа: o Intel Core i7 920 (4 * 2.67GHz), Windows 7 64-bit. o NVIDIA GeForce GTX 680.o Microsoft VS 2010, для параллельной версии использовалась
надстройка NVIDIA Parallel Nsight v.2.1 и программный пакет NVIDIA CUDA Toolkit v4.2.
• Средний прирост скорости обучения относительно последовательной версии алгоритма для карты размера 25х25 нейронов составил 12,39 раз, для карты размера 50х50 нейронов 24,27 раз, а для карты размера 100х100 нейронов время работы параллельного алгоритма превышает время работы последовательного уже в 55,78 раз
Пример: ОБУЧЕНИЕ ТРЕХСЛОЙНОГО ПЕРЦЕПТРОНА
• m,n,k – нейронов ввходном,скрытом и выходном слоях• активационная функция сигмоида• Алгоритм обучения: обратногораспространения ошибки
Трехслойный перцептрон
1.Прямое распространение сигнала
2.Входной вектор3.Выходной желаемый вектор4.Ошибка на р-ом примере
Трехслойный перцептрон
Особенности решения:• Для уменьшения числа обменов с глобальной
памятью GPU-> массивы данных в двумерные массивы и разбить их на блоки;
• Загруженность процессорных элементов, способная скрыть задержку при доступе к ГП GPU-> блоки нужного размера;
• Cнизить частоту обменов между CPU и GPU-> пакетная обработка обучающей выборки(перемножение матриц).
Трехслойный перцептрон
Результаты:• Аппаратная платформа:
o CPU: Intel Core 2 Duo 3.00 GHzo RAM: 3.25 Gbo GPU: GeForce 8800 GT, 256 RAM
• Задача:o нейронов входного и выходного слоёв:
1)512; 2)256.o нейронов скрытого слоя: ось абсцисс графиков
• Матрица входных элементов• Вектор выходных элементов• НС выполняет преобразованиеW – вектор весовых коэффициентов• Найти такие W*, которые
ошибку
Многослойный перцептрон
• Задача: o нейронов во входном/скрытом/выходном слое – 16/64/2o 87 пациентов(описывались 16ю показателями)o функция активации сигмоида
• Платформа:o Intel Pentium E5200o NVIDIA GeForce GTX550TI (ОП 4 ГБ)
• Результаты:o T[c] обучения/тестирования алгоритмом, реализованным для
центрального процессора – 712/26 с, с применением CUDA – 88/4 с
o Ускорение вычислений в 8/6,5 раз
Многослойный перцептрон
Пример: ЗАДАЧА РАСПОЗНАВАНИЯ ИЗОБРАЖЕНИЯ
• Задача:o Входной/скрытый/выходной 64/9/6(вых 26
букв+10 цифр в двоичной кодировке)o Обучение: метод Лавнеберга- Марквардта
• Платформа:
Пример:ПАРАЛЛЕЛЬНАЯ ОБРАБОТКА ПОТОКА ДАННЫХ
• Задача: o Трехслойный персептронo Нейронов во входном=скрытом=выходномo Входные данные разбиты на окна,
объединенные в блоки• Платформа:
o IntelCore 2 Duoo GeForce 8800GT
Пример: РАСПОЗНАВАНИЕ РУКОПИСНЫХ ЦИФР
• Задача:o Обучение-обратное
распространение ошибкиo Тренировочный набор: 60000 раз по одному
вектору из 500o Тестовый набор: по одному из 10000 образцов
Сеть свертки
• Платформа:o CPU Intel Pentium D 925 (3000 МГц), 2 ГБ DDR2 (PC2-5300),o видеокарта на основе NVIDIA 9600GT; o Microsoft Windows XP Service Pack 3; o NVIDIA Forceware191.07 (дата выпуска 05.10.2009); o NVIDIA CUDA2.3 (Toolkit + SDK);o Microsoft C/C++ compiler 14.0 (Microsoft Visual Studio
2005 Service Pack 1).o Настройки оптимизации: Maximize Speed (/O2), Inline
Function Expansion (/Ob1), Enable Intrinsic Functions(/Oi), Favor Fast Code (/Ot).
Пример: Обратная задача магнитотеллурического зондирования
• Обратная задача: восстановление реальныххарактеристик пород по наблюдаемым эл-маг. полям
Многослойный персептрон
• Задача:o Градиентный спуск(обратное распространение
ошибки)o 1628/8/1 нейронов во
входном/скрытом/выходном слояхo 4 комплекта по 1680 персептроновo Обучающая выборка 30000 примеров, 20 эпох
Итог:• CUDA
o 2580эпох обучения (на 1 сеть за 1 минуту)o 13 часов на все вычисления на GTX 285
• CPUo 35эпох обучения (на 1 сеть за 1 минуту на 1
ядро)o Примерно 2 месяцана 11 ядрах класса AMD 64
x2 3.0ГГц
Особенности CPU Intel Core I-7Небольшое число мощных независимых
ядер •2,4,6,8 ядер, 2,66—3,6ГГц каждое •Каждое физическое ядро определяется
системой как 2 логических и может параллельно выполнять два потока (Hyper-Threading)
3 уровня кешей, большой кеш L3 •На каждое ядро L1=32KB (data) + 32KB
( Instructions), L2=256KB •Разделяемый L3 до 20 mb Обращения в память обрабатываются
отдельно для каждого процесса\нити Core I7-3960x, 6 ядер, 15MB L3
GPU Streaming Multiprocessor (SM)
Потоковый мультипроцессор «Единица» построения устройства (как ядро в
CPU): •32 скалярных ядра CUDA Core, ~1.5ГГц •2 Warp Scheduler-а •Файл регистров, 128KB •3 Кэша – текстурный, глобальный (L1),
константный(uniform) •PolyMorphEngine – графический конвейер •Текстурные юниты •Special Function Unit (SFU) – интерполяция и
трансцендентная математика одинарной точности
•16 x Load/Store unit
GPC4 Потоковых мультипроцессора
объединяются в GPC - Graphics Processing Cluster , минимальный блок видеокарты
Чип в максимальной конфигурации
•16 SM •512 ядер CUDA
Core •Кеш L2 758KB •GigaThreadEngin
e •Контроллеры
памяти DDR5 •Интерфейс PCI
Отличия GPU от CPU
Сотни упрощённых вычислительных ядер, работающих на небольшой тактовой частоте ~1.5ГГц (вместо 2-8 на CPU)
Небольшие кеши •32 ядра разделяют L1, с двумя режимами: 16KB или 48KB •L2 общий для всех ядер, 768 KB, L3 отсутствует Оперативная память с высокой пропускной способностью и
высокой латентностью • Оптимизирована для коллективного доступа Поддержка миллионов виртуальных нитей, быстрое
переключение контекста для групп нитей
Латентность памяти
Цель: эффективно загружать Ядра Проблема: латентность памяти Решение: •CPU: Сложная иерархия кешей •GPU: Много нитей, покрывать обращения одних
нитей в память вычислениями в других за счёт быстрого переключения контекста
За счёт наличия сотен ядер и поддержки миллионов нитей (потребителей) на GPU легче заполнить всю полосу пропускания
GPU - Graphics Processing Unit
• GPGPU - General-Purpose computing on GPU, вычисления общего вида на GPU
Первые GPU от NVIDIA с поддержкой GPGPU – GeForce восьмого поколения, G80 (2006 г)
• CUDA - Compute Unified Device Architecture (унифицированная архитектура вычислительного устройства)
Программно-аппаратная архитектура от Nvidia, позволяющая производить вычисления с использованием графических процессоров
CUDA в классификации Флинна
У Nvidia собственная модель исполнения, имеющая черты как SIMD, так и MIMD: Nvidia SIMT: Single Instruction – Multiple Thread- все нити из одного варпа одновременно выполняют одну инструкцию, варпы выполняются независимо
SIMT: виртуальные нити, блоки
Виртуально все нити: •выполняются параллельно (MIMD) •Имеют одинаковые права на доступ к памяти (MIMD :SMP) Нити разделены на группы одинакового размера (блоки): •В общем случае, глобальная синхронизация всех нитей
невозможна, нити из разных блоков выполняются полностью независимо и не могут управляемо взаимодействовать
•Есть локальная синхронизация внутри блока, нити из одного блока могут взаимодействовать через специальную память
Нити не мигрируют между блоками. Каждая нить находится в своём блоке с начала выполнения и до конца.
SIMT: аппаратное выполнение • Все нити из одного блока выполняются на одном мультипроцессоре
(SM) • Максимальное число нитей в блоке – 1024 • Блоки не мигрируют между SM • Распределение блоков по мультироцесссорам непредсказуемо • Каждый SM работает независимо от других • Блоки нитей по фиксированному правилу разделяются на группы по
32 нити, называемые варпами (warp) • Все нити варпа одновременно выполняют одну общую инструкцию
(в точности SIMD-выполнение) • Warp Scheduler на каждом цикле работы выбирает варп, все нити
которого готовы к выполнению следующей инструкции и запускает весь варп
• Все нити варпа одновременно выполняют одну и ту же инструкцию
Несколько блоков на одном SM
SM может работать с варпами нескольких блоков одновременно
•Максимальное число резидентных блоков на одном мультипроцессоре – 8
•Максимальное число резидентных варпов – 48 = 1536 нитей Чем больше нитей активно на мультипроцессоре, тем
эффективнее используется оборудование • Блоки по 1024 нити – 1 блок на SM, 1024 нити, 66% от
максимума • Блоки по 100 нитей – 8 блоков на SM, 800 нитей, 52% • Блоки по 512 нитей – 3 блока на SM, 1536 нитей, 100%
Вычисления с использованием GPU
Программа, использующая GPU, состоит из: •Кода для GPU, описывающего необходимые
вычисления и работу с памятью устройства •Кода для CPU, в котором осуществляется – Управление памятью GPU – выделение /
освобождение – Обмен данными между GPU/CPU – Запуск кода для GPU – Обработка результатов и прочий последовательный
код
GPU рассматривается как периферийное устройство, управляемое центральным процессором
• GPU «пассивно», т.е. не может само загрузить себя работой
Код для GPU можно запускать из любого места программы как обычную функцию
Код для GPU (device-code)
Код для GPU пишется на C++ с некоторыми надстройками: •Атрибуты функций, переменных и структур •Встроенные функции
o Математика, реализованная на GPU o Синхронизации, коллективные операции
•Векторные типы данных •Встроенные переменные
o threadIdx, blockIdx, gridDim, blockDim
•Шаблоны для работы с текстурами •… Компилируется специальным компилятором cicc
Код для CPU (host-code)
Код для CPU дополняется вызовами специальных функций для работы с устройством
Код для CPU компилируется обычным компилятором
•Кроме конструкции запуска ядра <<<...>>>
Библиотеки в составе CUDA Toolkit
• Thrust – STL-подобная параллельная обработка данных• CUBLAS – функции линейной алгебры• CUSPARSE – операции с разреженными
матрицами/векторами• CURAND – генерация псевдослучайных чисел• CUFFT – быстрое дискретное преобразование Фурье• NPP – обработка сигналов, изображений и видео• NVCUVID/NVCUVENC – кодирование/декодирование
видео• Thrust – Библиотека шаблонов C++ Параллельные
алгоритмы и структуры данных
Основные приемы ускорения для нейронных сетей:
• Правильная постановка задачи«Мусор» на входе -> «мусор» на выходе
• Раскрытие циклов• Использование shared memory видеокарты для хранения
часто используемых значений• Организация обменов с памятью• Легковесные нити• Использование пакетного режима• Выравнивание данных• Использование специализированных библиотек (CUBLASS,
CUFFR и др.)• Запускать как можно больше нитей