Запуск GPT-OSS 20B в браузере на WebGPU: Transformers.js + ONNX Runtime Web | AiManual
AiManual Logo Ai / Manual.
13 Фев 2026 Инструмент

Как запустить GPT-OSS (20B) в браузере на WebGPU: туториал по Transformers.js и ONNX Runtime Web

Практический гайд по запуску 20-миллиардной модели GPT-OSS локально в браузере с WebGPU ускорением через Transformers.js и ONNX Runtime Web

Браузер превращается в AI-сервер

Еще полтора года назад идея запустить 20-миллиардную модель в браузере казалась безумием. Сегодня - это рабочий инструмент для веб-разработчиков. В 2026 году WebGPU окончательно перестал быть экспериментальной технологией, а Transformers.js превратился из игрушки в полноценную среду выполнения.

GPT-OSS 20B - та самая модель, которую Meta выпустила в 2024 году как открытую альтернативу GPT-4. Она не самая новая (уже есть Qwen3-235B и другие монстры), но идеально подходит для браузерного запуска. 20 миллиардов параметров - тот порог, где модель уже достаточно умная, но еще не требует 80 ГБ видеопамяти.

Проверьте поддержку WebGPU в вашем браузере: Chrome 124+, Edge 124+, Firefox 130+. Safari пока в отстающих - Apple внезапно затормозила с внедрением.

Что нужно знать перед стартом

Браузерный инференс - это не магия, а набор компромиссов. Основные ограничения:

  • Объем видеопамяти браузера: обычно 4-8 ГБ, но можно расширить через флаги
  • Скорость загрузки модели: GPT-OSS 20B в ONNX формате весит ~8 ГБ
  • Тепловыделение: ваш ноутбук может взлететь при генерации длинных текстов
  • Стабильность: WebGPU драйверы все еще сырые, особенно на интегрированной графике

Если вы уже пробовали запускать LLM в браузере с меньшими моделями, GPT-OSS покажется тяжеловесом. Но именно здесь начинается настоящее веселье.

Подготовка модели: конвертация в ONNX

Первое правило браузерного AI: все должно быть в ONNX. Transformers.js v4 (актуальная версия на февраль 2026) поддерживает ONNX Runtime Web как основной бэкенд для WebGPU.

💡
Не пытайтесь использовать PyTorch веса напрямую. ONNX Runtime Web оптимизирует граф вычислений под WebGPU, давая прирост в 2-3 раза по сравнению с нативной реализацией Transformers.js.

1 Устанавливаем конвертер

pip install optimum[exporters] onnx onnxruntime-gpu

Optimum - библиотека от Hugging Face для оптимизации трансформеров. В 2026 году она научилась конвертировать модели с учетом специфики WebGPU (особенности тензорных ядер, память и т.д.).

2 Конвертируем GPT-OSS 20B

optimum-cli export onnx --model meta-llama/GPT-OSS-20B \
  --task text-generation \
  --framework pt \
  --opset 18 \
  --device cuda \
  --optimize O4 \
  gpt-oss-20b-onnx

Ключевые моменты:

  • --opset 18: последняя версия ONNX операторов на февраль 2026
  • --optimize O4: автоматическая квантизация до INT4 с сохранением качества
  • --device cuda: конвертация на GPU ускоряет процесс в 5-10 раз

Конвертация займет 20-40 минут даже на RTX 4090. Модель большая, слоев много. Не закрывайте терминал и не перезагружайте компьютер.

Настройка Transformers.js v4

Transformers.js v4 - это не та библиотека, которую вы помните по 2024 году. После выхода из браузера в Node.js она обросла новыми возможностями. Но для браузера нам нужна именно клиентская версия.

npm install @huggingface/transformers@latest

В package.json проверьте версию - должна быть 4.3.0 или выше. В феврале 2026 вышла 4.3.2 с критическими исправлениями для WebGPU на AMD видеокартах.

3 Базовая HTML структура

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>GPT-OSS 20B в браузере</title>
    <script src="https://cdn.jsdelivr.net/npm/onnxruntime-web@1.18.0/dist/ort.webgpu.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/@huggingface/transformers@4.3.2"></script>
