| --- |
| license: mit |
| language: |
| - en |
| base_model: |
| - levossadtchi/QED-75M |
| --- |
| # QED-75M Web (ONNX) |
|
|
| QED-75M — языковая модель (384 hidden, 32 слоя, 75M параметров), оптимизированная для веб-деплоя. |
|
|
| **Репозиторий:** https://huggingface.co/levossadtchi/QED-75M_web |
| |
| --- |
| |
| ## 📁 Файлы |
| |
| | Файл | Описание | Размер | |
| |------|----------|--------| |
| | `model.onnx` | Веса модели (FP32) | ~365 MB | |
| | `tokenizer.json` | Словарь токенизатора | ~3 MB | |
| | `tokenizer_config.json` | Конфиг токенизатора | <1 KB | |
| | `config.json` | Архитектура модели | <1 KB | |
| | `generation_config.json` | Параметры генерации | <1 KB | |
| | `index.html` | Демо-плейграунд | <10 KB | |
|
|
| --- |
|
|
| ## 💬 Формат промптов |
|
|
| Модель обучена на чат-формате. Для лучших результатов используйте: |
|
|
| ``` |
| <|user|>ваш вопрос<|assistant|> |
| ``` |
|
|
| **Примеры:** |
|
|
| | Промпт | Ожидаемый ответ | |
| |--------|-----------------| |
| | `<|user|>What is 2+2?<|assistant|>` | "The answer is 2 + 2 = 4." | |
| | `<|user|>Explain gravity in one sentence.<|assistant|>` | "Gravity is a fundamental force..." | |
| | `<|user|>Write a haiku about cats.<|assistant|>` | Стихотворение про котов | |
|
|
| --- |
|
|
| ## 🚀 Использование |
|
|
| ### Вариант 1: Transformers.js (рекомендуется) |
|
|
| ```bash |
| npm install @xenova/transformers |
| ``` |
|
|
| ```javascript |
| import { AutoTokenizer, AutoModelForCausalLM } from '@xenova/transformers'; |
| |
| // Загрузка модели |
| const tokenizer = await AutoTokenizer.from_pretrained('levossadtchi/QED-75M_web'); |
| const model = await AutoModelForCausalLM.from_pretrained('levossadtchi/QED-75M_web', { |
| quantized: true, // Использовать int8 квантование |
| dtype: 'q8', |
| device: 'webgpu', // или 'wasm' для CPU |
| }); |
| |
| // Генерация |
| const prompt = '<|user|>What is 2+2?<|assistant|>'; |
| const inputs = await tokenizer(prompt, { return_tensors: 'pt' }); |
| |
| const outputs = await model.generate({ |
| ...inputs, |
| max_new_tokens: 128, |
| temperature: 0.7, |
| top_k: 40, |
| do_sample: true, |
| eos_token_id: tokenizer.eos_token_id, |
| pad_token_id: tokenizer.pad_token_id, |
| }); |
| |
| const text = tokenizer.decode(outputs[0], { skip_special_tokens: false }); |
| console.log(text); |
| ``` |
|
|
| ### Вариант 2: ONNX Runtime Web (низкоуровневый) |
|
|
| ```bash |
| npm install onnxruntime-web |
| ``` |
|
|
| ```javascript |
| import * as ort from 'onnxruntime-web'; |
| |
| // Загрузка |
| const session = await ort.InferenceSession.create('model.onnx'); |
| |
| // Инференс |
| const inputIds = [1, 15826, 15, 638]; // токены |
| const tensor = new ort.Tensor('int64', BigInt64Array.from(inputIds.map(BigInt)), [1, inputIds.length]); |
| const { logits } = await session.run({ input_ids: tensor }); |
| |
| // Greedy decoding |
| const nextToken = logits.data.reduce((maxIdx, val, idx) => val > logits.data[maxIdx] ? idx : maxIdx, 0); |
| ``` |
|
|
| ### Вариант 3: Готовый HTML |
|
|
| Откройте `index.html` в браузере или задеплойте на Vercel/Netlify. |
|
|
| --- |
|
|
| ## ⚙️ Параметры генерации |
|
|
| | Параметр | По умолчанию | Описание | |
| |----------|--------------|----------| |
| | `max_new_tokens` | 128 | Макс. количество новых токенов | |
| | `temperature` | 0.7 | Креативность (0 = greedy, >1 = хаос) | |
| | `top_k` | 40 | Сэмплирование из top-k токенов | |
| | `top_p` | 0.9 | Nucleus sampling (альтернатива top_k) | |
| | `repetition_penalty` | 1.1 | Штраф за повторы | |
|
|
| **Рекомендации:** |
| - Для фактов: `temperature=0.5, top_k=30` |
| - Для креатива: `temperature=0.8, top_k=50` |
| - Для кода: `temperature=0.2, top_k=20` |
|
|
| --- |
|
|
| ## 🏗 Архитектура |
|
|
| | Параметр | Значение | |
| |----------|----------| |
| | Vocabulary | 49,152 токенов | |
| | Hidden dim | 384 | |
| | Layers | 32 | |
| | Attention heads | 6 | |
| | FFN dim | 1,024 | |
| | Max length | 8,192 токена | |
| | RoPE θ | 10,000 | |
| | RMSNorm ε | 1e-5 | |
|
|
| --- |
|
|
| ## 📦 Квантование |
|
|
| Для уменьшения размера модели используйте int8 квантование: |
|
|
| ```bash |
| pip install onnxruntime-tools |
| |
| python -c " |
| from onnxruntime.quantization import quantize_dynamic, QuantType |
| quantize_dynamic('model.onnx', 'model_quantized.onnx', weight_type=QuantType.QUInt8) |
| " |
| ``` |
|
|
| **Размеры:** |
| - Оригинал (FP32): ~365 MB |
| - Квантованная (INT8): ~95 MB (−74%) |
|
|
| --- |
|
|
| ## 🌐 Браузерная поддержка |
|
|
| | Технология | Поддержка | Размер | Скорость | |
| |------------|-----------|--------|----------| |
| | **WebGPU** | Chrome 113+, Edge | ~100 MB | ⚡⚡⚡ Быстро | |
| | **WASM** | Все браузеры | ~100 MB | ⚡⚡ Средне | |
| | **CPU** | Резервный режим | ~365 MB | ⚡ Медленно | |
|
|
| --- |
|
|
| ## 🔧 Локальный запуск |
|
|
| ```bash |
| # Клонировать репозиторий |
| git lfs install |
| git clone https://huggingface.co/levossadtchi/QED-75M_web |
| |
| # Запустить локальный сервер |
| cd QED-75M_web |
| python -m http.server 8000 |
| |
| # Открыть в браузере |
| open http://localhost:8000/index.html |
| ``` |
|
|
| --- |
|
|
| ## 📝 Лицензия |
|
|
| MIT |