🧠 RUcover Lite Mini
1. О модели
RUcover Lite Mini — это лёгкая авторегрессионная языковая модель на русском языке (≈10 млн параметров), основанная на архитектуре Transformer Decoder с улучшениями: Rotary Positional Embeddings (RoPE), RMSNorm и SwiGLU.
Модель обучена на 4.3 ГБ текстового корпуса, включающего:
- Русскую классическую и современную прозу
- Новостные статьи
- Тысячи диалогов (датасет RLDD)
- Научно-популярные и исторические тексты
Идеально подходит для быстрой генерации текста, помощи в творчестве и встраивания в приложения с ограниченными ресурсами.
2. Возможности
| Область | Что умеет |
|---|---|
| ✍️ Генерация текста | Связные рассказы, стихи, новости, ответы на вопросы |
| 💬 Диалог | Поддерживает беседу (вопрос-ответ, реплики) |
| ⚡ Скорость | ~40–60 токенов/сек на CPU, до 200+ токенов/сек на GPU |
| 🧠 Память | Около 500 МБ RAM в режиме инференса |
| 🌍 Язык | Только русский (словарь 32000 BPE-токенов) |
| 🔓 Открытость | Полный код и веса под лицензией MIT |
3. Быстрый старт
Установка
pip install transformers torch
Пример использования
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("ваш_профиль/RUcover-Lite-Mini")
model = AutoModelForCausalLM.from_pretrained("ваш_профиль/RUcover-Lite-Mini")
text = "Привет, как дела?"
inputs = tokenizer(text, return_tensors="pt")
outputs = model.generate(**inputs, max_length=50)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
3. Технические характеристики
| Параметр | Значение |
|---|---|
| Архитектура: | Transformer Decoder (RoPE + SwiGLU + RMSNorm) |
| Параметры: | ~10 млн |
| Слои: | 6 |
| Размер эмбеддинга: | 384 |
| Голов внимания: | 6 |
| Размер FFN: | 1536 |
| Длина контекста: | 1024 токена |
| Словарь: | 32000 (BPE) |
| Функция активации: | SwiGLU |
| Нормализация: | RMSNorm |
| Позиционное кодирование: | RoPE |
4. Схема работы
[Входной текст]
│
▼
┌─────────────┐
│ BPE токенизатор │ → [101, 452, 890, ...]
└─────────────┘
│
▼
┌─────────────┐
│ Token Embedding │ → [batch, seq_len, 384]
└─────────────┘
│
▼
┌─────────────────────────────────────────┐
│ 6× Transformer Block │
│ ┌───────────┐ ┌───────────────┐ │
│ │ MultiHead │ │ RMSNorm │ │
│ │ (RoPE) │ │ + Residual │ │
│ └───────────┘ └───────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────┐ ┌───────────────┐ │
│ │ SwiGLU │ │ RMSNorm │ │
│ │ FFN │ │ + Residual │ │
│ └───────────┘ └───────────────┘ │
└─────────────────────────────────────────┘
│
▼
┌─────────────┐
│ RMSNorm │
└─────────────┘
│
▼
┌─────────────┐
│ Language │ → [vocab_size] probabilities
│ Head │
└─────────────┘
│
▼
[следующий токен] → повторяется авторегрессивно
Краткий алгоритм:
- Токенизируем входной текст.
- Превращаем токены в векторы (эмбеддинги).
- Прогоняем через 6 слоёв внимания и FFN (с остаточными связями и нормализациями).
- Получаем распределение вероятностей следующего токена.
- Выбираем токен (жадно или случайно с температурой).
- Добавляем его к входу и повторяем шаги 2–6 до нужной длины.
5. Планы на будущее
- Увеличение размера модели до 50–100 млн параметров.
- Дообучение на корпусе Taiga (> 2 ГБ).
- Поддержка инструкционного формата (instruction tuning).
- Квантизация (int8) для мобильных устройств.
- Выпуск готового Gradio-чата на Hugging Face Spaces.
- API для удалённого вызова (через Inference Endpoints).
- Умение писать код P.S. Все это ждите в RuCover_lite_mini CODE Edition или RuCover_nano
6. Интеграция с Hugging Face API и локальное использование
6.1 Установка зависимостей
pip install torch tokenizers
6.2 Загрузка модели и токенизатора из этого репозитория
import torch
from tokenizers import Tokenizer
from model import RUcoverLiteMini
from config import RUcoverConfig
# Загрузка токенизатора
tokenizer = Tokenizer.from_pretrained("ваш_логин/RUcover-Lite-Mini")
# Загрузка конфигурации и модели
config = RUcoverConfig()
model = RUcoverLiteMini(config)
# Загрузка весов
model.load_state_dict(torch.load("rucover_lite_mini.pt", map_location="cpu"))
model.eval()
6.3 Функция генерации
def generate_text(prompt, max_new_tokens=80, temperature=0.8, top_k=40):
input_ids = tokenizer.encode(prompt).ids
input_tensor = torch.tensor([input_ids])
for _ in range(max_new_tokens):
with torch.no_grad():
logits = model(input_tensor)
logits = logits[0, -1, :] / temperature
# Top-k фильтрация
top_k_vals, top_k_idx = torch.topk(logits, top_k)
logits = torch.full_like(logits, -float('inf'))
logits[top_k_idx] = top_k_vals
probs = torch.softmax(logits, dim=-1)
next_token = torch.multinomial(probs, 1)
input_tensor = torch.cat([input_tensor, next_token.unsqueeze(0)], dim=1)
return tokenizer.decode(input_tensor[0].tolist())
6.4 Пример использования
prompt = "Почему небо голубое?"
answer = generate_text(prompt, max_new_tokens=50)
print(answer)
📄 Лицензия
MIT License — свободно используйте, модифицируйте и распространяйте.
🙏 Благодарности
- Hugging Face за экосистему.
- Авторам датасетов RLDD, Taiga, Lenta, Fontanka, Arzamas.
- Сообществу российских NLP-разработчиков.