Оптимизация бюджетных LLM с помощью Rust и Candle: обзор смарт-обвязки | AiManual
AiManual Logo Ai / Manual.
17 Июн 2026 Инструмент

Выжать соки из маленькой LLM: как Rust и Candle превращают бюджетные модели в зверей

Разбираемся, как библиотека Candle на Rust выжимает максимум из маленьких моделей: квантование, скорость, малый footprint. Сравнение с llama.cpp и Ollama.

Реклама
cliv1

Допустим, у вас есть TinyLlama-1.1B или Phi-3.5-mini. На бумаге они шустрые. На практике под Python с Transformers они жрут 6 ГБ ОЗУ и выдают токен в секунду на старом ноутбуке. Знакомо? Руки чешутся выкинуть PyTorch к чертям и написать всё на C. Но C — это боль. А есть ли золотая середина?

Есть, и она написана на Rust. Встречайте Candle — не совсем фреймворк, не просто биндинг, а смарт-обвязка, которая позволяет запускать языковые модели на чём угодно: от сервера с GPU до бортового компьютера на Raspberry Pi. Никакого рантайма на Python, никаких гигабайтов зависимостей — только голый металл.

Что под капотом: минимум абстракций, максимум контроля

Candle — это ML-фреймворк от команды Hugging Face, написанный на Rust. Он не тащит за собой Python, не требует CUDA toolkit (хотя умеет в CUDA и Metal). Его фишка — zero-cost абстракции и поддержка квантования прямо из коробки. Вы можете загрузить модель в формате safetensors, натравить на неё квантование 4-bit через bitsandbytes или GGML — и получить инференс на CPU с скоростью, о которой Python может только мечтать.

Но настоящая магия — это не сам Candle, а экосистема вокруг него: candle-transformers, candle-llama, candle-qwen2 и десятки других крейтов. Они реализуют архитектуры моделей (от LLaMA до Qwen2) с полной поддержкой kv-кеширования, RoPE, top-k/sampling — всего, что нужно для продакшена. И всё это без единой строчки на Python.

Бонус: Candle можно скомпилировать в WebAssembly и запустить в браузере. Как вам такое? Мы уже показывали подобное для BERT — принцип тот же.

Candle vs другие: кто кого?

На рынке локального инференса три кита: llama.cpp, Ollama и Transformers (Python). У всех свои плюсы, но Candle выбивается за счёт Rust.

ИнструментЯзыкFootprintКвантованиеГибкость
llama.cppC++Малый (3 MB)GGUF, 2-8 bitСредняя (только C++)
OllamaGo + обёрткаСредний (~100 MB)GGUF (через llama.cpp)Высокая (REST API)
Transformers (PyTorch)PythonОгромный (1+ GB)bitsandbytes, GPTQОчень высокая
CandleRustМинимальный (1-2 MB)Встроенное 4-bit, GGUFВысокая (Rust-API, WASM)

llama.cpp — зверь, но он на C++. Если ваш проект уже на Rust, тащить C++ код через FFI — то ещё удовольствие. Ollama удобен для быстрого старта, но он тяжёлый и не даёт тонкого контроля. А Python… ну, если вам нужно переписать критический код на Rust, мы уже обсуждали эту тему.

С Candle вы получаете родной Rust-интерфейс, никаких накладных расходов на биндинги и возможность компилировать под любую платформу, включая bare-metal.

Пальцем в небо: пример запуска Phi-3.5 через Candle

Хватит теории. Добавим Candle в Cargo.toml и запустим инференс. Работает это так:

use candle_core::{Device, Tensor};
use candle_transformers::models::phi3;
use hf_hub::api::sync::Api;

fn main() -> Result<(), Box> {
    let api = Api::new()?;
    let model_id = "microsoft/Phi-3.5-mini-instruct".to_string();
    let repo = api.model(model_id);
    let model_path = repo.get("model.safetensors")?;
    let tokenizer_path = repo.get("tokenizer.json")?;

    let device = Device::Cpu;
    let model = phi3::Model::new(&model_path, &device)?;
    // ... токенизация, генерация
    Ok(())
}

Код компактный, без магии. Модель загружается напрямую в тензоры, квантование включается флагом. На CPU с 4 ядрами Phi-3.5-mini (3.8B параметров) выдаёт ~12 токенов/с в квантовании 4-bit. Для сравнения: на Python с тем же квантованием — 4-5 токенов/с. Выигрыш в 2-3 раза — и это без оптимизации кода.

А если добавить --features metal на MacBook с M-чипом, скорость взлетает до 45-50 токенов/с. Сравните с OpenCL-версией llama.cpp — они рядом, но Candle проще встраивается в ваш existing Rust-проект.

Где Candle реально выручает: сценарии для «бюджетников»

Маленькие модели (1-3B) часто страдают от неэффективной реализации токенизатора и матричных умножений. Candle решает это за счёт оптимизированных ядер и поддержки смешанной точности (FP16 + FP32). Вот где это даёт профит:

  • Локальные ассистенты на Raspberry Pi 5 — модель Gemma-2B в 4-bit съедает всего 1.2 ГБ ОЗУ и выдаёт 8 токенов/с. Хватит для базового чат-бота.
  • Embedding-сервисы — если вам нужно генерировать эмбеддинги для семантического поиска, Candle с LaBSE или E5 работает быстрее Python-аналогов в 3-4 раза.
  • Кодинг-агенты — помните vtcode с AST-разбиением? Так вот, бэкенд на Rust + Candle для дообученной DeepSeek-V4 Flash (квантованной) даёт экономию не только токенов, но и времени инференса.

Словом, Candle — это не «ещё одна обёртка», а полноценный инструмент для тех, кто не хочет мириться с компромиссами Python, когда речь заходит о производительности.

Недостатки: честно о том, что бесит

Было бы наивно думать, что всё идеально. Первое: документация. Она есть, но примеры часто разбросаны по тестам и примерам в репозитории. Найти, как правильно сделать top-p sampling — задача с подвохом. Второе: поддержка моделей. Хотя Candle покрывает 80% популярных архитектур, кастомные модели с нестандартными слоями придётся реализовывать ручками. Третье: сообщество всё ещё малочисленное — если в llama.cpp на любой баг находится фикс за пару часов, то тут иногда ждать приходится неделями.

Но для бюджетных моделей (до 3-4B параметров) Candle — это, пожалуй, лучший выбор. Он легче, быстрее и безопаснее подавляющего большинства альтернатив. Особенно если вы пишете на Rust.

Последний совет: не пытайтесь обернуть в Candle всё подряд. Для 70B моделей llama.cpp остаётся королём. А вот для вашего первого локального ассистента на базе Qwen2.5-3B — дерзайте. Вы удивитесь, насколько шустро может крутиться даже на старом Core i5.

Подписаться на канал