This $8 Microcontroller Is Running a Language Model Locally!

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, и увидимся в следующих видео!

Description

A developer got a 28.9-million-parameter language model running entirely offline on an $8 ESP32-S3 microcontroller, a chip with just 512KB of RAM, using a memory trick borrowed from Google's Gemma architecture called Per-Layer Embeddings. In this video we break down how the trick actually works, reproduce the entire training and flashing process ourselves from a bare board, and put the model through some prompt tests of our own, including one it stubbornly refuses to follow. If you're curious how far you can push AI onto hardware that was never meant to run it, this one's for you. 🔗 Relevant Links Esp32-ai: https://github.com/slvDev/esp32-ai build_and_flash.sh: https://gist.github.com/andrisgauracs/ce459630660f82cf4ca7e43aa81604c7 run_prompt.sh: https://gist.github.com/andrisgauracs/e84b842d0f5e301485ecbf6654b0838e ❤️ More about us Radically better observability stack: https://betterstack.com/ Written tutorials: https://betterstack.com/community/ Example projects: https://github.com/BetterStackHQ 📱 Socials Twitter: https://twitter.com/betterstackhq Instagram: https://www.instagram.com/betterstackhq/ TikTok: https://www.tiktok.com/@betterstack LinkedIn: https://www.linkedin.com/company/betterstack 📌 Chapters: 00:00 Running an LLM on an $8 Chip 00:43 The ESP32’s Memory Problem 01:12 How Did They Make It Work? 01:30 The Per-Layer Embedding Trick 02:04 Fitting 28.9 Million Parameters 02:36 What This Tiny LLM Can Actually Do 02:58 TinyStories and Karpathy’s llama2.c 03:41 Building It Ourselves 03:47 Choosing the Right ESP32 04:23 The One-Shot Installation Script 04:52 Training and Flashing the Model 05:24 Testing the LLM at 9 Tokens per Second 05:38 Trying Custom Prompts 06:21 The Star Wars Prompt Test 06:51 Is an ESP32 LLM Actually Useful? 07:23 Final Thoughts

Community Posts

No posts yet. Be the first to write about this video!

Write about this video