Transcript
00:00:00Это языковая модель на 28,9 миллиона параметров, которая генерирует текст прямо сейчас по одному слову
00:00:08на чипе стоимостью около восьми долларов. Здесь нет Wi-Fi, ничего не отправляется на сервер,
00:00:14всё происходит внутри ESP32S3 — микроконтроллера, у которого оперативной памяти меньше, чем у компьютера
00:00:22из 90-х. Это безумие. Как это вообще возможно? В чём магия и как
00:00:29нам собрать что-то подобное? Отличные вопросы, и мы разберём их в сегодняшнем
00:00:34видео. Будет очень интересно, так что погружаемся! Итак, чип ESP32S3 даёт вам
00:00:46512 килобайт SRAM — это объём быстрой памяти, с которой чип может вычислять. Обычно,
00:00:54если вы попытаетесь запустить на нём LLM, вся модель должна помещаться именно туда.
00:01:00Предыдущая языковая модель, которую запускали на таком чипе, превосходила максимум 260 000 параметров. А эта
00:01:08вмещает примерно в 110 раз больше, и человек, который это сделал — украинский разработчик Слава С. Так
00:01:16в чём же фокус? Как это удалось? Как уместили модель на 28,9 миллиона параметров в чип за 8 долларов?
00:01:24Решение взято из идеи, которую Google использовала в Gemma. Это называется эмбеддингами для каждого слоя. Большая часть
00:01:31параметров языковой модели ничего не вычисляет. Они просто сидят в таблице эмбеддингов, из которой считываются данные.
00:01:37Если к большинству параметров обращаются только для чтения, им не нужна быстрая память. Поэтому можно
00:01:44оставить эту таблицу в медленной и дешёвой флеш-памяти и извлекать только те строки, которые нужны текущему токену. А
00:01:52небольшая часть, которая реально вычисляет и «думает» над следующим токеном — блочный механизм внимания и feed forward — остаётся в SRAM.
00:01:59Хорошо, с вычислениями разобрались. Но остаётся вопрос: как уместить такую большую модель в такой крошечный чип?
00:02:05Итак, таблица на 25 миллионов строк живет во флеш-памяти. И это самая большая часть
00:02:12из всех 28,9 миллиона параметров модели. А флеш-память на этом чипе дешёвая и огромная — её тут целых 16 мегабайт.
00:02:20Поэтому вместо попыток запихнуть эту таблицу в те же 512 килобайт SRAM,
00:02:26она просто лежит во флеш-памяти. Мы извлекаем из неё около шести строк — по одной на каждый из шести слоёв модели.
00:02:33В сумме это примерно 450 байт. Рано радоваться: я должен сразу сказать, что
00:02:40это очень простая и примитивная модель. Это вам не привычная GPT-подобная LLM. Она не станет писать
00:02:47код или отвечать на сложные вопросы. Ведь если обучать обычную модель такого размера
00:02:53на стандартном датасете, 28 миллионов параметров выдадут лишь бессмыслицу. Но эта модель обучена на
00:03:01Tiny Stories — датасете от исследователей из Microsoft, написанном намеренно настолько просто,
00:03:08что даже крошечная модель на пару миллионов параметров может научиться связно генерировать тексты. А запуск на чистом C,
00:03:15на чипе без операционной системы и без интерпретатора Python — эта идея взята из знаменитого проекта
00:03:22Андрея Карпатого Llama2.c, который показал, что можно обучить небольшую языковую модель и выполнять
00:03:28инференс, используя всего пару сотен строк портативного кода на C. И именно эта концепция лежит в основе
00:03:35всего проекта. Без Карпатого это, скорее всего, было бы невозможно. Вот так всё работает в двух
00:03:40словах. Теперь давайте попробуем собрать всё сами и запустить на чипе, чтобы оценить производительность.
00:03:47Чтобы собрать это самостоятельно, вам сначала понадобится правильное железо, а именно ESP32S3
00:03:54с 16 мегабайтами флеш-памяти и 8 мегабайтами PSRAM. Это вариант N16R8. И это действительно
00:04:03важно, ведь помните, мы говорили о таблице на 25 миллионов строк во флеш-памяти? Сам по себе,
00:04:10после обучения и экспорта, этот файл занимает около 15 мегабайт. А платы с 4 или 8 мегабайтами флеш-памяти
00:04:17его просто не вместят. Так что если будете покупать плату для этого эксперимента, это первая
00:04:22характеристика, которую нужно проверить. Когда я впервые изучил оригинальную инструкцию проекта, настройка была разбросана
00:04:28по нескольким файлам и предполагала наличие контекста, которого у меня изначально не было. Поэтому
00:04:34вместо того чтобы повторять всё шаг в шаг, я сделал один универсальный скрипт, который делает
00:04:40абсолютно всё. Проверяет плату, устанавливает тулчейн, готовит данные, обучает, экспортирует, проверяет,
00:04:47компилирует и прошивает за один заход. Давайте запустим этот скрипт. Небольшое предупреждение:
00:04:55если повторяете за мной, весь скрипт занимает около 25 минут. Впрочем, примерно столько же
00:05:00ушло бы и при пошаговом ручном выполнении. Всё потому, что там много отдельных
00:05:05команд, за которыми нужно следить. А основная часть времени уходит на обучение модели Tiny Stories.
00:05:11На моём MacBook это занимает порядка 13 минут. По завершении обучения светодиоды на плате
00:05:18начнут мигать. Это знак того, что сейчас будет загружаться модель. И как только она загрузится,
00:05:24мы увидим первый базовый пример истории про маленькую девочку. И правда,
00:05:29мы получаем свои девять токенов в секунду. Но вы заметите, что в определённый момент
00:05:33история начнётся заново. То есть модель уходит в своего рода цикл. И если вы хотите
00:05:39задать собственный промпт, я также включил пример скрипта для запуска ваших собственных
00:05:44промптов. Давайте для примера начнём историю про робота. Замечу ещё кое-что: если вы
00:05:50меняете промпт, придется заново прошивать ESP32. Это ограничение данного метода:
00:05:56он может воспроизводить только один предварительно зашитый промпт за раз. Как видите,
00:06:02в истории действительно упоминается робот. И сама история на этот раз немного отличается.
00:06:08Но посмотрите, что происходит после конца абзаца: мы снова возвращаемся к истории про маленькую
00:06:13девочку. Понятия не имею, почему так происходит, но модель явно стремится съехать к той самой
00:06:19истории о девочке. Давайте сделаем ещё один тест. На этот раз возьмём
00:06:24знаменитую фразу, которая стоит в самом начале каждого фильма «Звёздные войны», и посмотрим,
00:06:30к чему это приведет. Любопытный результат: видно, что модель тут же сбивается на
00:06:36повествование о маленькой девочке. Полагаю, модель такого размера даже не понимает,
00:06:42что такое галактика. Наверное, поэтому в данном случае она игнорирует наш промпт. И
00:06:47снова следующий абзац начинается с той же истории. Так что, хотя эксперимент
00:06:53впечатляет, и генерация девяти токенов в секунду на микроконтроллере взрывает мозг,
00:06:59это всё ещё очень ограниченная концептуальная демонстрация. Что бы вы ни спросили, модель
00:07:06всегда будет скатываться к рассказу сказок, потому что обучена именно на этом. Но если тест показался
00:07:11вам интересным, у меня есть другое похожее видео, где я проверял, может ли Raspberry Pi
00:07:18первого поколения запустить полноценную LLM локально. Посмотрите его, если любопытно. Вот
00:07:24и всё, друзья. Вот так запускается языковая модель на 28,9 миллиона параметров на чипе ESP32. Мы её
00:07:32протестировали, она работает. Респект Славе за создание проекта. А что вы думаете об этом эксперименте?
00:07:38Видите ли вы реальные сценарии применения такой реализации? Поделитесь своим
00:07:43мнением в комментариях ниже. И если вам нравятся такие технические разборы,
00:07:48ставьте лайки под видео. А также не забудьте
00:07:53подписаться на наш канал. С вами был Андрес из Betterstack, и увидимся в следующих видео!
Community Posts
No posts yet. Be the first to write about this video!
Write about this video