candle
Framework minimalista de deep-learning da Hugging Face em Rust - tensores, módulos nn e inferência de transformadores sem Python.
Receita
use candle_core::{Device, Tensor};
use candle_nn::{linear, Linear, Module, VarBuilder};
fn mlp(vb: VarBuilder) -> candle_core::Result<Linear> {
linear(768, 128, vb.pp("proj"))
}
fn forward(x: &Tensor, layer: &Linear) -> candle_core::Result<Tensor> {
layer.forward(x)
}Quando usar isto:
- Executar pesos de transformadores compatíveis com HF em Rust puro
- Prototipar modelos pequenos com APIs de tensor familiares
- Entregar inferência onde o overhead do Python/GIL é inaceitável
- Ensinar mecânicas de DL com código Rust legível
Exemplo de Trabalho
use candle_core::{Device, Tensor};
use candle_nn::{linear, Linear, Module, VarBuilder, VarMap};
fn main() -> candle_core::Result<()> {
let device = Device::Cpu;
let varmap = VarMap::new();
let vb = VarBuilder::from_varmap(&varmap, candle_core::DType::F32, &device);
let layer = linear(4, 2, vb.pp("fc"))?;
let x = Tensor::new(&[[1.0f32, 0.5, -0.2, 3.0]], &device)?;
let y = layer.forward(&x)?;
println!("output shape: {:?}", y.shape());
Ok(())
}O que isto demonstra:
VarMap+VarBuilderpara parâmetros treináveis- Uma passagem forward de camada linear na CPU
- Inspeção de shape antes do softmax ou loss downstream
Mergulho Profundo
Como Funciona
candle-coreforneceTensor,Devicee autodiff (controlado por feature).candle-nnagrupa camadas, otimizadores e utilitários de loss.candle-transformershospeda definições de modelos que correspondem às configurações da HF.- Pesos são carregados de safetensors ou dumps compatíveis com numpy.
Mapa de Crates
| Crate | Papel |
|---|---|
candle-core | Matemática de Tensor, dispositivos |
candle-nn | Camadas, utilitários de treinamento |
candle-transformers | BERT, Llama, etc. |
Armadilhas
- Mudanças na API entre versões menores - fixe tags git ou versões em produção. Correção: trave
Cargo.locke CI contra exemplos da HF. - Dtype errado na GPU - kernels f64 podem estar ausentes. Correção: padronize em
F32, a menos que o modelo exija BF16. - Confusão de shape
[batch, seq, hidden]- a atenção falha silenciosamente com bugs de broadcast. Correção: afirme ranks nos limites dos módulos. - Carregar LLM completo na RAM da CPU - pesos de vários GB causam OOM em laptops. Correção: use caminhos GGUF quantizados ou GPU com VRAM suficiente.
- Driver CUDA ausente no contêiner - o runtime falha ou retorna erro tarde. Correção: sonde
Device::cuda_if_available()na inicialização e registre a escolha.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| burn | Pesquisa de treinamento agnóstico de backend | Você quer ports de transformadores mantidos pela HF |
| ort | ONNX exportado de qualquer framework | Você precisa de treinamento em Rust |
| tch (bindings PyTorch) | Precisa executar grafos PyTorch arbitrários | Você quer dependências puramente Rust |
| Python HF | Maior acervo de modelos e treinadores | Implantação edge em binário único |
FAQs
O Candle pode treinar modelos grandes?
Possível para modelos pequenos/médios; o treinamento de LLMs grandes ainda geralmente ocorre em Python, e os pesos são convertidos para inferência no Candle.
Como carrego pesos da HF?
Use os construtores de modelo do candle-transformers mais os arquivos safetensors do repositório do modelo - combine os nomes de arquitetura do config.json.
CPU vs CUDA?
Habilite o recurso cuda em candle-core e use Device::new_cuda(0)? quando o hardware estiver disponível.
O Candle suporta quantização?
GGUF e checkpoints quantizados são comuns para caminhos de inferência de LLM - siga os exemplos do Candle da HF para cada família de modelo.
Como depuro NaNs?
Habilite o clipping de gradiente, diminua a taxa de aprendizado e inspecione as estatísticas do tensor após cada camada nos loops de treinamento.
Posso exportar para ONNX?
O treinamento no Candle ainda pode exportar através de ferramentas separadas; muitas equipes treinam em outro lugar e inferem no Candle a partir de pesos publicados.
Como isso se compara ao Burn?
O Candle é focado na HF para transformadores; o Burn é de propósito geral com backends plugáveis - veja burn.
Autodiff está pronto para produção?
Adequado para treinamento em escala de pesquisa; verifique a numerologia em comparação com o PyTorch em um lote de referência antes de confiar nas curvas de loss.
Como agrupo prompts?
Preencha as sequências de tokens, construa máscaras de atenção, execute um forward - combine com Tokenizers.
Segurança de thread?
Compartilhe pesos somente leitura com Arc; o estado por requisição (cache KV) não deve competir entre threads sem sincronização.
Relacionado
- Noções Básicas de ML em Rust - panorama
- burn - framework alternativo
- Inferência e Servir LLMs - padrões de servir
- GPU e Aceleração - backends
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.