</head>
<body>
    <textarea id="input" placeholder="Введите запрос..."></textarea>
    <button id="generate">Сгенерировать</button>
    <div id="output"></div>
    <div id="status">Загрузка модели...</div>
</body>
</html>

ONNX Runtime Web 1.18.0 - последняя стабильная версия на февраль 2026. Они исправили баг с утечкой памяти при работе с большими моделями.

Инициализация модели и WebGPU контекста

Теперь самое интересное - заставить 20 миллиардов параметров работать в песочнице браузера.

// Проверяем поддержку WebGPU
if (!navigator.gpu) {
    document.getElementById('status').textContent = 
        'WebGPU не поддерживается. Обновите браузер или включите флаг.';
    throw new Error('WebGPU required');
}

// Конфигурация WebGPU
const gpuAdapter = await navigator.gpu.requestAdapter({
    powerPreference: 'high-performance',
    forceFallbackAdapter: false
});

if (!gpuAdapter) {
    document.getElementById('status').textContent = 
        'Не удалось получить GPU адаптер. Попробуйте другую видеокарту.';
    throw new Error('No GPU adapter');
}

const gpuDevice = await gpuAdapter.requestDevice();

Chrome может запросить разрешение на использование GPU. Если вы его не видите - проверьте настройки контента. Без этого разрешения WebGPU работать не будет.

4 Загрузка GPT-OSS 20B

// Инициализация Transformers.js с WebGPU бэкендом
import { pipeline, env } from '@huggingface/transformers';

// Используем ONNX Runtime Web с WebGPU
env.backends.onnx.wasm.numThreads = 1; // WebGPU не использует WASM треды
env.backends.onnx.wasm.proxy = false;
env.backends.onnx.wasm.simd = false;

// Настройка кэширования - важно для 8 ГБ модели
env.cacheDir = 'gpt-oss-cache';
env.allowLocalModels = true;

// Загружаем модель
const statusElement = document.getElementById('status');
statusElement.textContent = 'Загрузка модели (8 ГБ)...';

try {
    const generator = await pipeline(
        'text-generation',
        './gpt-oss-20b-onnx', // локальная папка с ONNX файлами
        {
            device: 'webgpu',
            dtype: 'qint4', // используем квантизацию INT4
            revision: 'onnx',
            config: {
                max_length: 512,
                temperature: 0.7,
                top_p: 0.9,
                repetition_penalty: 1.1
            }
        }
    );
    
    statusElement.textContent = 'Модель загружена! Готов к работе.';
    
    // Обработчик генерации
    document.getElementById('generate').addEventListener('click', async () => {
        const input = document.getElementById('input').value;
        const output = document.getElementById('output');
        
        output.textContent = 'Генерация...';
        
        const result = await generator(input, {
            max_new_tokens: 256,
            do_sample: true,
            top_k: 40
        });
        
        output.textContent = result[0].generated_text;
    });
    
} catch (error) {
    statusElement.textContent = `Ошибка: ${error.message}`;
    console.error('Failed to load model:', error);
}

Ключевой параметр - dtype: 'qint4'. Без квантизации INT4 модель просто не влезет в видеопамять. Transformers.js v4 автоматически преобразует ONNX веса в формат, понятный WebGPU.

Оптимизации для реального использования

Сырая реализация будет тормозить. Вот что нужно сделать для приемлемой скорости:

Оптимизация Эффект Сложность
Кэширование KV Ускорение на 30-50% при диалоге Средняя
Пакетная обработка Лучшее использование GPU Высокая
Оптимизированные шейдеры Еще +20% скорости Низкая
Прогрессивная загрузка Меньше ожидания при старте Средняя

Кэширование ключей-значений (KV Cache)

Самая важная оптимизация для диалоговых моделей. Без нее каждый новый токен будет пересчитывать всю историю.

// Расширенная конфигурация с KV кэшем
const generator = await pipeline(
    'text-generation',
    './gpt-oss-20b-onnx',
    {
        device: 'webgpu',
        dtype: 'qint4',
        revision: 'onnx',
        config: {
            use_cache: true,           // Включаем KV кэш
            cache_implementation: 'webgpu', // Специальная реализация для WebGPU
            max_cache_length: 2048,    // Максимальная длина кэша
            chunk_length: 512,         // Размер чанка для progressive decoding
        }
    }
);

