Мы используем файлы cookie, чтобы сайт работал и становился удобнее. Продолжая пользоваться «Думайте», вы соглашаетесь с Политикой конфиденциальности.

показать все результаты

Ничего не найдено

Я запустил ИИ на устройстве с 512 килобайтами памяти

1 нед. назад авторская
120 22 8 мин

Есть у меня M5Stack Cardputer — штука размером чуть больше банковской карты, с крошечной английской QWERTY-клавиатурой и экраном, на котором помещается примерно один твит. После истории с Heroes of Might and Magic III на нём мне стало скучно просто играть — захотелось, чтобы эта штука хоть немного со мной разговаривала. Не Алиса, не ChatGPT — просто чтобы напечатал фразу, а в ответ на экране появилось что-то осмысленное, а не тишина.

Звучит несложно, пока не открываешь даташит. Внутри Cardputer стоит чип ESP32-S3 — это такой маленький процессор, который обычно ставят в умные лампочки, роутеры, кофеварки и прочую мелкую электронику: два ядра, частота до 240 МГц. А памяти на всё устройство — 512 килобайт оперативной и 8 мегабайт постоянной. Для сравнения — это в тысячи раз меньше, чем в обычном ноутбуке или телефоне. Так что готового решения, которое можно было бы просто скачать и запустить, не было — пришлось всё писать под эти рамки самому.

Ввод я решил делать транслитом — клавиатура-то английская, куда деваться. А вот вывод — кириллицей, благо шрифт U8g2 поддерживает её из коробки.

Развилка

Дальше был момент, когда я реально не понимал, что выстрелит. Есть два принципиально разных способа сделать так, чтобы устройство «отвечало»: либо честно распознавать, о чём тебя спрашивают, и подставлять заранее написанный ответ, либо по-настоящему сочинять текст буква за буквой, как это делают все нормальные языковые модели. Я решил не выбирать, а сделать оба, вообще никак их не связывая между собой — чтобы если один не взлетит, был запасной.

Назвал их для себя просто: путь 1 — классификатор с заготовленными ответами, и путь 2 — своя маленькая генеративная модель.

Путь 1: работает, и это не магия

Здесь никакого «сочинения текста» нет вообще, и это специально. Схема такая: фраза пользователя превращается в набор чисел через маленькую обученную программу, которая режет слова не целиком, а на кусочки букв — именно поэтому она нормально переживает транслит и опечатки. Дальше этот набор чисел сравнивается с 37 заранее размеченными темами разговора — плюс отдельная тема «не понял». Берётся ближайшая по смыслу тема, и оттуда достаётся один из нескольких вариантов ответа, которые писал я сам, а не программа, поэтому они всегда грамотные.

Тем было 18 в самом начале, к финалу выросло до 37 — по ходу тестирования постоянно всплывали фразы, которые никуда не попадали, и приходилось добавлять новую категорию. Модель получилась совсем небольшая, из памяти устройства съедает всего 7% оперативки и 18.8% постоянной памяти. На придуманных заново фразах, которых не было в обучении, точность держится в районе 95-100%.

Вот как это выглядит вживую — на тех же трёх фразах, на которых я дальше буду проверять путь 2:

  • 'privet' -> 'привет! рад тебя слышать'

  • 'kak dela' -> 'да норм, а у тебя как?'

  • 'skuchno' -> 'понимаю, скучно — это неприятно. может поболтаем?'

Это заранее заготовленные варианты ответов, которые я сам придумал и написал — модель их не сочиняет на лету, а просто выбирает подходящий. Главное тут не это, а то, что код каждый раз верно распознавал, о чём вообще речь, и подбирал подходящий вариант из нескольких — а не просто угадывал наугад.

И тут начинается самое интересное — то, что на бумаге не предугадаешь.

