1. 为什么是 Candle?(三条硬理由)
Serverless & 轻量部署
传统 Python 生态在函数冷启动/GIL/体积上常见掣肘。Candle 是纯 Rust 二进制,可将推理程序打包成一个小体积可执行文件,非常适合边缘侧 & Serverless。端到端性能 & 多后端
- CPU:x86 可选 MKL;macOS 用 Accelerate;
- GPU:CUDA(含 NCCL 多卡);
- WASM:浏览器内直接推理,官方已给出多个可跑的演示。
这意味着一套代码可以从浏览器 → 边缘 → 服务器无缝横跨。
- 生态 & 兼容
- 内置模型覆盖 LLaMA/Mistral/Mixtral/Gemma/Phi/Stable Diffusion/SAM/CLIP/BLIP/TrOCR/Whisper 等;
- 量化兼容 llama.cpp 格式;
- 读写 safetensors、npz、ggml、PyTorch 权重;
- 能嵌入自定义 CUDA 内核,甚至直接用 FlashAttention v2。
一句话:“Rust 的生产级推理/训练底座 + 现成的大模型/视觉模型/音频模型 + 浏览器直跑”。
2. 三分钟上手:从 Hello Tensor 到 GPU/浏览器
2.1 Hello Tensor(CPU)
use candle_core::{Device, Tensor};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let device = Device::Cpu;
let a = Tensor::randn(0f32, 1., (2, 3), &device)?;
let b = Tensor::randn(0f32, 1., (3, 4), &device)?;
let c = a.matmul(&b)?;
println!("{c}");
Ok(())
}
运行 cargo run
,即可看到形如 Tensor[[2, 4], f32]
的输出。
2.2 切换到 CUDA(单卡)
- let device = Device::Cpu;
+ let device = Device::new_cuda(0)?;
构建时加上 --features cuda
(若装有 cuDNN,可再加 --features cudnn
)。
2.3 浏览器内跑 LLaMA/Whisper(WASM)
以 LLaMA2 wasm 示例为例:
cd candle-wasm-examples/llama2-c
wget https://huggingface.co/spaces/lmz/candle-llama2/resolve/main/model.bin
wget https://huggingface.co/spaces/lmz/candle-llama2/resolve/main/tokenizer.json
trunk serve --release --port 8081
# 浏览器打开 http://localhost:8081/
无需后端,直接在浏览器里文本生成;Whisper/T5/SAM 等也有同类 Demo。
3. 可直接复用的“场景模板”
3.1 低成本文本推理服务(通用/代码/多语)
- 语言模型:LLaMA v1/v2/v3、Mistral、Mixtral、Gemma、Phi、StableLM、StarCoder/2、Qwen1.5、Yi、RWKV 等;
- 量化版(兼容 llama.cpp):在 CPU/小显存机器上也能跑。
部署套路:Candle +safetensors/ggml
权重 → 启动命令行/HTTP 服务 → Nginx 反代/Serverless。
3.2 文生图 & 视觉(AIGC/理解/分割)
- Stable Diffusion(1.5/2.1/XL/Turbo)、Wuerstchen;
- 视觉理解:CLIP/BLIP/DINOv2/SegFormer/YOLO/SAM;
典型用法:批量生成电商图、前端交互抠图(SAM)、多模态检索(CLIP)。
3.3 语音(ASR/TTS/压缩)
- Whisper(转写)、Parler-TTS/MetaVoice(TTS)、EnCodec(高质量音频压缩)。
边缘侧:浏览器或本地应用里就能跑 ASR/TTS,隐私敏感场景很友好。
4. 从 PyTorch 迁移:速查对照表
任务 | PyTorch | Candle |
---|---|---|
创建张量 | torch.Tensor([[1,2],[3,4]]) |
Tensor::new(&[[1f32, 2.],[3., 4.]], &Device::Cpu)? |
零张量 | torch.zeros((2,2)) |
Tensor::zeros((2,2), DType::F32, &Device::Cpu)? |
切片 | x[:, :4] |
x.i((.., ..4))? |
变形 | x.view((2,2)) |
x.reshape((2,2))? |
矩阵乘 | a.matmul(b) |
a.matmul(&b)? |
设备迁移 | x.to("cuda") |
x.to_device(&Device::new_cuda(0)?)? |
精度转换 | x.to(torch.float16) |
x.to_dtype(&DType::F16)? |
保存/加载 | torch.save(...) / torch.load |
safetensors::save(...) / safetensors::load(..., &device) |
迁移 Tips:
- 先把 PyTorch 权重导出为 safetensors;
- 对齐层/权重命名与 shape;
- 先在 CPU 通了,再切 GPU/多卡/量化。
5. 进阶实践:性能与工程化
5.1 三板斧:数据类型、算子、KV/注意力优化
- 在不损失精度的前提下,优先 F16/BF16;
- 用 candle-flash-attn(FlashAttention v2) 优化注意力;
- 合理利用 KV Cache、分页注意力或稀疏注意力(取决于模型实现)。
5.2 CUDA & 多卡
- 构建开启
--features cuda
; - 多卡通信依赖 NCCL;
- 对大型权重,提前本地化 + 分块加载,降低首次延迟。
5.3 量化与小机器可用性
- 直接复用 llama.cpp 量化权重(如 q4/q5/q8);
- CPU-only 场景用量化 + F16 混合能显著降内存/提升吞吐。
5.4 WASM 前端与边缘推理
- 适合隐私/离线需求(会议纪要转写、图片分割交互等);
- 结合
trunk
一键本地预览; - 按需裁剪词表与权重体积,优化首包下载与首次渲染时间。
6. 常见报错与“秒级定位”清单
mkl/accelerate 链接缺符号
extern crate intel_mkl_src;
/extern crate accelerate_src;
LLaMA 权限 401
- 先在 Hugging Face 接受协议 & 配置 token。
FlashAttention 编译缺少 cutlass
git submodule update --init
。
nvcc 与 gcc-11 不兼容
- 安装 gcc-10,
NVCC_CCBIN=/usr/lib/gcc/.../10
.
- 安装 gcc-10,
WSL 读模型极慢
- 避免从
/mnt/c
读取,改放 WSL 本地盘。
- 避免从
Windows 找不到 CudaRC 模块
- 将
nvcuda.dll
、cublas64_12.dll
、curand64_10.dll
放到 PATH 并按需重命名。
- 将
定位堆栈
RUST_BACKTRACE=1
。
7. 与其它 Rust ML 框架如何选
- dfdx:类型级形状检查,更“学术范”;对新人上手略陡。
- burn:通用框架,多后端,适合从零训练/研究型项目。
- tch-rs:Torch 的 Rust 绑定,功能强但体积与依赖重。
- Candle:落地友好、模型覆盖广、权重格式兼容强、WASM/量化/FlashAttn/多卡齐活,非常适合生产推理与端到端应用。
经验法则:
- 生产推理/跨端部署优先 Candle;
- 深入类型系统/教学范式可看 dfdx;
- 已有 Torch 资产想直接复用则 tch-rs;
- 从零搭训练流水线且不介意体积,burn 也不错。
8. 一键起步:三个可复制的“最小可用”范式
8.1 CLI 推理服务(CPU/量化优先)
- 选择量化 LLaMA/Mistral;
cargo run --example quantized --release
;- 用 Nginx 包一层 HTTP,Serverless 也能带起来。
8.2 浏览器侧交互分割(SAM)
- 拉取
segment-anything
wasm 示例; - 前端选择框/点提示 → wasm 执行 mask → Canvas 显示;
- 无需把图片发服务器,体验“所见即所得”。
8.3 文生图/图文混合(SDXL + CLIP)
- 服务器上跑 SDXL(GPU/F16),产物缓存;
- 前端用 CLIP 做相似图搜/文图检索;
- 形成创作—检索—改图的闭环。
9. FAQ:一些常被问到的细节
- 训练 vs. 推理:Candle 支持训练,但更侧重“小而强的推理”;训练建议从简单任务或微调(LoRA)开始。
- 生态是否封闭:非也。格式开放、示例丰富,配合
safetensors/tokenizers
等 Rust 生态非常顺滑。 - 跨平台差异:macOS/Windows/Linux 都OK,注意各自的 BLAS/CUDA 安装细节。
- 学习成本:API 风格贴近 PyTorch,上手难度不大;WASM/Docker/多卡这些更多是工程能力问题。
10. 结语:把“快、稳、小”落到底
Candle 的定位很清晰:让工程团队能快速把 AI 能力“装进”任何地方——浏览器、微服务、边缘设备、Serverless 函数、甚至离线工具。靠 Rust 带来的稳与快,再加上官方示例与大模型覆盖度,能让你在大部分落地场景里省去一大段“环境/体积/依赖”纠缠。
如果你的目标是更低成本、更短上线路径和更可控的运行时,那 Candle 值得一试。
附:你可以立刻尝试的 5 个动手任务
- 在 CPU-only 机器上跑一版 量化 LLaMA 文本生成。
- 用 Whisper wasm 做一个“浏览器内实时转写”小工具。
- 结合 SAM 做一个“前端交互抠图”小页,体验低延迟。
- 把 SDXL 跑在一张 24GB 显卡上,做一个“批量图生成 + 相似图检索(CLIP)”的 Demo。
- 用
safetensors
把你现有的 PyTorch 权重导入 Candle,打包一个单文件可执行推理工具。