BitNet на iPad? Да, это работает в 2026
Помните, когда все смеялись над 1-битными моделями? Говорили, что это очередной хайп, который никуда не годится. А теперь открываете браузер на iPad, включаете флаг chrome://flags/#enable-unsafe-webgpu и запускаете полноценную BitNet b1.58-3B прямо на устройстве. Без серверов, без облаков, без подписок.
Это не фантастика. Это Proof of Concept, который появился в январе 2026 и уже показывает стабильные 15-20 токенов в секунду на iPad Pro с M4. И самое интересное - вся магия происходит в WGSL шейдерах, которые компилируются прямо в браузере.
Зачем вообще это нужно?
Потому что классические 8-битные модели на WebGPU - это как пытаться запихнуть слона в телефонную будку. Даже Phi-3.5 Mini требует 4 ГБ VRAM, а у большинства iPad только 8 ГБ общей памяти. А здесь у нас BitNet b1.58, где каждый параметр занимает... 1.58 бита. Математически.
На практике это значит, что 3-миллиардная модель помещается в 600 МБ вместо 6 ГБ. И вычисления становятся проще - вместо сложных матричных умножений с плавающей точкой мы работаем с целыми числами и битовыми операциями.
Важный нюанс 2026 года: BitNet b1.58 на самом деле использует три значения: -1, 0, 1. Поэтому 1.58 бита на параметр - это теоретический минимум Шеннона, а не округление. На практике храним 2 бита.
Как работает WGSL шейдер для BitNet
Здесь начинается самое интересное. WGSL - это не GLSL и не HLSL. У него своя специфика, свои ограничения. Например, нет атомарных операций над битами в рабочих группах (workgroup). Нет удобных битовых сдвигов для произвольных типов.
Но есть кое-что лучше - подгрупповые операции (subgroup operations), которые появились в WGSL 1.2 в конце 2025. Они позволяют синхронизировать выполнение внутри подгруппы из 32 потоков без барьеров. Идеально для нашего случая.
Вот как выглядит ядро матричного умножения для BitNet в WGSL:
@group(0) @binding(0) var input: array;
@group(0) @binding(1) var weights: array;
@group(0) @binding(2) var output: array;
@compute @workgroup_size(256)
fn main(@builtin(global_invocation_id) global_id: vec3) {
let idx = global_id.x;
if (idx >= arrayLength(&output)) {
return;
}
// Каждый поток обрабатывает 32 входа за раз
// Веса упакованы по 16 значений в u32 (2 бита на значение)
var sum: i32 = 0;
for (var i: u32 = 0; i < 32; i += 1) {
let weight_packed = weights[(idx * 32 + i) / 16];
let weight_shift = ((idx * 32 + i) % 16) * 2;
let weight_bits = (weight_packed >> weight_shift) & 0x3;
// Преобразуем 2 бита в -1, 0, 1
let weight_value = select(-1, select(0, 1, weight_bits == 2), weight_bits == 1);
sum += weight_value * i32(input[i]);
}
output[idx] = sum;
}
Это упрощенная версия, но она показывает основную идею. Настоящий PoC использует подгрупповые операции для редукции и обработки нескольких выходов за вызов.
Главная проблема: нет прямой поддержки int8
Вот что реально бесит в WGSL на 2026 год. В Metal Shading Language есть тип `packed_int8`, в CUDA - `int8_t`. А в WGSL? Только `i32`, `u32`, `f32`. И все.
Приходится делать упаковку/распаковку вручную. Каждый параметр BitNet занимает 2 бита, поэтому мы упаковываем 16 значений в одно 32-битное слово. Это добавляет накладных расходов, но все равно быстрее, чем работать с float32.
Кстати, если вы хотите глубже разобраться в архитектуре BitNet, посмотрите статью про конец эры MatMul. Там подробно объясняют, почему умножение матриц с плавающей точкой уходит в прошлое.
Производительность: цифры против ожиданий
Ожидали 100 токенов в секунду? Забудьте. Реальность на iPad Pro M4 (январь 2026):
| Модель | Размер | Токенов/с | Память |
|---|---|---|---|
| BitNet b1.58-3B | 3B параметров | 18-22 | ~600 МБ |
| Phi-3.5 Mini (WebGPU) | 3.8B параметров | 8-12 | ~4 ГБ |
| Llama 3.2 3B (квантованная) | 3B параметров | 6-9 | ~2 ГБ |
Почему так медленно? Потому что WebGPU все еще добавляет оверхеда. Каждый вызов шейдера проходит через несколько слоев абстракции: браузер → драйвер ОС → драйвер GPU. В нативных приложениях этот стек тоньше.
Но 20 токенов в секунду для 3B модели на iPad - это революция. Особенно если учесть, что в 2024 году такое было невозможно в принципе.
Архитектура PoC: что внутри
Проект на GitHub (не буду называть, чтобы не рекламировать) состоит из трех основных частей:
- Конвертер весов - берет оригинальные веса BitNet в формате PyTorch и конвертирует в упакованный формат для WGSL. Каждый параметр сжимается до 2 бит, затем 16 параметров упаковываются в одно u32.
- WGSL шейдеры - набор ядер для разных операций: матричное умножение, attention, layer norm. Каждое ядро оптимизировано под особенности BitNet.
- JavaScript раннер - управляет конвейером WebGPU, загружает веса, вызывает шейдеры, обрабатывает вывод. Использует новые API из WebGPU 2.0 (2025 релиз).
Самое сложное - это attention. В BitNet он тоже 1-битный, но требует сложных операций с масками и softmax. Пришлось реализовывать кастомный softmax на WGSL, который работает с целыми числами.
Внимание: текущая реализация не поддерживает kv-cache. Каждый токен генерируется с полным пересчетом контекста. Для 2048 токенов контекста это означает 2048² операций. На iPad Pro M4 это ограничивает контекст ~512 токенами для приемлемой скорости.
Сравнение с альтернативами
Почему не использовать bitnet.cpp через WebAssembly? Потому что WASM не имеет доступа к GPU. Все вычисления идут на CPU, а M4 хоть и быстрый, но не настолько.
Почему не Transformers.js? Потому что он не поддерживает 1-битные модели. Да и вообще, большинство фреймворков на 2026 год все еще заточены под float16/int8.
Есть экспериментальная поддержка BitNet в ONNX Runtime Web, но она требует дополнительных конвертаций и работает медленнее нативного WGSL.
Ограничения и подводные камни
Первое и главное: тепловыделение. iPad Pro M4 при полной нагрузке на GPU греется как утюг. Через 5 минут генерации срабатывает thermal throttling, и скорость падает до 8-10 токенов в секунду.
Второе: потребление памяти. Хотя модель занимает всего 600 МБ, WebGPU требует дополнительные буферы для промежуточных результатов. В итоге под нагрузкой Safari съедает 1.5-2 ГБ RAM.
Третье: стабильность. WebGPU в Safari 18 (2026) все еще сыроват. Каждые 50-100 запросов случается краш GPU процесса. Приходится перезагружать страницу.
Кому это нужно в 2026?
Разработчикам локальных AI-приложений для iOS/iPadOS. App Store до сих пор не пускает приложения с JIT-компиляцией, а WebGPU работает в браузере без ограничений.
Стартапам, которые хотят демо своей модели без серверной инфраструктуры. Открыл ссылку на iPad - и вот тебе живая демка.
Исследователям, которые тестируют новые архитектуры. Не нужно покупать дорогое железо - достаточно iPad Pro и браузера.
Если вы хотите запустить что-то более традиционное, посмотрите гайд по запуску GPT-OSS на WebGPU. Там другой подход, но принципы те же.
Что будет дальше?
К концу 2026 обещают WebGPU 2.1 с поддержкой int8/int4 напрямую. Это уберет половину накладных расходов на упаковку/распаковку.
Apple анонсировала Metal 4 для Safari, который даст прямой доступ к нейронному движку M4. Представьте: BitNet, работающий на Neural Engine через браузер. Скорость возрастет в 5-10 раз.
И главное - появятся инструменты для автоматической конвертации PyTorch моделей в WGSL. Сейчас это делается вручную, что занимает недели. Будет как ONNX, только для браузера.
А пока что этот PoC - доказательство, что 1-битные модели в браузере не только возможны, но и практичны. Медленно? Да. Сыро? Еще как. Но работает. На обычном iPad, который лежит у половины читателей этой статьи.
Попробуйте запустить BitNet на своем устройстве. Не для работы, а просто чтобы понять: будущее edge AI уже здесь. Оно не идеальное, не быстрое, но оно работает у вас в кармане. И это меняет все.