Локальный inference со сжатыми весами: от резидентных моделей до 32B на карте Ampere с 12 ГБ.
Метод · Результаты · Ограничения · Установка · Быстрый старт · Контрибьюторы · English
Статус. Проект в активной разработке. Опубликованные ядра generate рассчитаны на NVIDIA Ampere (sm_86, измерения на RTX 3080 12 ГБ). Ada, остальные карты семейства Ampere и SM120 (GeForce RTX 50, первый удалённый SKU RTX 5070 Ti) могут генерировать экспериментально; Turing, Hopper и SM100 пока отказаны.
Запустить языковую модель на потребительской карте — это и вместимость, и движение данных. Веса должны ужиться с KV-кэшем и рабочими буферами; то, что лежит в памяти хоста, на каждом шаге идёт по более медленной шине. Сжать файл мало, если перед умножением слой снова разворачивают в полную 16-битную матрицу.
deep-fold — экспериментальный стек вокруг сжатого хранения весов. Компрессор на Go пишет NF4 в контейнер CHR0. Ядра CUDA для Ampere восстанавливают значения по ходу умножения и сразу их выбрасывают. Эмбеддинги (PackedEmbed) восстанавливают только запрошенные строки. Модели, которые влезают в карту, остаются резидентными и идут полным CUDA-графом greedy-шага. Более крупные держат резидентную часть на GPU и подкачивают упакованные веса из pinned-памяти хоста.
На одной RTX 3080 12 ГБ InternLM2.5-20B на hard-12 даёт 39,0 ток/с и 9/12 верных ответов против 13,2 и 9/12 у Ollama Q4_K. Разрыв в основном от размещения: deep-fold резидентен, Ollama снимает слои. На 3B и 14B быстрее Ollama. Qwen2.5-32B идёт через overflow CopyRing. Отдельное ignore-EOS плато на 64 токена — сравнение длинного decode с llama.cpp. Ниже — метод, доказательства и текущие пределы.
Коды и шкалы лежат в видеопамяти. Линейные ядра восстанавливают только фрагмент текущего тайла и не записывают плотную матрицу весов обратно на устройство.
В группе из 64 весов — четырёхбитные коды NF4 и одна шкала FP16:
Для выровненных матриц полезная нагрузка кодов и шкал примерно в 3,76 раза меньше BF16. Метаданные, выравнивание, нормы, смещения, активации и KV-кэш входят в рабочий объём отдельно. Квантование с потерями.
| Нагрузка | Путь исполнения |
|---|---|
| Обработка промпта (prefill) | NF4 GEMM на тензорных ядрах Ampere (mma.sync.m16n8k16); восстановление в BF16-фрагменты регистров; пачки до 32 позиций |
| Резидентная генерация (decode) | N=1 NF4 GEMV на CUDA-ядрах внутри полного CUDA-графа greedy-шага |
| Модель больше бюджета GPU | TokenLoop и CopyRing: выбранные упакованные матрицы идут из pinned-памяти хоста через два повторно используемых слота на GPU |
Decode V2 держит позицию токена и длину валидного KV в буферах устройства. Ядро внимания читает только валидный префикс кэша. Перед выбором V2 CLI оценивает веса, KV, рабочие буферы и резервы. Эти ядра написаны под тензорные ядра Ampere; другим архитектурам нужен свой порт.
Рисунок 1. Два пути исполнения делят одно сжатое представление. В резидентном режиме упакованные матрицы остаются на GPU. Overflow добавляет pinned-хранилище на хосте и два слота копирования, затем то же ядро GEMM. Эмбеддинги восстанавливают запрошенные строки отдельно.
Связка CPU-компрессора и проверяемого формата файла с загрузкой упакованной модели, ядрами Ampere, резидентным и overflow-исполнением, локальным chat CLI и воспроизводимыми прогонами. Chat переиспользует префикс KV, если токенизированный префикс диалога совпал.
NF4 введён в QLoRA. Слитый квантованный inference есть и в системах вроде Marlin. Вклад deep-fold — реализация и сборка; рейтинг ядер требует согласованных замеров.
Реализация: CHR0 · раскладка NF4 · ядро Ampere · GEMM · GEMV · Decode V2 · CopyRing.
Эталонная машина: одна RTX 3080 12 ГБ (sm_86), Windows/WDDM. Замеры автора из этого репозитория. Публикация на 18 сентября 2026.
Независимые запросы, контекст 2048, greedy, до 256 новых токенов. Скорость — среднее арифметическое по запросам. Правильность — число ответов, принятых скорером фикстуры.
| Модель | deep-fold V2, ток/с | Ollama Q4_K, ток/с | Верные ответы: V2 / Ollama |
|---|---|---|---|
| Qwen2.5-3B-Instruct | 190,9 | 197,2 | 8/12 · 7/12 |
| Qwen2.5-14B-Instruct | 54,8 | 66,2 | 11/12 · 10/12 |
| InternLM2.5-20B-Chat | 39,0 | 13,2 | 9/12 · 9/12 |
На 20B опубликованное среднее примерно в 3 раза выше Ollama на этой фикстуре, потому что упакованная модель остаётся на карте. На строках 3B и 14B быстрее Ollama. Двенадцать вопросов — маленькая регрессия, не общее сравнение качества схем квантования.
Обновлённый прогон 20B использует упакованные строки эмбеддингов: время до первого токена на первом запросе 434 мс, среднее 552 мс, после инициализации. Загрузка CHR — 11,46 с. Это разные таймеры, не обещание холодного старта. Строки 3B и 14B — более ранние замеры V2; после packed embeddings их заново не публиковали.
Рисунок 2. Одна и та же 12-пунктная фикстура на одной RTX 3080. Качество и средняя скорость decode. llama.cpp hard-12 ещё не опубликован. Перерисовка: python -m gpu.lab.hard_v2_plate --redraw.
Доказательства: V2 3B, 14B, 20B; Ollama 3B, 14B, 20B. История прогонов — в лабораторном журнале.
Другой протокол — ignore-EOS, 64 новых токена, max_seq=2048 — сравнение длинного decode с llama.cpp Q4_K на той же карте. Decode V2: 197 / 57,5 / 40 ток/с на 3B / 14B / 20B. Exclusive Q4_K long (ctx 2048): ~187 / 69,9 / 11,87. Это не таблица hard-12; V2 по-прежнему смотрит на всю ось буфера. Подробности: журнал Decode V2, сравнение 3080.
Рисунок 3. Резидентный Decode V2 (граф GEMV + MMA prefill-32) рядом с exclusive Q4_K long. Заголовок V2: 3B 197, 14B 57,5, 20B 40. Перерисовка: python -m gpu.lab.decodev2_plate --redraw.
У Qwen2.5-32B примерно 16,2 ГиБ упакованной полезной нагрузки весов. В записанной конфигурации около 9,5 ГиБ весов остаются на GPU, 6,7 ГиБ — в pinned-памяти хоста. CopyRing подставляет хостовые матрицы для счёта на GPU.
На отдельном прогоне генерации 64 токенов deep-fold даёт 2,49 шага decode/с, или 2,53 ток/с в серверном счётчике токенов. Ollama и llama.cpp auto-fit — по 2,54 ток/с. На hard-12 опубликованные средние 2,12 у deep-fold и 3,1 у Ollama, поэтому ничья не переносится на любую нагрузку. Протокол 32B.
Рисунок 4. Цитировать длинные плато 32B. Ollama 2,54 против llama.cpp auto-fit 2,54 против H2 2,53 — это CPU-хвост против CPU-хвоста против PCIe CopyRing, не рейтинг ядер. 3B Decode V2 197 рядом с Q4_K ~187. Перерисовка: python -m gpu.lab.compare_plate --redraw.
- Измеренная платформа: RTX 3080 12 ГБ, Windows. Ampere
sm_86— опубликованный путь generate.sm_80,sm_87иsm_89принимаются экспериментально и без бенчмарка. SM120 (GeForce RTX 50, первый удалённый SKU RTX 5070 Ti) — experimental generate, пластины ещё нет. Turing, Hopper и datacenter Blackwell (SM100) для generate отказаны. Установка на Linux работает; ток/с на Linux не публиковали. - Генерация: greedy. Длина контекста занимает KV; оценка вместимости использует фиксированные резервы и не обещает посадку при произвольной нагрузке на GPU.
- Модели: публичный allowlist скачивания — Qwen2.5 3B, 14B и 32B Instruct плюс InternLM2.5-20B-Chat. Другие чекпоинты требуют проверки.
- Вход: сжатие начинается с несжатых Hugging Face safetensors. Импорта GGUF нет. VQ 2-bit остаётся экспериментальным и не входит в автоматический выбор кодека.
- Доказательства: широкая оценка качества, полные сырые артефакты каждого прогона V2, повторные сессии на стабильность и независимая репликация на другом железе — открытая работа.
Нужны Python 3.11 или 3.12, Git и драйвер NVIDIA. Измеренная capability — sm_86. Сжатие на CPU отдельно и не требует карты, на которой generate уже разрешён.
| GPU / платформа | Сейчас |
|---|---|
RTX 3080 12 ГБ, sm_86, Windows |
Измеренная конфигурация |
Другое железо sm_86 |
Capability принимается; нет того же заявления по скорости |
sm_80, sm_87, sm_89 |
Экспериментальная генерация |
| SM120 (GeForce RTX 50; первый удалённый SKU RTX 5070 Ti) | Экспериментальная генерация; пластины нет |
| Turing, Hopper, SM100 | Generate отказан |
| AMD, macOS, только CPU | Пути generate нет; сжатие на CPU отдельно |
git clone https://github.com/wertick01/deep-fold.git
cd deep-fold
powershell -ExecutionPolicy Bypass -File scripts/setup.ps1
.\.venv\Scripts\Activate.ps1
deepfold doctorgit clone https://github.com/wertick01/deep-fold.git
cd deep-fold
bash scripts/setup.sh
source .venv/bin/activate
deepfold doctorСкрипт ставит CLI и CUDA PyTorch, готовит компрессор Go и собирает или находит расширение CUDA. Сборка из исходников нужна CUDA 12.4 (Ampere) или 12.8 (RTX 50) и C++ toolchain; на Windows setup может попытаться их установить.
Полные требования и разбор сбоев: English · Русская инструкция. Если команды нет в PATH, в активированном окружении: python -m gpu.cli.
Qwen2.5-3B — самая маленькая поддерживаемая точка входа. Нужно место под исходный чекпоинт (~6,2 ГБ) плюс сжатый файл.
deepfold pull Qwen/Qwen2.5-3B-Instruct --dir ./models/Qwen2.5-3B-Instruct --yes
deepfold compress --in ./models/Qwen2.5-3B-Instruct --out ./models/qwen25-3b.nf4.chr --codec nf4
deepfold chat --model ./models/Qwen2.5-3B-Instruct --chr ./models/qwen25-3b.nf4.chr
Один ответ:
deepfold run --model ./models/Qwen2.5-3B-Instruct --chr ./models/qwen25-3b.nf4.chr --prompt "Explain why the sky is blue." --max-new-tokens 128
--executor auto выбирает Decode V2, если загруженная модель и оценка памяти это позволяют; иначе TokenLoop. --max-seq по умолчанию 512 для run и 2048 для chat. С --agent на резидентной 14B карте 12 ГБ по умолчанию 4096, если флаг не задан явно.
Рядом с каталогом исходной модели нужны конфигурация, токенизатор и файлы remote-code, если они требуются. .chr даёт упакованные веса. Для InternLM дополнительно: python -m pip install -e ".[internlm]".
В chat /help — команды, /stats — тайминги, /clear — сброс диалога, /chats — сохранённые беседы. На следующих ходах prefill идёт только по суффиксу, если префикс шаблона чата совпал. Опциональный --agent добавляет инструменты рабочей области (grep, патч, тесты, allowlisted argv) с политикой подтверждения. См. документацию chat и агента и настройку веб-поиска.
Ещё примеры: Quickstart · Быстрый старт · заметки о моделях.
Проект ранний. Occupancy, графы и пути MMA/GEMV заточены под Ampere. Сейчас нужнее всего люди, которые могут портировать эти ядра на Ada, Hopper или Blackwell, и те, кто прогонит те же пластины на другой карте или на Linux. Независимая репликация на Ampere так же полезна.
Issue или pull request — на GitHub. Полезный отчёт: вывод deepfold doctor, коммит checkout, имя GPU и CUDA capability, ОС и (если generate шёл) весь каталог пластины, а не одно число ток/с.
Локальная установка и дымовой прогон:
# Windows
powershell -File scripts/plate.ps1 3b --out ./runs/local-3b# Linux
bash scripts/plate.sh 3b --out ./runs/local-3bРаннер может скачать и сжать модель. Он записывает машину, checkout и дымовые результаты; сам по себе hard-12 не воспроизводит. Каталог выхода нужно хранить целиком.
Для контролируемых сравнений фиксируйте коммит, ревизию чекпоинта, версии движков, число токенов промпта и выхода, лимит контекста, размещение, прогрев и определения таймеров. Старт, время до первого токена и скорость decode — отдельно. Захват CUDA-графа не смешивать с таймером прогрева. Лабораторное руководство · оценка hard-12 · закоммиченные прогоны.
| Область | С чего начать |
|---|---|
| Порты архитектур и фильтры doctor | ядро Ampere, probe CLI |
| Сжатие и проверка | Go CLI, round trip на CPU |
| Резидентный inference | Decode V2, дизайн |
| Overflow | CopyRing, записанный путь 32B |
| Арифметика CUDA | ядра NF4 и проверки |
| CLI и взаимодействие | исходники CLI, заметки UX |
К изменениям производительности нужны и численные проверки, и тайминги полного пути генерации.
MIT. У скачанных моделей остаются их собственные лицензии.
Разработано с Cursor.