Я как-то решил, что раз модель работает хорошо, надо сделать её «ещё умнее» — увеличил её размер в два раза, дал ей больше «ячеек» для запоминания. Точность на новых фразах вместо роста упала с 95% до 89%. По факту модель начала просто зазубривать примеры, которые видела на обучении, вместо того чтобы понимать смысл фразы — как ученик, который выучил ответы на конкретные вопросы наизусть, а на чуть другой вопрос теряется. Пришлось откатить обратно. Причём проверил это трижды, потому что не поверил с первого раза — казалось же логичным, что больше = умнее. Оказалось, для такой задачи решает не размер модели, а качество и количество данных, на которых она учится.

Второе — уверенность модели вообще ничего не говорит о том, права она или нет. Сначала «не понял» я определял через порог: если модель не уверена больше чем на такой-то процент — считаем, что не поняла. А потом заметил, что модель может быть уверена на 100% и при этом ошибаться в лоб — механизм, который считает эту уверенность, не умеет сам себя перепроверять. Пришлось переделать «мимо темы» в полноценную отдельную тему со своими примерами, а не в порог сверху.

А ещё вживую всплыли вещи, которые я вообще не ожидал. Фраза «а ты что делаешь» вместо «ты что делаешь» — казалось бы, одно и то же — заметно сбивает модель, просто из-за одного лишнего слова впереди. «Ты кто?» вместо «кто ты?» вообще может увести в другую тему. А на коротких фразах любая опечатка резко роняет точность — там и так мало за что зацепиться.

Путь 2: честно, без прикрас

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

Внутри — небольшая нейросеть с 271 488 настраиваемыми параметрами, которая учится предсказывать, какой кусочек текста должен идти следующим. Данные я собрал из открытых сборников русскоязычных диалогов, почистил от мата и мусора, сбалансировал по темам, чтобы модель не начала говорить как книга. Получилось около 300 тысяч пар «реплика → ответ» — примерно 44 миллиона кусочков текста. Обучение заняло 4 полных прохода по всем данным — около 5.3 часа на обычном ноутбуке без видеокарты.

Во время обучения я следил за loss — это число, которое показывает, насколько сильно модель промахивается мимо правильного ответа на каждом шаге; чем оно ниже, тем лучше модель предсказывает. Он падал уверенно и без единого срыва: 7.00 → 6.08 → 4.61 → 4.26 → 4.07. Значит, весь процесс работает как надо.

А вот связной речи демо-версия не дала — и не должна была. Русский язык — с его окончаниями, падежами и кучей форм одного и того же слова — для модели такого размера это ожидаемый предел, я знал об этом заранее. Вот что ИИ выдал на самые простые фразы:

  • 'privet' -> 'привет! выдайся иногдаПохождение, все сво'

  • 'kak dela' -> 'привет!начно! да испокой! Ивона'

  • 'skuchno' -> 'принято, что там за разве ты былиться?Мож'

В первом ответе «привет!» — точное попадание, настоящее русское слово в самом начале. А вот в ответе на «kak dela» откуда-то вылезла «Ивона» — скорее всего, потому что в данных оказалось слишком много литературных текстов и маловато обычной разговорной речи, и модель утащила имя из книжки вместо нормального бытового ответа. В целом модель уловила словарь и часть буквенных паттернов, но собрать это в осмысленную фразу пока не по силам. Я делал эту демку не ради результата — а чтобы получить честную точку отсчёта перед тем, как вкладываться серьёзно.

И вот тут хорошая новость: путь 2 скоро перестанет быть демкой. Модель будет куда крупнее — 6.6 миллиона параметров, это почти в 25 раз больше демо-версии и, по сути, потолок того, что вообще способно унести это устройство. Есть только одна загвоздка: по моим подсчётам, если обучать её на том же ноутбуке, это растянется на 2-3 недели. Поэтому пока я просто жду, когда в Крыму дадут свет, чтобы запустить обучение на нормальном мощном ПК, а не тащить его на слабом железе три недели подряд.

