Для тех, кто в канале недавно: PromeTorch — фреймворк для обучения и запуска нейросетей, написанный с нуля на C++ и CUDA. Внутри нет PyTorch — свои тензоры, автоматическое дифференцирование, вычислительные ядра под видеокарту и под процессоры: x86, ARM, Эльбрус, нейроускорители НТЦ Модуль. Сейчас это 161 тысяча строк C++ и 104 коммита с начала июля.
Запуск моделей на NVIDIA
Замеры на A100, модели в Q4_K_M, greedy, медиана пяти прогонов по 200 токенов:
•
qwen3:4b — 109 ток/с, в апреле было 82.6•
gemma3:4b — 103.7•
deepseek-r1:8b — 68.6•
phi3:3.8b — 86 ток/с, раньше эта модель на видеокарте просто зависалаОсновной прирост дала инструкция
dp4a: она перемножает четыре пары восьмибитных целых за один такт. Веса и так лежат в четырёх битах, поэтому входной вектор один раз переводится в int8, и дальше умножение идёт целыми числами вместо чисел с плавающей точкой. Выигрыш зависит от ширины слоя — на узких до четырёх раз, а на самых широких инструкция не помогает вовсе: там упор не в вычисления, а в пропускную способность памяти. Поэтому она включается по размеру слоя, а не везде подряд.Отдельно — задержка до первого токена. На промпте в 921 токен она была 11.1 секунды: подсказка обрабатывалась по одному токену, и веса модели читались из памяти заново на каждом. Теперь это одно большое матричное умножение на тензорных ядрах — 1.6 секунды, в семь раз быстрее.
Для ориентира: Ollama на той же машине и тех же моделях выдаёт 189 и 117 ток/с. То есть примерно половина её скорости — расстояние понятное и сокращаемое, но пока это расстояние есть.
Ядро фреймворка
Обратный проход на видеокарте частично считался на процессоре - шесть операций гоняли данные туда-обратно каждый шаг. Теперь у них свои CUDA-ядра: SiLU, RMSNorm, RoPE, эмбеддинги, кросс-энтропия. Параллельный скан для рекуррентных слоёв переписан на блочную схему - работа дробится на куски по 32 шага, и загрузка карты растёт с пяти до восьмидесяти тысяч потоков. Норма градиента теперь считается на самой карте: раньше каждый шаг на процессор уезжало 428 мегабайт, теперь - четыре байта.
Эльбрус
Пара слов, зачем это вообще. Эльбрус - VLIW-процессор: порядок выполнения команд определяет не железо на лету, а компилятор заранее. Готового ML-стека под него нет - ни PyTorch, ни NCCL для распределённого обучения, а библиотека быстрой математики от МЦСТ работает не из любого потока. Всё, что на других платформах берётся из коробки, здесь приходится делать самому.
Шаг обучения сократился с 6.4 до 0.46 секунды. Это сделало реальным обучение прямо на Эльбрусе: модель PIR на 13.5 млн параметров прошла 675 млн токенов за тридцать часов, потери упали с 9.68 до 2.95. Схема - четыре процесса по числу NUMA-узлов с усреднением весов вместо обмена градиентами: NCCL на этой платформе нет, а веса можно синхронизировать в десять раз реже.
Запуск чужих моделей: работают десять из десяти,
qwen3-4B выдаёт 11.4 ток/с против 1.82 у llama.cpp на тех же 32 потоках. Матричное умножение на четырёх NUMA-узлах - 1840 GFLOPS, 80% расчётного пика машины.Поставить и собрать
pip install prometorch - сборка под процессор для Linux, macOS и Windows, Python 3.9–3.13. Под Эльбрус, Baikal, ALT, Astra и RED OS — готовые пресеты CMake и Docker-образы.Что дальше
Продолжается обучение диалоговой версии PIR на 107 млн параметров. Архитектура линейно-рекуррентная, без attention: состояние обновляется по цепочке, а не пересчитывается по всему контексту заново. Веса выкладывать пока рано — сначала нужен внятный результат на длинных диалогах.
Параллельно приводится в порядок сам репозиторий: сверены числа между отчётами, дописана документация по сборке под каждую платформу, публичная история почищена от лишнего.
Репозиторий: github.com/barometech/PromeTorch
Бортовой журнал проекта - JOURNAL.md в корне репозитория.
🦆🦆🦆
Поддержать канал ₽ / $ / ₿