// При генерации используем прошлый кэш
let pastKeyValues = null;

async function generateWithCache(input) {
    const result = await generator(input, {
        max_new_tokens: 256,
        past_key_values: pastKeyValues, // Передаем прошлый кэш
        return_dict_in_generate: true,
        output_attentions: false,
        output_hidden_states: false
    });
    
    // Сохраняем кэш для следующего вызова
    pastKeyValues = result.past_key_values;
    
    return result[0].generated_text;
}

KV кэш в WebGPU хранится в видеопамяти. Это быстрее, но требует аккуратного управления. Не забывайте сбрасывать кэш при смене темы диалога.

Проблемы и их решения

В процессе обязательно столкнетесь с этим:

  • Out of memory: WebGPU выделяет фиксированный объем. Решение - увеличить лимит через --disable-web-security --enable-features=Vulkan в Chrome
  • Медленная загрузка: 8 ГБ через интернет - это 5-10 минут даже на гигабите. Решение - Service Worker с прогрессивной загрузкой
  • Перегрев: GPU в браузере не имеет нормального троттлинга. Решение - ограничивать длину генерации и делать паузы
  • Нестабильность драйверов: Особенно на Intel Arc и AMD старых серий. Решение - fallback на CPU через WASM
💡
Для тестирования на слабых GPU используйте Youtu-VL-4B - она в 5 раз меньше и работает даже на интегрированной графике.

Сравнение с альтернативами

Зачем вообще мучиться с браузером, если есть GPT-OSS 120B на локальном сервере или облачные API?

Подход Плюсы Минусы Скорость (токен/с)
Браузер + WebGPU Нет сервера, полная приватность, работает офлайн Ограничения памяти, зависимость от браузера 8-12 (RTX 4070)
Локальный сервер (Ollama) Полный контроль, больше памяти, стабильность Требует установки, занимает ресурсы 15-25 (RTX 4070)
Open WebUI + API Удобный интерфейс, много моделей Сложная настройка, требует сервер Зависит от бэкенда
Облачные API (OpenAI) Максимальная скорость, нет ограничений Дорого, нет приватности, требует интернет 50+

Браузерный подход выигрывает в одном - простоте распространения. Открыл сайт, подождал загрузку, работаешь. Никаких Docker, Python, CUDA драйверов.

Кому это нужно в 2026 году

Технология уже перестала быть игрушкой для энтузиастов. Реальные кейсы:

  1. Конфиденциальные приложения: медицинские диагнозы, юридические консультации, корпоративные данные. Все остается на устройстве клиента.
  2. Офлайн-режим: полевые работники, самолеты, корабли, зоны без интернета. Загрузил модель один раз - работаешь везде.
  3. Демо и прототипы: показываешь клиенту AI-фичу без развертывания сервера. Открыл ноутбук - вот работающий прототип.
  4. Образование: студенты изучают LLM без доступа к GPU-серверам. Любой ноутбук с видеокартой превращается в AI-лабораторию.

Особенно интересно выглядит P2P WebGPU-раннер - распределенная система, где браузеры делятся вычислительными ресурсами. Представьте торрент, но для AI-инференса.

Что будет дальше

К концу 2026 года браузерные модели станут обычным делом. Уже сейчас видно тенденции:

  • Chrome готовит Prompt API - нативная интеграция LLM в браузер
  • WebGPU получает расширения для спарсенных вычислений (идеально для MoE моделей)
  • Появляются специализированные GPU для браузерного AI (Apple M4 уже заточен под это)
  • Квантизация INT2 становится стабильной - модели будут в 2 раза меньше

GPT-OSS 20B сегодня - это верхняя граница возможного. Через год в браузере будут работать 70B модели с той же скоростью. А через два - возможно, и 200B.

Главный барьер сейчас не технологии, а ментальность. Разработчики все еще думают, что AI - это обязательно сервер и Python. Попробуйте запустить GPT-OSS в браузере. Просто чтобы понять, что будущее уже здесь, просто оно неравномерно распределено.

Не пытайтесь запустить это на корпоративном ноутбуке с заблокированными флагами Chrome. ИТ-отдел вас не поймет. Лучше тестируйте на личном компьютере с последней версией Chrome Canary.