Допустим, у вас есть 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.cpp | C++ | Малый (3 MB) | GGUF, 2-8 bit | Средняя (только C++) |
| Ollama | Go + обёртка | Средний (~100 MB) | GGUF (через llama.cpp) | Высокая (REST API) |
| Transformers (PyTorch) | Python | Огромный (1+ GB) | bitsandbytes, GPTQ | Очень высокая |
| Candle | Rust | Минимальный (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.