Возможности применения 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.Ошибка на р-ом примере Трехслойный перцептрон 5.Подстройка весов(минимизация ошибки методом градиентного спуска) Трехслойный перцептрон Особенности решения: • Для уменьшения числа обменов с глобальной памятью GPU-> массивы данных в двумерные массивы и разбить их на блоки; • Загруженность процессорных элементов, способная скрыть задержку при доступе к ГП GPU-> блоки нужного размера; • Cнизить частоту обменов между CPU и GPU-> пакетная обработка обучающей выборки(перемножение матриц). Трехслойный перцептрон Результаты: • Аппаратная платформа: o CPU: Intel Core 2 Duo 3.00 GHz o RAM: 3.25 Gb o GPU: GeForce 8800 GT, 256 RAM • Задача: o нейронов входного и выходного слоёв: 1)512; 2)256. o нейронов скрытого слоя: ось абсцисс графиков 1) 2) Пример: ЗАДАЧА ДИАГНОСТИКИ ПАЦИЕНТА,КАК ЗАДАЧА РАСПОЗНАВАНИЯ ОБРАЗА Многослойный перцептрон Многослойный перцептрон • Матрица входных элементов • Вектор выходных элементов • НС выполняет преобразование W – вектор весовых коэффициентов • Найти такие W*, которые ошибку Многослойный перцептрон • Задача: o нейронов во входном/скрытом/выходном слое – 16/64/2 o 87 пациентов(описывались 16ю показателями) o функция активации сигмоида • Платформа: o Intel Pentium E5200 o 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 Duo o GeForce 8800GT • Результаты: уменьшение задержек доступа к памяти для чтения входных весов нейронов Пример: РАСПОЗНАВАНИЕ РУКОПИСНЫХ ЦИФР • Задача: o Обучение-обратное распространение ошибки o Тренировочный набор: 60000 раз по одному вектору из 500 o Тестовый набор: по одному из 10000 образцов Сеть свертки • Платформа: o CPU Intel Pentium D 925 (3000 МГц), 2 ГБ DDR2 (PC25300), 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). • Результаты: Ошибки распознавания: • 1.6% на GPU • 1.3% на CPU Пример: Обратная задача магнитотеллурического зондирования • Обратная задача: восстановление реальныххарактеристик пород по наблюдаемым эл-маг. полям Многослойный персептрон • Задача: o Градиентный спуск(обратное распространение ошибки) o 1628/8/1 нейронов во входном/скрытом/выходном слоях o 4 комплекта по 1680 персептронов o Обучающая выборка 30000 примеров, 20 эпох • Результаты: • CPU: AMD Athlon64 x2 Dual 6000+ 3.0 GHz Итог: • CUDA o 2580эпох обучения (на 1 сеть за 1 минуту) o 13 часов на все вычисления на GTX 285 • CPU o 35эпох обучения (на 1 сеть за 1 минуту на 1 ядро) o Примерно 2 месяцана 11 ядрах класса AMD 64 x2 3.0ГГц Почему CUDA? Особенности 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 GPC 4 Потоковых мультипроцессора объединяются в GPC - Graphics Processing Cluster , минимальный блок видеокарты Чип в максимальной конфигурации •16 SM •512 ядер CUDA Core •Кеш L2 758KB •GigaThreadEngine •Контроллеры памяти DDR5 •Интерфейс PCI Отличия GPU от CPU Сотни упрощённых вычислительных ядер, работающих на небольшой тактовой частоте ~1.5ГГц (вместо 2-8 на CPU) Небольшие кеши •32 ядра разделяют L1, с двумя режимами: 16KB или 48KB •L2 общий для всех ядер, 768 KB, L3 отсутствует Оперативная память с высокой пропускной способностью и высокой латентностью • Оптимизирована для коллективного доступа Поддержка миллионов виртуальных нитей, быстрое переключение контекста для групп нитей Латентность памяти Цель: эффективно загружать Ядра Проблема: латентность памяти Решение: •CPU: Сложная иерархия кешей •GPU: Много нитей, покрывать обращения одних нитей в память вычислениями в других за счёт быстрого переключения контекста За счёт наличия сотен ядер и поддержки миллионов нитей (потребителей) на GPU легче заполнить всю полосу пропускания Теоретическая пропускная способность и производительность GPU vs СPU 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 и др.) • Запускать как можно больше нитей Направления развития • Направление GPU: Kepler, Maxwell, SDK CUDA-x86 • Направление ARM • Направление реконфигурируемых чипов • Создание пакета программ «Neuron-GPU»