Данная статья ставит себе целью проанализировать причины фактического неиспользования ПЛИС в задачах исследования и обучения нейронных сетей а также предложить концепцию их возможного эффективного применения.

Об авторе: опытный FPGA-разработчик, в последние несколько лет не принимавший участия в промышленной разработке. Наблюдения и выводы основаны на любительском опыте обучения сетей, обзорных статьях и новостях.

Причин исчезающе малого применения FPGA в области обучения нейронных сетей (НС) достаточно. Начиная со стандартных: сложность входа в разработку; громоздкие, медленные и довольно низкокачественные IDE; общее низкое число специалистов и, соответственно, слабое сообщество. И заканчивая специфической — бесконечная сложность написания кода по сравнению с PyTorch.

А во главе всего — отсутствие решающего преимущества, способного перевесить указанные минусы! Зачем, если CUDA+PyTorch лишены этих недостатков, а максимум, который может предложить ПЛИС, это повторить текущие решения?

В такой ситуации стоило бы ждать решительных шагов прежде всего от вендоров.. но этого нет. То награждают на конкурсе реализацию YOLOv5 — "сделали, а что дальше вы намерены делать?"(с), то уходят в новой архитектуре от квази бесшовной, однородной структуры к модульной. Ещё больше всё усложняющей но предоставляющей аж 400(!) ИИ-ядер.

По-настоящему изменить положение вещей могло бы предельное, на порядок и более, ускорение обучения больших НС с использованием ПЛИС. Подобное ускорение можно обеспечить путём параллельных вычислений сразу на многих «кристаллах», используя для передачи информации мощнейший интерконнект в виде высокоскоростных приемопередатчиков (трансиверов) — вещь, о которой почему-то несправедливо забыли.

рис.1 Архитектура
рис.1 Архитектура

В связи с этим была сформулирована следующая задача: реализовать систему конвейерной обработки информации на нескольких FPGA при обучении НС.

Далее речь пойдёт о том, что может сделать в контексте поставленной задачи 1 инженер, 1 средняя фирма и, самое главное, мог бы сделать вендор.

1 инженер

Возможности весьма ограничены. Возможно реализовать несколько стандартных слоёв, функций ошибки, протокол взаимодействия с клиентским PC, разместить всё в 1 «кристалле», обучить модель и по результатам оценить перспективы. Что и было сделано.

рис.2 Потоки данных
рис.2 Потоки данных

Для большей предметности была написана стандартная свёрточная нейросеть, тестируемая на Кинтекс 7, основная рабочая частота 300 МГц. Микросхема старая но сбалансированная, обеспечивающая двунаправленные 100 Гбит/c как с внешней памятью, так и с «предыдущей» и «последующей» микросхемами.

Данные для обучения загружаются по Ethernet 10G и в обработку поступают по 1 пикселю за такт. Математика целочисленная, 18 бит для весов и 22 для данных между слоями(всё настраиваемое). Веса хранятся в блочной/распределённой памяти. Входной поток подаётся в блок прямого распространения и параллельно записывается в FIFO (DDR3/BRAM) для вычислений при обратном распространении. После пулинга и функции активации поток, если возможно, уплотняется и передаётся в следующий слой простым FIFO — его интерфейс легко переносится на высокоскоростные приемопередатчики, но в текущей реализации они не используются за неимением аппаратного обеспечения.

При обратном распространении происходит синхронизация с вычислениями прямого прохода для совместного использования весовых коэффициентов. После подачи всех данных одного «батча» прямой поток останавливается до завершения обратного распространения и обновления весов(необходимость остановки под вопросом).

По этой причине, а также из-за необходимости обновления динамической памяти, коэффициент заполнения входного потока менее 100%, однако практическое снижение производительности незначительно и не превышает нескольких процентов. Структура вычислительного конвейера формируются из структуры данных в потоках на конкретном слое нейросети для максимального переиспользования ресурсов. SystemVerilog код нейронной сети, модулей взаимодействия с Ethernet, клиентская часть управления на python и эталонная модель на чистом numpy в репозитории. Так как для написания и отладки логики нейросети используется собственный вариант «HLS», то .sv код является «машинописным», однако его воспринимаемость удовлетворительна.

Результат

