Я строю языковую модель с нуля - вместе со всем стеком под ней
Обычно «сделал свою модель» означает: взял PyTorch, взял Llama-архитектуру, взял HuggingFace-токенизатор и обучил веса. Я пошёл другим путём - у меня свой каждый этаж этого здания, и это главная особенность проекта.
PromeTorch - мой тензорный фреймворк, написанный с нуля на C++17 и CUDA: около 93 тысяч строк. Свой тензорный движок, свой автоград на сто с лишним backward-функций, свои CUDA-кернелы, оптимизаторы, загрузчики данных, сериализация. Это не обёртка над PyTorch - это параллельная ему реализация, где я контролирую всё: от аллокатора памяти до порядка суммирования градиентов.
> Когда что-то ломается - я чиню не конфиг, а строку в кернеле. Когда что-то медленно - профилирую собственное ядро и ускоряю его: за один день выжал x12 скорости тренировки (chunked-параллельный скан, слияние гейтинга прямо в кернел, TF32/BF16-пути на тензорных ядрах).
PIR - моя архитектура. Это линейная рекуррентная сеть с диагональным селективным сканом - родственник Mamba, RWKV и HGRN, но собственной конструкции: состояние обновляется как
h(t) = g*h(t-1) + v*sigma(gate)
где забывающий гейт g модулируется контентом вокруг зашитого «спектра памяти» - разные каналы забывают с разной скоростью, от считанных токенов до сотен. Сверху - RoPE-позиции, SwiGLU и RMSNorm.
Ключевое отличие от трансформера: никакого внимания и никакого KV-кэша. Стоимость генерации токена - константа: не растёт с длиной контекста ни по времени, ни по памяти. На инференсе вся «оперативная память» модели - 40 векторов состояния по 640 чисел.
Почему это перспективно: трансформер платит за каждый токен перечитыванием всей истории, а PIR несёт историю в сжатом состоянии. Это дешёвый деплой на скромном железе - и здесь вторая особенность проекта: кросс-платформенность, доказанная делом.
Одна и та же архитектура у меня тренируется и работает на NVIDIA A100, на российском Эльбрусе (4x8С2, VLIW-архитектура E2K, из которого я выжал 92% теоретического пика SGEMM) и на нейроускорителе NM Card. Русская модель, обученная на русских текстах моим собственным BPE-токенизатором, на отечественном железе, на собственном фреймворке - вертикаль полностью суверенна: от байтов корпуса до сэмплера.
Что уже сделано, честными цифрами:
- претрейн 117M-параметровой PIR на 2.14 миллиарда токенов русского корпуса - loss 9.8 -> 2.43 за 28 часов на одной A100, целиком на PromeTorch, без PyTorch вообще
- инструктный SFT с loss-маской и выученным EOS-токеном - модель отвечает на вопросы и сама останавливается
- диалоговая версия ведёт мультитёрн-беседу
- параллельно тот же движок исполняет чужие GGUF-модели (Qwen, Gemma, Mistral, DeepSeek) со скоростью до 109 токенов/с на A100 и до 11 токенов/с на Эльбрусе - в разы быстрее llama.cpp на том же железе
И третье - исследовательская прозрачность. Владея каждым слоем, я не гадаю, а измеряю: когда генерация стала распадаться на длинных ответах, я вскрыл модель, померил фактическую память каждого гейта, нашёл перекос спектра в короткую сторону и конструктивную ошибку в разбивке диапазонов - и теперь чиню архитектуру по данным, а не по интуиции.
Такой уровень контроля недоступен в принципе, когда стек чужой.
Куда это ведёт: линейные рекуррентные модели — один из главных фронтиров после трансформеров, и я вхожу в него не потребителем чужих библиотек, а владельцем полного цикла.
Дальше — удлинение памяти состояния, масштабирование и перенос тренировки крупных версий на кластеры отечественных процессоров.
Практическая ценность такого подхода простая:
полный контроль над каждым слоем стека — значит, любую проблему можно довести до строчки кода и исправить, любую платформу —поддержать самому, и ни одна зависимость от внешнего вендора не станет стоп-краном для проекта.
Не забывайте поддерживать канал:
🦆🦆🦆
Поддержать канал: ТБАНК
Поддержать канал: ЮМАНИ
Поддержать канал: PAYPAL [email protected]
Поддержать канал: USDT(trc20) TTk8CqGF9dd4avQcSPDwDF5z3jMcCxGqqT
Поддержать канал: BITCOIN bc1q9ajp3p72xukrvqscm847psmsn948pr8jc5snt7