Данная статья ставит себе целью проанализировать причины фактического неиспользования ПЛИС в задачах исследования и обучения нейронных сетей а также предложить концепцию их возможного эффективного применения.
Об авторе: опытный FPGA-разработчик, в последние несколько лет не принимавший участия в промышленной разработке. Наблюдения и выводы основаны на любительском опыте обучения сетей, обзорных статьях и новостях.
Причин исчезающе малого применения FPGA в области обучения нейронных сетей (НС) достаточно. Начиная со стандартных: сложность входа в разработку; громоздкие, медленные и довольно низкокачественные IDE; общее низкое число специалистов и, соответственно, слабое сообщество. И заканчивая специфической — бесконечная сложность написания кода по сравнению с PyTorch.
А во главе всего — отсутствие решающего преимущества, способного перевесить указанные минусы! Зачем, если CUDA+PyTorch лишены этих недостатков, а максимум, который может предложить ПЛИС, это повторить текущие решения?
В такой ситуации стоило бы ждать решительных шагов прежде всего от вендоров.. но этого нет. То награждают на конкурсе реализацию YOLOv5 — "сделали, а что дальше вы намерены делать?"(с), то уходят в новой архитектуре от квази бесшовной, однородной структуры к модульной. Ещё больше всё усложняющей но предоставляющей аж 400(!) ИИ-ядер.
По-настоящему изменить положение вещей могло бы предельное, на порядок и более, ускорение обучения больших НС с использованием ПЛИС. Подобное ускорение можно обеспечить путём параллельных вычислений сразу на многих «кристаллах», используя для передачи информации мощнейший интерконнект в виде высокоскоростных приемопередатчиков (трансиверов) — вещь, о которой почему-то несправедливо забыли.
В связи с этим была сформулирована следующая задача: реализовать систему конвейерной обработки информации на нескольких FPGA при обучении НС.
Далее речь пойдёт о том, что может сделать в контексте поставленной задачи 1 инженер, 1 средняя фирма и, самое главное, мог бы сделать вендор.
1 инженер
Возможности весьма ограничены. Возможно реализовать несколько стандартных слоёв, функций ошибки, протокол взаимодействия с клиентским PC, разместить всё в 1 «кристалле», обучить модель и по результатам оценить перспективы. Что и было сделано.
Для большей предметности была написана стандартная свёрточная нейросеть, тестируемая на Кинтекс 7, основная рабочая частота 300 МГц. Микросхема старая но сбалансированная, обеспечивающая двунаправленные 100 Гбит/c как с внешней памятью, так и с «предыдущей» и «последующей» микросхемами.
Данные для обучения загружаются по Ethernet 10G и в обработку поступают по 1 пикселю за такт. Математика целочисленная, 18 бит для весов и 22 для данных между слоями(всё настраиваемое). Веса хранятся в блочной/распределённой памяти. Входной поток подаётся в блок прямого распространения и параллельно записывается в FIFO (DDR3/BRAM) для вычислений при обратном распространении. После пулинга и функции активации поток, если возможно, уплотняется и передаётся в следующий слой простым FIFO — его интерфейс легко переносится на высокоскоростные приемопередатчики, но в текущей реализации они не используются за неимением аппаратного обеспечения.
При обратном распространении происходит синхронизация с вычислениями прямого прохода для совместного использования весовых коэффициентов. После подачи всех данных одного «батча» прямой поток останавливается до завершения обратного распространения и обновления весов(необходимость остановки под вопросом).
По этой причине, а также из-за необходимости обновления динамической памяти, коэффициент заполнения входного потока менее 100%, однако практическое снижение производительности незначительно и не превышает нескольких процентов. Структура вычислительного конвейера формируются из структуры данных в потоках на конкретном слое нейросети для максимального переиспользования ресурсов. SystemVerilog код нейронной сети, модулей взаимодействия с Ethernet, клиентская часть управления на python и эталонная модель на чистом numpy в репозитории. Так как для написания и отладки логики нейросети используется собственный вариант «HLS», то .sv код является «машинописным», однако его воспринимаемость удовлетворительна.
Результат
В результате была подтверждена возможность полностью параллельного высокоскоростного обучения простой нейронной сети и перспективность дальнейшего усложнения до ViT и GPT. Вместе с тем необходимо отметить 2 основных недостатка предложенной архитектуры:
Для Кинтекс 7, как поток в 100 Гбит/с для связи между слоями и с внешней памятью, так и 2000 DSP-блоков не выглядят чем-то значительным даже в рамках 1 слоя по-настоящему большой НС.
Однако в процессе тестирования были обнаружены множество путей для оптимизации. Например, для передачи между слоями не обязательно передавать integer, а достаточно передать «log2(int)» т.е. номер старшего бита и знак. Что сразу сжимает поток в несколько раз и одновременно снимает необходимость в аппаратных умножителях.
Доступно как кратное увеличение скорости расчёта путём подачи 2/4/8 и более пикселей на вход алгоритма за 1 такт при наличии ресурсов, так и прореживание входных данных для пропорционального уменьшения потоков между слоями — вариантов реализации с учётом гибкой природы ПЛИС действительно много.
Хранение весовых коэффициентов в разработанном алгоритме осуществляется во внутренней памяти, что очевидно не позволит обучать по-настоящему большие НС(10-100 млрд) на относительно старых семействах.
Современные же FPGA с одной стороны могут быть в 10 и более раз производительнее К7, а с другой в них наблюдается явный перекос в сторону скорости приёмопередатчиков относительно обмена с внешней памятью. Как следствие, логично рассматривать «горизонтальное» масштабирование — размещение 1 слоя нейросети параллельно в нескольких микросхемах.
1 средняя фирма
Собрать легко масштабируемую систему из нескольких плат, реализовать протокол синхронизации и управления для неё. Для применения создать простую в использовании автоматическую систему одновременной компиляции и перепрограммирования большого количества FPGA по оптическим каналам. Стандартизировать интерфейсы вновь создаваемых модулей и обеспечить их качественное тестирование. Разделить этап прототипирования на видеокартах и реальное обучение на ПЛИС.
Теоретически, в масштабах 1 организации с учётом уже существующего отдела FPGA-разработки, возможно при умеренных вложениях реализовать подобную систему. На порядок снизить время обучения новых моделей тем самым уменьшить время разработки новых решений и одновременно поднять экспертизу собственных инженеров. Но без участия вендоров проблему медленной разработки новых модулей решить сложно.
Альтера, Ксайлинкс и другие
Необходимостью является полностью готовая система высокоскоростного обучения нейронных сетей.
С аппаратной стороны выпустить плату с необходимым «обвесом» и стандартизировать интерфейсы к ним, подготовить проект для тестирования, написать клиентскую часть осуществляющую полное тестирование аппаратной части и выводящую информацию об его состоянии в удобной, наглядной форме. Отчёт о тестировании должен быть достаточно информативным для базового ремонта по рекомендациям производителя или гарантийной замены.
Разработчики нейронных сетей не должны заниматься «железом». Вообще!
Для взаимодействия с собранной вычислительной системой необходим базовый FPGA-проект с центральной частью в виде blackbox для пользовательской логики, в который входят стандартные интерфейсы потоков данных, а вне которого находится логика авто построения сети, синхронизация и доступ к flash-памяти загрузки каждой ПЛИС. На клиентской части реализовать GUI, в который отображается аппаратная составляющая и посредством которого осуществляется наглядный контроль соответствия ресурсов и интерфейсов вычислительной системы и описываемой НС.
Непосредственно для для разработки НС нужен верифицированный репозиторий модулей заполняемый в том числе пользователями, стандартизованные требования к новым модулям, а также мощный testbench для их верификации.
Итоговый маршрут проектирования:
Актуальным также являлся бы подход быстрой проверки какой-либо идеи полностью в облаке, если для этого достаточно использования стандартных модулей и публичных наборов данных.
В завершение немного лирики
Если обучать нейросеть на рассмотренной системе из нескольких FPGA на частоте ядра 300 МГц изображениями 640х640 и подавать на вход алгоритма 4 пикселя за такт, то для прогона 1 млн изображений необходимо около 6 минут. Я не могу судить в абсолютных значения долго ли это, но создаётся впечатление, что не долго. Мой инженерный опыт подсказывает, что тест длительностью одного порядка со временем компиляции(30-90мин) не является слишком обременительным.
Когда читаю статьи в духе "мы обучали нашу сеть 4 дня, наконец поняли, что в ней ошибка — и начали заново" или "ребята из университета Y провели исследование и выяснили, что эффект YY связан с некорректным применением метрик", то испытываю определённое замешательство. С одной стороны - опытные энергичные специалисты, разработчики околопередовых решений, а с другой - иногда совсем «детские» ошибки в базовых вещах, не исправляемые месяцами и годами.
И ведь только непомерно высокая длительность эксперимента определяет, на мой взгляд, наличие подобных ошибок и иногда низкий уровень практического знания в области обучения больших НС. Области, где теория пишется фактически постфактум лишь объясняя полученные результаты.
Комментарии (21)
yamifa_1234
20.09.2023 10:07То есть вы хотите сказать что реализовали нейронную сеть на ПЛИС и успешно ее обучили?
К слову, я за последние пару недель, реализовал масштабируемую нейронную сеть(через параметры задаем число узлов в каждом слое, число слоев, есть возможность внедрения условного рандома весовым коэффициентам при инициализации), эта сеть имеет в себе механизм обучения обратного распространения ошибки. И я на этапе симуляции ее обучаю, в целом успешно(структура нейронной сети 2,3,2,1 - нейронов в каждом слое), но есть ряд проблем: 1.выбор активационной функции, метод обучения(набор данных, накапливать ошибку или после каждого прогона корректировать веса). 2.разрядность констант/данных/коэффициентов (если выбрать слишком большие разрядности то ресурсы съедаются огромные, если выбрать слишком маленькие разрядности то сеть ни когда не сойдется к нулевой ошибке)
P.S. кстати, если механизм обучения убрать из нейронной сети то она начинает весить в разы меньше, и если сеть с обучением занимает 2-3 ПЛИСы то без обучения она может и в одну влезть, возникает вопрос о сохранении(выгрузки) весовых коэффициентов пользователю, мне кажется этот механизм отъест еще больше ресурсов
iDoka
20.09.2023 10:07+2А во главе всего — отсутствие решающего преимущества
В начале статьи очень много рассуждений об абстрактных преимуществах и недостатках обучения ИНС на том или ином железе, но потом почему-то сразу резкий переход на обсуждение конкретных имплементаций в ПЛИС, а что и ради чего оптимизируем - как-то упущено.
В капиталистическом обществе эксплуатантов интересуют только две вещи: CapEx & OpEx. Лично я не вижу у ПЛИС для задачи обучения ИНС какого-то картбаланша, чтобы при удачном стечении обстоятельств (имплементации какой-либо супер-мега-архитектуры) они "выстрелили". Пиковыми TOPSами в обществе в 2023г как-то уже меряться неприлично, всем подавай реальный коэффициент утилизации на конкретной задаче.
PS: Если у вас есть инсайт, то с удовольствием бы послушал - может действительно ветер сменился и пора расчехлять синтезатор.
triller599 Автор
20.09.2023 10:07а что и ради чего оптимизируем - как-то упущено.
Странно, я вроде на этом как раз и делал акцент.
Сколько GPT обучается? 3 недели, месяц? А если бы она обучалась, скажем, за 2 дня - это ли не картбланш? Для ОпенАИ может и нет, а вот для догоняющих очень даже!
TOPSами мерятся действительно толку нету, но я о них и не говорил. Если Вы имеете ввиду цифры скорости потоков - то они имеют сугубо практическое значение.
А производительность считается просто(в конце статьи пример). Для обработки изображений: (пикселей в картинке / 4) * картинок в 1 эпохе * на количество эпох * (3.333пс период рабочей частоты)
Для "внимания" ещё не могу сказать, к сожалению.iDoka
20.09.2023 10:07+1Благодарю за развёрнутый ответ.
"Сокращение времени обучения в N раз" - процедура не бесплатная, более того имеющая какой-то запас масштабируемости в рамках уже используемого железа/подхода при увеличении стоимости железа в M раз.
Т.о. вопросы (от эксплуатантов этой инфраструктуры) остаются прежними при выборе/сравнении GPU vs FPGA:
при единоразовой трате на оборудование в Х рублей сколько обученных ИНС можно получить в год/месяц/день?
какие эксплуатационные расходы необходимы для получения одной обученной ИНС на этом оборудовании?
И даже если на графиках GPU vs FPGA (X/Y: time/$) FPGA где-то догонит и перегонит GPU, то это может быть очень большой срок, который врядли устроит эксплуатантов (и склонит их выбор в сторону FPGA). А если они не готовы платить, то уже имеем то, что имеем: "общее низкое число специалистов, слабое сообщество, бесконечная сложность написания кода по сравнению с PyTorch". Рыночек порешал, как говорится.
triller599 Автор
20.09.2023 10:07Это верно для средних сетей.
Для передовых сколько ни плати - не получишь ускорения. Решения просто не существует! Все мои рассуждения именно про этот случай: качественно ускорить обучение там, где пока это сделать нечем.
Tomikaji
20.09.2023 10:07не нашел reti_neurali_base_0828 в репозитории, гляньте если не сложно
triller599 Автор
20.09.2023 10:07+1Вы правы, его нету. В REDME написал, что выложу 21 вечером. Вношу изменения для более контрастных результатов.
Извините, первая статья, в инструкции Хабра для публикации сказано, что одобрение статьи из песочницы занимает от 2-х дней - думал успею !
Anatol_1962
20.09.2023 10:07Интересно, а на вскидку, какие ресурсы должен иметь автономный агробот для распознавания колорадского жука, личинок, сорняков (чтобы их чикнуть) ?
triller599 Автор
20.09.2023 10:07Извините, я пока далёк от практики "в поле" )
А чем CUDA не устраивает?
Arqwer
20.09.2023 10:07Обычно используют nvidia xavier или мощную видеокарту, как например nvidia 3080. Вообще, автономному роботу может понадобиться параллельно ещё делать другие расчёты, как, например, планировать маршрут, определять собственное положение в пространстве, поэтому может понадобиться параллельно использовать несколько нейросетей одновременно. У Xavier на это мощности хватит.
uhf
20.09.2023 10:07Зависит от требуемой скорости и площади обзора, но вполне адекватные. Думаю, сложнее будет задача "чикнуть", не лазером же это делать )
aol-nnov
20.09.2023 10:07не лазером же это делать
Вы будете удивлены ;) уже давно натыкался на какую-то статью зарубежную, там было то ли рыбное хозяйство, то ли еще что-то подводное, но в акватории реального водоема, и вот, если в садок с "разводимым материалом" (уж не помню, чего они там разводили, а ссылку найти не могу - пусть будут рыбы) проникал вредитель и начинал их жрать, комплюктерные методы детектировали ситуацию, получаемую с систем видеонаблюдения и делали лазером пиу-пиу. Даже видосик был в той статье. Выглядит футуристично.
Anatol_1962
20.09.2023 10:07(triller599) Интересно, разработчики "далеки от практики "в поле" или оборудование не дозрело ? (автономный - это без связи и размером с собачку)
old_bear
20.09.2023 10:07+3Если обучать нейросеть на рассмотренной системе из нескольких FPGA на частоте ядра 300 МГц изображениями 640х640 и подавать на вход алгоритма 4 пикселя за такт, то для прогона 1 млн изображений необходимо около 6 минут.
Признаться я прочитал статью несколько по диагонали, особенно после упоминания обучения на целочисленной математике. Но вот это утверждение в конце вызывает у меня явное недоумение.
Вы правда думаете, что самым узким местом в этой системе будут входныеактивацииданные, а не все тевесапараметры, которые вам надо обновлять на каждом шаге? Я уже не говорю про один или более моментов на каждый параметр, если для обучения используется какой-нить Adam.Кстати, ваша "стандартная свёрточная нейросеть" включает batch normalization или какие-то другие слои подразумевающие несколько проходов по всем данным batch-а при прямом и/или обратном распространении? Какая функция ошибок предполагается к использованию?
Моё общее впечатление, что вы выбрали довольно удобный частный случай и сделанные на его основе предположения лёгким движением руки прикладываете к намного более широкому кругу задач. Вот только всякие милые частности, которые так любят придумывать разработчики нейросетей в полном отрыве от проблем их вычислительной сложности, могут запросто порушить вашу архитектуру.
Ну и в качестве вишенки на торте. Даже если вы внезапно разработаете аппаратную часть этого проекта, не забудьте прибавить ещё два раза по столько же человеко-часов недешёвых программистов, которые будут сращивать её со всякими там TensorFlow, PyTorch и что там ещё нынче модно из framework-ов. Потому что, как вы правильно заметили в статье, разработчикам нейросетей не нужны эти ваши железки, им нужно готовое решение которое по нажатию одной кнопки будет проглатывать их свежее творение в tf, pt или ещё каком-нить модном формате, запускать его обучение выдавая в процессе понятные этим разработчикам графики и циферблаты, и возвращать результат упакованный в тот же модный формат. И к этим два раза по столько человеко-часов не забудьте прибавить ещё неопределённое количество на поддержку всё новых версий и вариантов этих framework-ов.
Это всё я вам пишу как человек, который работает в компании занимающейся NN-ускорителями, где большая часть инженеров - это таки программисты а не железячники. И это вовсе не потому что начальство программистов больше любит...triller599 Автор
20.09.2023 10:07Отличный комментарий, спасибо!
Ну и в качестве вишенки на торте. Даже если вы внезапно разработаете аппаратную часть этого проекта, не забудьте прибавить ещё два раза по столько же человеко-часов недешёвых программистов, которые будут сращивать её со всякими там TensorFlow, PyTorch
Вот по-диагонали прочитали, отсюда и вопрос. Я чётко указал, что без участия вендоров проблему широкого распространения и простого использования не решить. Они, кстати, вкладывают приличные деньги в развитие, но как я уже высказал в статье, по-моему не туда.
им нужно готовое решение которое по нажатию одной кнопки будет проглатывать их свежее творение в tf, pt или ещё каком-нить модном формате, запускать его обучение выдавая в процессе понятные этим разработчикам графики и циферблаты, и возвращать результат упакованный в тот же модный формат.
Я не согласен. "Модные циферблаты" нужны IT-отделам банков и прочим, потому, что иметь IT отдел модно. А в результате работы всё равно наверху никто толком не разберётся.
Работающий и зависящий от результата инженер не будет загонять свой "полёт фантазии(ваши слова)" в видеокарту и ждать сутки. Он будет думать сутки - а вот проверить хотел бы за полчаса. Чтобы дальше думать.
triller599 Автор
20.09.2023 10:07Моё общее впечатление, что вы выбрали довольно удобный частный случай
Я выбрал для себя наиболее понятный и наглядный вариант. А самое важное - тот, который могу в одиночку реализовать. Если будет возможность, я приделаю «внимание» - тогда всё станет гораздо понятнее.
Кстати, ваша "стандартная свёрточная нейросеть" включает batch normalization или какие-то другие слои подразумевающие несколько проходов
Извините, но Ваши рассуждения мне кажутся именно «модными». Сделать всё стандартно и пусть железо тянет. В моей реализации нет нормализации, но их существует уже с десяток разных и некоторые вполне хорошо должны лечь на архитектуру ПЛИС.
Батч-нормализация, float-ы, да даже softmax – плоды ограничений существующей доминирующей архитектуры. А ещё подхода «не думать!» Я использую пороги в качестве ошибки, но и softmax с определённой точностью нормально ложится на ПЛИС — есть алгоритмы. Если вопрос именно в этом.
особенно после упоминания обучения на целочисленной математике
Снова «стандарт» Хотя, если Вы разработчик ускорителей, то Вас и должны интересовать модные инженеры с деньгами, и думать Вы должны с их точки зрения. Я это понимаю.
В то же время считаю, что float – вообще зло! Моя практика показывает, что важно, насколько точно можно подстраивать веса при обратном распространении а не абсолютный динамический диапазон. Ведь смысл float именно в возможности представить и очень большие, и очень маленькие значения.. приблизительно! А что будет, если для float16(для наглядности примера) к числу 2048 прибавить 1? А ничего, оно не изменится. То же самое верно и для чисел меньше 1. С обучением сети веса начинают изменятся всё меньше и меньше и в какой то момент большая часть начинает «терять» ошибку и наблюдается рост lossa. Я это видел благодаря int очень чётко, а вот многие этого даже не поняли — благодарности float.
И моё ИМХО таково, что батч-нормализация существует отнюдь не для выравнивания мат ожидания и дисперсии, а чтобы сузить динамический диапазон значений. Ведь существует dropout, а при нём вообще каждое новое данное имеет своё мат ожидание и дисперсию — и ничего, работает как-то.
Хотя эта тема для отдельной статьи после накопления материала. Ну или нет, если мои рассуждения — глупости))В целом пока, конечно, можно сказать, что ты «оторван от реальности» и мне с этим будет спорить сложно, но лично я реализовав на практике чесную конвейерную нейросеть с ростом масштаба предвижу потенциальные проблемы с потоками а не с параметрами
triller599 Автор
20.09.2023 10:07Если обучать нейросеть на рассмотренной системе из нескольких FPGA на частоте ядра 300 МГц изображениями 640х640 и подавать на вход алгоритма 4 пикселя за такт, то для прогона 1 млн изображений необходимо около 6 минут.
Скажите пожалуйста, это по-Вашему много или мало? Раз уж Вы отреагировали именно на эту фразу. Мне это важно.
kasiopei
Интереснее обученную сеть в ПЛИС погонять
triller599 Автор
Согласен, развлекаться интереснее, чем работать ))
Если правда интересно и есть минимальные компетенции в ПЛИС, что погонять вполне реально. Вот, к примеру, из нового - проект выиграл конкурс https://github.com/ptoupas/amd-open-hardware-23
Да и вообще, в плане запустить на 1 плате вендоры стараются. Мне это не интересно, но насколько знаю, контента полно и маршрут известен. Поищите информацию от производителей.