В результате была подтверждена возможность полностью параллельного высокоскоростного обучения простой нейронной сети и перспективность дальнейшего усложнения до ViT и GPT. Вместе с тем необходимо отметить 2 основных недостатка предложенной архитектуры:

  1. Для Кинтекс 7, как поток в 100 Гбит/с для связи между слоями и с внешней памятью, так и 2000 DSP-блоков не выглядят чем-то значительным даже в рамках 1 слоя по-настоящему большой НС.

Однако в процессе тестирования были обнаружены множество путей для оптимизации. Например, для передачи между слоями не обязательно передавать integer, а достаточно передать «log2(int)» т.е. номер старшего бита и знак. Что сразу сжимает поток в несколько раз и одновременно снимает необходимость в аппаратных умножителях.

Доступно как кратное увеличение скорости расчёта путём подачи 2/4/8 и более пикселей на вход алгоритма за 1 такт при наличии ресурсов, так и прореживание входных данных для пропорционального уменьшения потоков между слоями — вариантов реализации с учётом гибкой природы ПЛИС действительно много.

  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)


  1. kasiopei
    20.09.2023 10:07
    +1

    Интереснее обученную сеть в ПЛИС погонять


    1. triller599 Автор
      20.09.2023 10:07

      Согласен, развлекаться интереснее, чем работать ))

      Если правда интересно и есть минимальные компетенции в ПЛИС, что погонять вполне реально. Вот, к примеру, из нового - проект выиграл конкурс https://github.com/ptoupas/amd-open-hardware-23
      Да и вообще, в плане запустить на 1 плате вендоры стараются. Мне это не интересно, но насколько знаю, контента полно и маршрут известен. Поищите информацию от производителей.


  1. yamifa_1234
    20.09.2023 10:07

    То есть вы хотите сказать что реализовали нейронную сеть на ПЛИС и успешно ее обучили?

    К слову, я за последние пару недель, реализовал масштабируемую нейронную сеть(через параметры задаем число узлов в каждом слое, число слоев, есть возможность внедрения условного рандома весовым коэффициентам при инициализации), эта сеть имеет в себе механизм обучения обратного распространения ошибки. И я на этапе симуляции ее обучаю, в целом успешно(структура нейронной сети 2,3,2,1 - нейронов в каждом слое), но есть ряд проблем: 1.выбор активационной функции, метод обучения(набор данных, накапливать ошибку или после каждого прогона корректировать веса). 2.разрядность констант/данных/коэффициентов (если выбрать слишком большие разрядности то ресурсы съедаются огромные, если выбрать слишком маленькие разрядности то сеть ни когда не сойдется к нулевой ошибке)

    P.S. кстати, если механизм обучения убрать из нейронной сети то она начинает весить в разы меньше, и если сеть с обучением занимает 2-3 ПЛИСы то без обучения она может и в одну влезть, возникает вопрос о сохранении(выгрузки) весовых коэффициентов пользователю, мне кажется этот механизм отъест еще больше ресурсов


  1. azTotMD
    20.09.2023 10:07
    +1

    А какже там всякие Google Coral и прочие, разве там не ПЛИС/ASIC ?


    1. Kristaller486
      20.09.2023 10:07
      +2

      Не ПЛИС, но ASIC


  1. iDoka
    20.09.2023 10:07
    +2

    А во главе всего — отсутствие решающего преимущества

    В начале статьи очень много рассуждений об абстрактных преимуществах и недостатках обучения ИНС на том или ином железе, но потом почему-то сразу резкий переход на обсуждение конкретных имплементаций в ПЛИС, а что и ради чего оптимизируем - как-то упущено.

    В капиталистическом обществе эксплуатантов интересуют только две вещи: CapEx & OpEx. Лично я не вижу у ПЛИС для задачи обучения ИНС какого-то картбаланша, чтобы при удачном стечении обстоятельств (имплементации какой-либо супер-мега-архитектуры) они "выстрелили". Пиковыми TOPSами в обществе в 2023г как-то уже меряться неприлично, всем подавай реальный коэффициент утилизации на конкретной задаче.

    PS: Если у вас есть инсайт, то с удовольствием бы послушал - может действительно ветер сменился и пора расчехлять синтезатор.


    1. triller599 Автор
      20.09.2023 10:07

      а что и ради чего оптимизируем - как-то упущено.

      Странно, я вроде на этом как раз и делал акцент.
      Сколько GPT обучается? 3 недели, месяц? А если бы она обучалась, скажем, за 2 дня - это ли не картбланш? Для ОпенАИ может и нет, а вот для догоняющих очень даже!
      TOPSами мерятся действительно толку нету, но я о них и не говорил. Если Вы имеете ввиду цифры скорости потоков - то они имеют сугубо практическое значение.
      А производительность считается просто(в конце статьи пример). Для обработки изображений: (пикселей в картинке / 4) * картинок в 1 эпохе * на количество эпох * (3.333пс период рабочей частоты)
      Для "внимания" ещё не могу сказать, к сожалению.


      1. iDoka
        20.09.2023 10:07
        +1

        Благодарю за развёрнутый ответ.

        "Сокращение времени обучения в N раз" - процедура не бесплатная, более того имеющая какой-то запас масштабируемости в рамках уже используемого железа/подхода при увеличении стоимости железа в M раз.

        Т.о. вопросы (от эксплуатантов этой инфраструктуры) остаются прежними при выборе/сравнении GPU vs FPGA:

        1. при единоразовой трате на оборудование в Х рублей сколько обученных ИНС можно получить в год/месяц/день?

        2. какие эксплуатационные расходы необходимы для получения одной обученной ИНС на этом оборудовании?

        И даже если на графиках GPU vs FPGA (X/Y: time/$) FPGA где-то догонит и перегонит GPU, то это может быть очень большой срок, который врядли устроит эксплуатантов (и склонит их выбор в сторону FPGA). А если они не готовы платить, то уже имеем то, что имеем: "общее низкое число специалистов, слабое сообщество, бесконечная сложность написания кода по сравнению с PyTorch". Рыночек порешал, как говорится.


        1. triller599 Автор
          20.09.2023 10:07

          Это верно для средних сетей.
          Для передовых сколько ни плати - не получишь ускорения. Решения просто не существует! Все мои рассуждения именно про этот случай: качественно ускорить обучение там, где пока это сделать нечем.


  1. Tomikaji
    20.09.2023 10:07

    не нашел reti_neurali_base_0828 в репозитории, гляньте если не сложно


    1. triller599 Автор
      20.09.2023 10:07
      +1

      Вы правы, его нету. В REDME написал, что выложу 21 вечером. Вношу изменения для более контрастных результатов.
      Извините, первая статья, в инструкции Хабра для публикации сказано, что одобрение статьи из песочницы занимает от 2-х дней - думал успею !


  1. Anatol_1962
    20.09.2023 10:07

    Интересно, а на вскидку, какие ресурсы должен иметь автономный агробот для распознавания колорадского жука, личинок, сорняков (чтобы их чикнуть) ?


    1. triller599 Автор
      20.09.2023 10:07

      Извините, я пока далёк от практики "в поле" )
      А чем CUDA не устраивает?


    1. Arqwer
      20.09.2023 10:07

      Обычно используют nvidia xavier или мощную видеокарту, как например nvidia 3080. Вообще, автономному роботу может понадобиться параллельно ещё делать другие расчёты, как, например, планировать маршрут, определять собственное положение в пространстве, поэтому может понадобиться параллельно использовать несколько нейросетей одновременно. У Xavier на это мощности хватит.


    1. uhf
      20.09.2023 10:07

      Зависит от требуемой скорости и площади обзора, но вполне адекватные. Думаю, сложнее будет задача "чикнуть", не лазером же это делать )


      1. aol-nnov
        20.09.2023 10:07

        не лазером же это делать

        Вы будете удивлены ;) уже давно натыкался на какую-то статью зарубежную, там было то ли рыбное хозяйство, то ли еще что-то подводное, но в акватории реального водоема, и вот, если в садок с "разводимым материалом" (уж не помню, чего они там разводили, а ссылку найти не могу - пусть будут рыбы) проникал вредитель и начинал их жрать, комплюктерные методы детектировали ситуацию, получаемую с систем видеонаблюдения и делали лазером пиу-пиу. Даже видосик был в той статье. Выглядит футуристично.


    1. Anatol_1962
      20.09.2023 10:07

      (triller599) Интересно, разработчики "далеки от практики "в поле" или оборудование не дозрело ? (автономный - это без связи и размером с собачку)


  1. 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-ускорителями, где большая часть инженеров - это таки программисты а не железячники. И это вовсе не потому что начальство программистов больше любит...


    1. triller599 Автор
      20.09.2023 10:07

      Отличный комментарий, спасибо!

      Ну и в качестве вишенки на торте. Даже если вы внезапно разработаете аппаратную часть этого проекта, не забудьте прибавить ещё два раза по столько же человеко-часов недешёвых программистов, которые будут сращивать её со всякими там TensorFlow, PyTorch

      Вот по-диагонали прочитали, отсюда и вопрос. Я чётко указал, что без участия вендоров проблему широкого распространения и простого использования не решить. Они, кстати, вкладывают приличные деньги в развитие, но как я уже высказал в статье, по-моему не туда.

      им нужно готовое решение которое по нажатию одной кнопки будет проглатывать их свежее творение в tf, pt или ещё каком-нить модном формате, запускать его обучение выдавая в процессе понятные этим разработчикам графики и циферблаты, и возвращать результат упакованный в тот же модный формат.

      Я не согласен. "Модные циферблаты" нужны IT-отделам банков и прочим, потому, что иметь IT отдел модно. А в результате работы всё равно наверху никто толком не разберётся.

      Работающий и зависящий от результата инженер не будет загонять свой "полёт фантазии(ваши слова)" в видеокарту и ждать сутки. Он будет думать сутки - а вот проверить хотел бы за полчаса. Чтобы дальше думать.


    1. triller599 Автор
      20.09.2023 10:07

      Моё общее впечатление, что вы выбрали довольно удобный частный случай

      Я выбрал для себя наиболее понятный и наглядный вариант. А самое важное - тот, который могу в одиночку реализовать. Если будет возможность, я приделаю «внимание» - тогда всё станет гораздо понятнее.

      Кстати, ваша "стандартная свёрточная нейросеть" включает batch normalization или какие-то другие слои подразумевающие несколько проходов

      Извините, но Ваши рассуждения мне кажутся именно «модными». Сделать всё стандартно и пусть железо тянет. В моей реализации нет нормализации, но их существует уже с десяток разных и некоторые вполне хорошо должны лечь на архитектуру ПЛИС.

      Батч-нормализация, float-ы, да даже softmax – плоды ограничений существующей доминирующей архитектуры. А ещё подхода «не думать!» Я использую пороги в качестве ошибки, но и softmax с определённой точностью нормально ложится на ПЛИС — есть алгоритмы. Если вопрос именно в этом.

      особенно после упоминания обучения на целочисленной математике

      Снова «стандарт» Хотя, если Вы разработчик ускорителей, то Вас и должны интересовать модные инженеры с деньгами, и думать Вы должны с их точки зрения. Я это понимаю.
      В то же время считаю, что float – вообще зло! Моя практика показывает, что важно, насколько точно можно подстраивать веса при обратном распространении а не абсолютный динамический диапазон. Ведь смысл float именно в возможности представить и очень большие, и очень маленькие значения.. приблизительно! А что будет, если для float16(для наглядности примера) к числу 2048 прибавить 1? А ничего, оно не изменится. То же самое верно и для чисел меньше 1. С обучением сети веса начинают изменятся всё меньше и меньше и в какой то момент большая часть начинает «терять» ошибку и наблюдается рост lossa. Я это видел благодаря int очень чётко, а вот многие этого даже не поняли — благодарности float.
      И моё ИМХО таково, что батч-нормализация существует отнюдь не для выравнивания мат ожидания и дисперсии, а чтобы сузить динамический диапазон значений. Ведь существует dropout, а при нём вообще каждое новое данное имеет своё мат ожидание и дисперсию — и ничего, работает как-то.
      Хотя эта тема для отдельной статьи после накопления материала. Ну или нет, если мои рассуждения — глупости))

      В целом пока, конечно, можно сказать, что ты «оторван от реальности» и мне с этим будет спорить сложно, но лично я реализовав на практике чесную конвейерную нейросеть с ростом масштаба предвижу потенциальные проблемы с потоками а не с параметрами


    1. triller599 Автор
      20.09.2023 10:07

      Если обучать нейросеть на рассмотренной системе из нескольких FPGA на частоте ядра 300 МГц изображениями 640х640 и подавать на вход алгоритма 4 пикселя за такт, то для прогона 1 млн изображений необходимо около 6 минут. 

      Скажите пожалуйста, это по-Вашему много или мало? Раз уж Вы отреагировали именно на эту фразу. Мне это важно.