bootgpt: нейросеть уместили в загрузочный сектор ПК на 512 байт

bootgpt: нейросеть уместили в загрузочный сектор ПК на 512 байт

На GitHub опубликован проект bootgpt (его показали на Show HN): нейросеть, которая запускается при включении компьютера. Загрузочная запись (MBR), это 512 байт ассемблерного кода, написанного вручную. Она подгружает с диска модель размером 11,5 КБ в формате int8 из следующих 23 секторов и исполняет её в 16-битном реальном режиме на процессоре 386. По словам автора проекта, ни операционной системы, ни среды выполнения C, вообще ничего лишнего нет.

Машина «просыпается и видит во сне» лог загрузки Linux: метки времени, области BAR шины PCI, события ACPI для оборудования, которого никогда не существовало. Качество при контексте в 8 символов и одном скрытом слое примерно такое, как в приведённых примерах: строки похожи на dmesg, но в них много бессмыслицы (например, «ryndrde c4128 6422 Vveine»).

Устройство проекта. Скрипт corpus_gen.py генерирует 3 МБ поддельного dmesg. На одну сессию загрузки берутся одна версия ядра и один диск: реальные логи загрузки повторяются, и именно эта повторяемость позволяет крошечной модели выглядеть вменяемо. Скрипт train.py обучает модель (символьные эмбеддинги, один скрытый слой, softmax) и квантует всё в int8 с масштабами, кратными степени двойки, поэтому загрузочный сектор делает весь прямой проход одними командами imul и единственным idiv. Тот же скрипт симулирует точную целочисленную арифметику ассемблерного кода, включая генератор LCG для выборки, так что вывод на Python и вывод загрузочного сектора можно сравнить построчно; по заявлению автора, они совпадают символ в символ.

Весь рантайм, файл boot.asm: прерывание int 13h загружает веса, int 10h печатает текст, активация softclip считается через cdq/idiv, а следующий символ выбирается по argmax с шумом, инициализированным от таймера. Любое нажатие клавиши перезагружает машину. Загрузочный сектор содержит только код: строки, веса и таблица словаря лежат в секторах данных, иначе вывод и работа с BIOS не помещались в 510 байт.

Собирается проект через nasm, qemu и Python с numpy (build.sh, run.sh). Образ disk.img, обычный загрузочный образ: его можно записать командой dd на USB-флешку и загрузить на любой BIOS-машине, он читает только собственные секторы. Демо-гифка записана скриптом record.py из QEMU без окна, через сокет монитора.

В README автор помещает проект в традицию программ для загрузочного сектора: Оскар Толедо уложил в него шахматы, целую ОС и интерпретатор BASIC, другие, компилятор C, и всё в 512 байтах. Ближайший сосед, sectorllm: настоящий трансформер llama2 (5 слоёв, внимание, всё как положено) из примерно 1,2 КБ ассемблера реального режима, запускающий модель Карпатого stories260K. Ещё есть sectorlisp-nn, где сеть, обученная в TensorFlow, работает при загрузке на интерпретаторе Lisp, и UEFI-приложения, загружающие модели класса llama на современном железе. bootgpt выбирает другую крайность: весь движок помещается в сами 510 байт MBR, а модель, не универсальный рассказчик, а крошечная посимвольная сеть, обученная одному: галлюцинировать лог загрузки той машины, на которой проснулась.

Ключевые факты

  • MBR на 512 байт ручного ассемблера загружает модель int8 размером 11,5 КБ из следующих 23 секторов и исполняет её в 16-битном реальном режиме на 386, без ОС и среды выполнения C.
  • Модель, посимвольная сеть с эмбеддингами, одним скрытым слоем и softmax; обучена на 3 МБ сгенерированного поддельного dmesg и генерирует выдуманный лог загрузки Linux.
  • Квантование в int8 с масштабами-степенями двойки позволяет считать прямой проход командами imul и одним idiv; по заявлению автора, вывод Python-симуляции и загрузочного сектора совпадает символ в символ.
  • Качество скромное: при контексте в 8 символов строки похожи на dmesg, но содержат бессмыслицу; образ disk.img можно записать на USB-флешку и загрузить на машине с BIOS.
  • Ближайший аналог sectorllm запускает настоящий трансформер llama2 (5 слоёв, stories260K) из около 1,2 КБ ассемблера; bootgpt вместо этого умещает весь движок в сам 510-байтный MBR.

Почему это важно

Это не прикладная новость, а технический курьёз в давней традиции программ для загрузочного сектора. Его ценность в наглядности: показано, что нейросеть сводится к целочисленной арифметике, которой хватает крошечного кода и нескольких килобайт весов. Автор сам противопоставляет проект соседям: sectorllm запускает настоящий трансформер, а bootgpt, предельно простую модель, зато с движком целиком в 510 байтах.

Кому это важно

Любителям низкоуровневого программирования, ассемблера x86 и демосцены; тем, кто интересуется квантованием и тем, как устроен прямой проход нейросети без библиотек; энтузиастам старого железа и загрузчиков. Для тех, кто выбирает модели для работы, проект практической пользы не несёт.

Как это применить

Для запуска нужны nasm, qemu и Python с numpy: команды brew install nasm qemu, затем создание виртуального окружения, установка numpy./build.sh и ./run.sh. Готовый образ disk.img можно записать на USB-флешку командой dd и загрузить на машине с BIOS, как предлагает автор. Код можно читать как учебный пример: train.py показывает обучение и квантование, boot.asm, весь рантайм. Лицензия и условия использования в тексте README не указаны.

Можно ли доверять

Источник, README самого проекта, поэтому все описания работы принадлежат автору проекта. Достоверность подкреплена открытым кодом и заявленной проверкой: вывод Python-симуляции и загрузочного сектора, по словам автора, совпадает символ в символ. Демо записано из QEMU без графического окна; результаты на реальном железе в README не приведены, а загрузка с USB лишь предложена как возможность. Измерений скорости генерации и количественных метрик качества нет, качество показано только примерами строк.

Риски и подводные камни

Генерируемый текст, это правдоподобная имитация, а не настоящий лог: строки содержат искажённые слова и числа, и использовать их как диагностику нельзя. Модель обучена ровно на одну задачу и не является универсальным генератором текста. Образ предназначен для машин с BIOS (про UEFI в README ничего не сказано); автор указывает, что образ читает только собственные секторы, но запись на флешку командой dd стирает её содержимое, поэтому нужно внимательно проверять целевое устройство.

«Машина просыпается и видит во сне лог загрузки Linux: метки времени, области BAR шины PCI, события ACPI для оборудования, которого никогда не существовало.»

— README проекта bootgpt