Найти в Дзене

Портируем microGPT на Common Lisp с помощью LLM

Смотрите чего я навайбкодил: https://github.com/40ants/microgpt Это порт на Common Lisp скрипта microgpt, который недавно опубликовал Andrej Karpathy. Эта штука включает в себя код трансформера и инференс. То есть она может обучиться на каких-то входных текстах, а потом генерировать похожие тексты. Всё как у больших LLM, только буквально в одном Python-скрипте. Ну и, конечно, эта штука больше создана для обучения, а не для того, чтобы показывать хорошую производительность. В этом примере она учится на корпусе русских имен и может генерить новые, похожие по написанию: % ./microgpt.py num docs: 484 vocab size: 57 num params: 5152 step 1000 / 1000 | loss 2.3474 --- inference (new, hallucinated names) --- sample 1: Небромир sample 2: Миловета sample 3: Милана sample 4: Свеладр sample 5: Милана sample 6: Ратевоба sample 7: Миловисла sample 8: Крана sample 9: Бородосл ./microgpt.py 54.06s user 0.82s system 99% cpu 55.011 total Я подумал, что это хороший пример, чтобы попробов

Портируем microGPT на Common Lisp с помощью LLM

Смотрите чего я навайбкодил: https://github.com/40ants/microgpt

Это порт на Common Lisp скрипта microgpt, который недавно опубликовал Andrej Karpathy.

Эта штука включает в себя код трансформера и инференс. То есть она может обучиться на каких-то входных текстах, а потом генерировать похожие тексты. Всё как у больших LLM, только буквально в одном Python-скрипте. Ну и, конечно, эта штука больше создана для обучения, а не для того, чтобы показывать хорошую производительность.

В этом примере она учится на корпусе русских имен и может генерить новые, похожие по написанию:

% ./microgpt.py

num docs: 484

vocab size: 57

num params: 5152

step 1000 / 1000 | loss 2.3474

--- inference (new, hallucinated names) ---

sample 1: Небромир

sample 2: Миловета

sample 3: Милана

sample 4: Свеладр

sample 5: Милана

sample 6: Ратевоба

sample 7: Миловисла

sample 8: Крана

sample 9: Бородосл

./microgpt.py 54.06s user 0.82s system 99% cpu 55.011 total

Я подумал, что это хороший пример, чтобы попробовать, как LLM справится с переписыванием этого кода на Common Lisp.

Промпт для переписывания был очень простой. Буквально я сказал LLM: "Вот тебе код на Python, сделай мне то же самое, но на Common Lisp, для загрузки датасета используй либу Dexador". При этом я использовал в качестве агента Claude Code и нейросеть Claude Sonnet 4.6.

Что меня удивило - то что нейросеть сама создала ASDF систему, а так же решила декомпозировать код на модули, а не склеила всё в один большой скрипт.

Первоначальная версия которая получилась, работала аналогично питоновской, но в 5 раз быстрее:

% time roswell/microgpt.ros

num docs: 484

vocab size: 57

num params: 5152

step 1000 / 1000 | loss 1.9185

--- inference (new, hallucinated names) ---

sample 1: Велослав

sample 2: Бореслав

sample 3: Любра

sample 4: Влавослав

sample 5: Добран

sample 6: Любегост

sample 7: Светисл

sample 8: Вирослав

sample 9: Зослав

roswell/microgpt.ros 9.41s user 0.61s system 99% cpu 10.038 total

Дальше я просил LLM проанализировать что можно сделать чтобы повысить производительность и в итоге было сделано следующее:

CLOS классы педеланы на структуры:

roswell/microgpt.ros 6.00s user 0.47s system 99% cpu 6.489 total

То есть, после этого программа стала быстрее python оригинала почти в 10 раз.

А вот после объявления ftype и inline для некоторых функций, производительность улучшилась незначительно:

roswell/microgpt.ros 5.70s user 0.51s system 99% cpu 6.232 total

У меня не было цели упарываться в оптимизацию, но думаю можно выжать ещё больше скорости если захотеть. Основной темой эксперимеынта было - проверить, как LLM справится с подобным проектом. Ведь иногда так бывает, что для Common Lisp какой-то библиотеки нет, но она есть для другого языка. Переписывать вручную - занятие грустное, но если можно сделать это автоматически с помощью LLM и сэкономить себе много часов работы, то почему нет?

#commonlisp #llm #experiment