Проект tiny-vllm — это легковесный движок для инференса LLM на C++ и CUDA, младший брат vLLM. Автор ведёт пошаговый курс, где объясняет реализацию с нуля: от разбора формата весов до запуска ответов на несколько запросов параллельно.
LLM — это просто файл с float-числами (весами), полученными во время обучения. Чтобы модель заработала, нужна программа, которая загрузит эти веса, выполнит операции (вроде умножения матриц) и превратит промпт в текст. Именно это и делает inference-сервер. CUDA позволяет запускать матему на GPU — для LLM это критично, потому что там сплошные dot-продукты.
Для примера автор берёт Llama 3.2 1B Instruct с Hugging Face. Веса хранятся в формате Safetensors. Файл состоит из трёх частей: 8 байт — размер заголовка, сам заголовок (JSON с описанием всех тензоров: dtype, shape, offsets), и сырые данные тензоров. dtype для этой модели — BF16.
Далее — подробный разбор, как устроены числа с плавающей точкой. На примере float16 (5 бит экспонента, 10 бит дробная часть) автор руками переводит 12.34 в двоичный вид, показывает потерю точности (получается 12.3359). Затем объясняет, почему BF16 (8 бит экспонента, 7 бит дробная часть) удобнее для инференса: у него такой же диапазон, как у 32-битного float, а точности хватает на практике.
Параллельно автор разбирает архитектуру Llama. В ней 16 слоёв, каждый с self-attention (Q, K, V проекции, RoPE, causal mask, softmax) и MLP (gate, up, down проекции + SiLU). Всё это завершается RMSNorm и линейным выходом. Порядок операций не указан в Safetensors, но его можно подглядеть у Sebastian Raschka или в коде Transformers.
Самый важный практический совет: сначала заточить код под одну модель, а потом обобщать. Иначе рискуете утонуть в абстракциях. Автор тестирует всё на Linux, CUDA Toolkit 13.1, GCC 15.2.1, AMD Ryzen 7 9800X3D и NVIDIA RTX 5090. Единственная внешняя зависимость — nlohmann/json 3.12.0.
Проект открыт для пул-реквестов. Если интересно — можно форкнуть и адаптировать под свою конфигурацию. Автор обещает, что все математические идеи выведут с нуля, «just-in-time» — по ходу кода.