xInfer — это библиотека для быстрой реализации LLM-инференса на чистом Rust без зависимостей от Python и PyTorch.
Она решает проблему низкой производительности и большого объема зависимостей, характерных для традиционных решений. xInfer поддерживает высокий уровень производительности с использованием родного Flash Attention и других оптимизаций, позволяя обрабатывать до 197 токенов в секунду на потребительских GPU. Проект будет полезен разработчикам, которым нужна легковесная, кроссплатформенная альтернатива существующим фреймворкам для работы с языковыми моделями.
Запустить xInfer можно несколькими способами: через DEB или npm, также доступны Python биндинги, если потребуется интеграция с Python-окружением. Пользуйся командой, чтобы начать: xinfer --m <модель> --kvcache-dtype turbo4 --ui-server. Учти, проект ещё находится на ранней стадии и может иметь ограничения по функционалу и совместимости.

Быстрая инвариантная инференция LLM на чистом Rust. Без PyTorch и Python. Просто быстрая, портативная, готовая к производству инференция.
English | 简体中文
---
## ✨ Зачем нужен xInfer?
| | Характеристика | Детали |
|---|---|---|
| **0️⃣** | Нет зависимостей от Python | Чистый Rust бэкенд – без PyTorch, без CUDA Python библиотек |
| **⚡** | Быстрота | Нативное Flash Attention, FlashInfer, CUDA Graph, непрерывная пакетная обработка, кэширование префиксов, раздельная дисагрегация PD. До **197 токенов/с** для моделей `30B+` на потребительских GPU |
| **🪶** | Компактность | Основная логика планирования + внимания в **< 5 000 строках** Rust |
| **🌍** | Кроссплатформенность | CUDA (Linux/Windows), Metal (macOS). Один и тот же бинарник, один и тот же API |
| **🏭** | Готов к производству | APIs, совместимые с OpenAI/Anthropic, встроенный веб-интерфейс в стиле ChatGPT, вызов инструментов MCP, структурированные выводы, конечные точки для встраивания и токенизации, многотокенная предсказания (MTP) |
| **🗜️** | Агрессивное сжатие KV | TurboQuant (`2–4 бит` KV-кэша) увеличивает контекст до **4.3×** с минимальной потерей качества. Запускайте модели MoE `30B+` с **миллионами токенов контекста** на одном 24/32 ГБ GPU |
| **🔥** | V100 + NVFP4 | Первый NVFP4 + низкобитный KV-кэш на V100 – без необходимости в оборудовании FP4, согласованный вывод на старых GPU |
| **🐍** | Легкие Python биндинги | Дополнительный PyO3 wheel, когда нужен Python-ориентированный интерфейс |
---
## 📽️ Демо
---
## 🚀 Быстрый старт
### 📦 Установка
**Вариант 1 — Установить DEB или Python пакет**
```bash
curl -sSL https://guoqingbao.github.io/xinfer/install.sh | bash
```
**Вариант 2 — npm**
```bash
npm install -g xinfer-ai
```
---
### ▶️ Запуск
**С использованием ID модели HuggingFace:**
```bash
xinfer --m Qwen/Qwen3.6-27B-FP8 --kvcache-dtype turbo4 --ui-server
```
**С использованием локального пути модели:**
```bash
xinfer --m /home/Qwen3.6-35B-A3B --d 0,1 --ui-server
```
**Использование Python:**
```bash
# python3 -m xinfer.chat
python3 -m xinfer.server --m Qwen/Qwen3.6-27B-FP8 --kvcache-dtype turbo4 --ui-server
```
**Предполагающее декодирование (MTP & DFlash2)**
Встроенный MTP (модель должна включать MTP головы):
```bash
xinfer --m Qwen/Qwen3.5-35B-A3B --d 0,1 --ui-server --num-speculative-tokens 3
```
Внешняя модель DFlash2:
```bash
xinfer --m Qwen/Qwen3.8-... --d 0,1 --ui-server \
--draft-model
--num-speculative-tokens 7
```
См. [docs/speculative_decoding.md](docs/speculative_decoding.md) для деталей.
> **Совет:** Открой `http://IP:8001` для встроенного чата UI или используй `http://IP:8000/v1/` как основной API адрес.
---
### 🗜️ Сжатие KV-кэша
Добавь `--kvcache-dtype` для сжатия KV-кэша и увеличения длины контекста:
| Флаг (`--kvcache-dtype`) | Сжатие | Качество | Требования к GPU |
|---|---|---|---|
| _(по умолчанию)_ | 1× (BF16) | Базовый уровень | Все |
| `fp8` | **2×** | Почти без потерь | SM70+ / Apple M1 |
| `turbo8` | **2.6×** | 79–100% пропускной способности | SM70+ / Apple M1 |
| `turbo4` | **3.7×** | Лучшая сбалансированность | SM70+ / Apple M1 |
| `turbo3` | **4.7×** | Максимальное сжатие | SM70+ |
---
## 📈 Производительность
> Тестирование проводилось на **V100-32G**, **A100-40G**, **Hopper-80G** и **RTX 5090**
| Модель | Формат | Размер | Скорость декодирования (без MTP) |
|---|---|---|---|
| Ministral-3-3B (**Мультимодальная**) | ISQ (BF16→Q4K) | 3B | **193.67** токенов/с |
| Qwen3-VL-8B-Instruct (**Мультимодальная**) | Q8_0 | 8B | **112.51** токенов/с |
| Llama-3.1-8B | ISQ (BF16→Q4K) | 8B | **133.10** токенов/с |
| DeepSeek-R1-0528-Qwen3-8B | Q4_K_M | 8B | **139.25** токенов/с |
| GLM-4-9B-0414 | Q4_K_M | 9B | **77.48** токенов/с |
| QwQ-32B | Q4_K_M | 32B | **46.02** токенов/с |
| **Qwen3-30B-A3B** | NVFP4 | **30B (MoE)** | **197.29** токенов/с (**RTX 5090**) |
| **Qwen3-30B-A3B** | NVFP4 | **30B (MoE)** | **72.86** токенов/с (**V100, программное обеспечение FP4**) |
| **Qwen3-Next-80B** | AWQ | **80B (MoE)** | **90** токенов/с (**Hopper**) |
| **Qwen3.5/3.6/3.8 27B** (**Мультимодальная**) | Q4_K_M/IQ4 | **27B (Плотная)** | **58** токенов/с |
| **Qwen3.5/3.6/3.8 27B** | FP8 | **27B (Плотная)** | **45** токенов/с (**Hopper**) |
| **Qwen3.6-35B-A3B** (**Мультимодальная**) | FP8 | **35B (MoE)** | **120** токенов/с (**Hopper**) |
| **GLM4.7 Flash** | NVFP4 | **30B (MoE)** | **79** токенов/с (**Hopper, программное обеспечение FP4**) |
| **Gemma4-31B** | ISQ (BF16→Q4K) | **31B (Плотная)** | **47** токенов/с (**Hopper**) |
| **Gemma4-26B-A4B** | NVFP4 | **26B (MoE)** | **137.23** токенов/с (**RTX 5090**) |
| **MiniMax-M2.5** | NVFP4 | **229B (MoE)** | **64.50** токенов/с (**Hopper, программное обеспечение FP4, TP=2**) |
Apple Silicon (M4)
| Модель | Размер пакета | Выходные токены | Время (с) | Пропускная способность (токены/с) |
|---|---|---|---|---|
| Qwen3-0.6B (BF16) | 128 | 63488 | 83.13s | 763.73 |
| Qwen3-0.6B (BF16) | 32 | 15872 | 23.53s | 674.43 |
| Qwen3-0.6B (BF16) | 1 | 456 | 9.23s | 49.42 |
| Qwen3-4B (Q4_K_M) | 1 | 1683 | 52.62s | 31.98 |
| Qwen3-8B (Q2_K) | 1 | 1300 | 80.88s | 16.07 |
| Qwen3.5-4B (Q3_K_M) | 1 | 1592 | 69.04s | 23.06 |
| Qwen3.5-2B (NVFP4) | 1 | 1883 | 60.76s | 30.99 |
| Qwen3.5-2B (NVFP4) | 2 | 3942 | 81.96s | 48.10 |
[Полные бенчмарки →](docs/performance.md)
---
## 🧠 Поддерживаемые модели
* ✅ LLaMa (LLaMa2, LLaMa3, **LLaMa4**, IQuest-Coder)
* ✅ Qwen (Qwen2, Qwen3)
* ✅ Qwen2/Qwen3 MoE
* ✅ Qwen3 Next
* ✅ Qwen3.5/3.6/3.8 Плотные/MoE (27B, 35B, 122B, 397B, мультимодальная модель)
* ✅ Qwen3.8-Next/Qwen4
* ✅ Mistral v1, v2
* ✅ Mistral-3-VL Reasoning (3B, 8B, 14B, мультимодальная модель)
* ✅ GLM4 (0414)
* ✅ GLM4 MoE (4.6/4.7)
* ✅ GLM4.7 Flash
* ✅ GLM 5.2 (архитектура DeepSeek V3.2 DSA)
* ✅ DeepSeek V3/R1/V3.2
* ✅ **DeepSeek V4** (поддержка 2-битного ISQ через `--isq w2`)
* ✅ Phi3 / Phi4 (Phi-3, Phi-4, Phi-4-mini и др.)
* ✅ Gemma3/**Gemma4** (мультимодальная модель)
* ✅ Qwen3-VL (Плотная, мультимодальная модель)
* ✅ MiroThinker-v1.5 (30B, 235B)
**Форматы:** Safetensors (BF16, `FP8-blockwise`, GPTQ, AWQ, MXFP4, `NVFP4`) | GGUF (все типы квантования) | `ISQ` (онлайн квантование, включая **2-бит W2** для DeepSeek V4 MoE)
> **DeepSeek V4 Flash + 2-бит ISQ:** `--isq w2` переупаковывает MXFP4 маршрутизируемых экспертов в 2-бит при загрузке. При 2× GPU тензорном параллелизме (`--d 0,1`), веса модели используют около **46 ГБ на GPU** (**46 × 2 ГБ** в сумме).
---
### TurboQuant KV-кэш — Запуск моделей 30B+ на потребительских GPU
TurboQuant сжимает KV-кэш до 2–4 бит с помощью поворота преобразования Уолша-Хадамара + квантования absmax для каждой головы. Максимальные токены контекста с `turbo4`:
| Модель | Бюджет KV | BF16 | turbo4 | Прирост |
|---|---|---|---|---|
| **Qwen3.6-35B-A3B** (NVFP4) | 7 ГБ (24 ГБ GPU) | 700к | **2.7M** | **3.9×** |
| | 15 ГБ (32 ГБ GPU) | 1.5M | **5.8M** | **3.9×** |
| **Qwen3.6-27B** (FP8) | 7 ГБ | 112к | **434к** | **3.9×** |
| | 15 ГБ | 240к | **930к** | **3.9×** |
| **