Кстати, что не меняется ни в демке, ни в будущей версии на 6.6 миллиона — это память на разговор: модель помнит максимум 128 токенов, это примерно короткий обмен репликами, вопрос и ответ на пару предложений, а не длинный диалог с историей на десяток сообщений назад. Это число не растёт вместе с размером модели — оно упирается в отдельный лимит памяти самого устройства: чтобы не пересчитывать весь разговор заново на каждом слове, модели приходится держать в памяти что-то вроде черновика уже сказанного, и чем он длиннее, тем больше места занимает. Даже при 128 токенах этот черновик пришлось сжимать в четыре раза, чтобы он вообще поместился в память платы. Так что как только разговор выходит за эти 128 токенов, самое старое из него модель просто забывает.

А ещё у меня уже есть задумка, как сделать всё это ещё лучше — пока не буду забегать вперёд, но результат может получиться куда интереснее того, что есть сейчас.

Что я вынес из всего этого

У меня не было готовых примеров под мою плату, только слабенькое устройство и желание, чтобы оно хоть что-то отвечало. Не потому что так удобнее, а потому что в какой-то момент надо просто начинать с тем, что есть, а не с тем, что хотелось бы иметь. Если честно, я специально не стал спешить с выводами — потому что самое любопытное только начинается. Модель на 6.6 миллиона параметров и идея, как сделать всё это умнее, — это уже следующая глава, и я обязательно про неё напишу. Так что это не финал истории, а её начало.

P.S. Кстати, сам Cardputer сейчас остался в Крыму — я уехал к бабушке в Ахтубинск. Так что всё это, по сути, писалось и проверялось прямо на компьютере, без железа под рукой. А ещё честно признаюсь: во всём этом мне сильно помогал Claude Code.

Роман Раевский
Полезность 85%
· +3 высоко оценили
Интересность 85%

Комментарии 6

Войдите, чтобы оставить комментарий.

Комментарий закреплён автором записи
уровень 2 в 1 неделя
Классный опыт. Если получается создавать что-то на слабом или даже микрожелезе, то на мощном уже будут действительно большие возможности. Вот этот момент прошу прояснить по варианту Путь 1: "фраза пользователя превращается в набор чисел через маленькую обученную программу, которая режет слова не целиком, а на кусочки букв" - каким образом система потом по числам примерно понимает направленность темы? Как числа связаны со смыслами? Ведь и длинная и короткая фраза могут относиться к одной теме, а числовой набор будет очень разным?
Полезно
Уместно
уровень 2 в 1 неделя
Подпишусь что бы ни чего не пропустить)
Полезно
Уместно
уровень 2 в 1 неделя
Человек обладает творческим потенциалом в мышлении и смекалке... Ну то есть способен реализовывать то, что ранее считалось "невозможным", находя рабочее решение даже в очень ограниченных условиях... А чтобы развивался творческий потенциал, нужно, как это не странно больше решать и делать самому, вместо того, чтобы делегировать что-то нейронкам, которые думают и решают за человека.
Полезно
Уместно
уровень 2 в 1 неделя
Артём, нейронки - это инструмент. Будут ли они думать и решать за вас или помогать вам принимать более взвешенные решения и быстрее их реализовывать, зависит от вас. Фактор влияния разработчиков/владельцев нейронок и мягкого подталкивания потенциально тоже всегда есть, но он далеко не всеобъемлющ, тем более сейчас, когда эта сфера в активной фазе развития, конкуренции и ещë мало что зарегулировано. Да и если локальные нейросети будут и дальше активно развиваться, то это в значительной степени нивелирует искусственные повестки глобальных игроков.
Полезно
Уместно
уровень 2 в 1 неделя
Дмитрий, Недавно вышла DeepSeek V4 Flash 0731 Она там показывает очень большой прорыв, судя по тестам, по сравнению с просто V4 Flash, и это при том, что модель довольно компактная, она на порядок дешевле и быстрее работает, чем тот же клод опус. (habr.com/ru/news/1066024/) При этом DeepSeek, это открытая модель, то есть еë можно запускать локально... Открытые модели вроде развиваются быстрее, так как они дешевле и как следствие видимо в них накапливается много данных для переобучения.
Полезно
Уместно

Оценить запись

Полезность 85%
· +3 высоко оценили
Интересность 85%

Содержание

Поделиться