ๅบไบ Candle ็ Rust ๅคๆจกๆๅคงๆจกๅๆจ็ๅบ๏ผไธๆณจไบ้ซๆง่ฝใๆ็จ็ LLM ๆจ็่ฝๅใ
- ๐ ้ซๆง่ฝ๏ผๅบไบ Candle ๆกๆถ๏ผๆฏๆ CPU/CUDA/Metal ๅ ้
- ๐ฏ ๅคๆจกๆ๏ผๆฏๆ่ง่งใ่ฏญ่จๅ่ฏญ้ณๆจกๆ
- ๐ง ๆไบไฝฟ็จ๏ผ็ฎๆด็ API ่ฎพ่ฎก๏ผๅฟซ้ไธๆ
- ๐ก๏ธ ๅ ๅญๅฎๅ จ๏ผๅพ็ไบ Rust ็ๆๆๆ็ณป็ป
- ๐ฆ ่ฝป้็บง๏ผๆๅฐๅไพ่ต๏ผ็ผ่ฏไบง็ฉๅฐๅทง
- โก GPU ๅ ้๏ผๅฏ้ CUDA/Metal ๆฏๆ
- ๐ง ๆณจๆๅไผๅ๏ผๅฏ้ Flash Attention ๆฏๆ
alloyforge/
โโโ Cargo.toml # Workspace ้
็ฝฎ
โโโ crates/ # ๆๆๅบ crate
โ โโโ af-core/ # ๆ ธๅฟๆฝ่ฑกๅฑ
โ โ # - Device/Tensor traits (่ฎพๅคๅๅผ ้ๆฝ่ฑก)
โ โ # - Model trait (ๆจกๅๆฅๅฃ)
โ โ # - ๅบ็ก็ฎๅญ traits (MatmulOps/AttentionOps/RoPE)
โ โโโ af-backend-candle/ # Candle ๅ็ซฏๅฎ็ฐ
โ โ # - ๅฎ็ฐ af-core ็ๆๆ traits
โ โโโ af-ops/ # ้็จ็ฎๅญๅบ
โ โ # - ้ๆ ท็ญ็ฅ (greedy/temperature/top-p/top-k)
โ โ # - ไผๅๅจ (ๆชๆฅ)
โ โโโ af-io/ # I/O ๅทฅๅ
ท
โ โ # - SafeTensors ๅ ่ฝฝ (mmap)
โ โ # - GGUF ๆฏๆ (ๆชๆฅ)
โ โโโ af-tokenizer/ # ๅ่ฏๅจๅฐ่ฃ
โ โ # - tokenizers crate ็็ฎๅๆฅๅฃ
โ โโโ af-modalities/ # ๆจกๆๆฅๅฃ
โ โ # - VisionEncoder/AudioEncoder/Projector traits
โ โโโ af-models/ # ๅ
ทไฝๆจกๅๅฎ็ฐ
โ โ # - Qwen2/Llama/MiniCPM ็ญ
โ โ # - ๅฎ็ฐ af-core::Model trait
โ โโโ af-runtime/ # ่ฟ่กๆถ็ฎก็
โ โ # - Session ไผ่ฏ็ฎก็
โ โ # - ็ๆๅพช็ฏๆงๅถ
โ โ # - ้ๆ ท็ญ็ฅ้ๆ
โ โโโ af-cli/ # ๅฝไปค่กๅทฅๅ
ท
โ โโโ af-server/ # OpenAI ๅ
ผๅฎนๆๅก (ๅฏ้)
โโโ examples/ # ็คบไพไปฃ็
โโโ docs/ # ๆๆกฃ (ๅพ
ๆทปๅ )
[dependencies]
af-runtime = { path = "crates/af-runtime" }
af-backend-candle = { path = "crates/af-backend-candle" }use af_models::qwen2::Qwen2ModelWrapper;
use af_runtime::{SessionBuilder, Request};
use candle_core::{DType, Device};
use std::sync::Arc;
// 1. ๅ ่ฝฝๆจกๅ
let model = Qwen2ModelWrapper::from_pretrained(
"/path/to/Qwen2-0.5B",
DType::BF16,
&Device::Cpu,
)?;
// 2. ๅๅปบไผ่ฏ
let mut session = SessionBuilder::new()
.build(Box::new(model))?;
// 3. ็ๆๆๆฌ
let response = session.generate(Request {
prompt: "ไฝ ๅฅฝ".into(),
max_tokens: 128,
..Default::default()
})?;
println!("Response: {}", response);# ๅบ็ก็ผ่ฏ (CPU)
cargo build --release
# ๅฏ็จ CUDA
cargo build --release --features cuda
# ๅฏ็จ Flash Attention
cargo build --release --features cuda,flash-attn
# ่ฟ่ก CLI
cargo run --bin af-cli --release# ๆฃๆฅๆๆ workspace
cargo check --workspace
# ่ฟ่กๆต่ฏ
cargo test --workspace
# ๆ ผๅผๅไปฃ็
cargo fmt --all
# Lint
cargo clippy --workspace -- -D warnings- ๆ ้็จ่ฎก็ฎๅพ๏ผๅด็ป่ชๅๅฝ LLM ็ๅบๅฎๆง่ก็ฎก็บฟ
- ๅ็ซฏๅฏๆๆ๏ผ้่ฟ trait ๆฝ่ฑก๏ผๆฏๆๅคๅ็ซฏ๏ผ้ป่ฎค Candle๏ผ
- ๆจกๆๅฏๆฉๅฑ๏ผ็ปไธๆฅๅฃ๏ผๆไบๆทปๅ ๆฐๆจกๆ็ผ็ ๅจ
- ๆง่ฝไผๅ ๏ผKV cacheใFlash Attentionใ้ๅ็ญไผๅ
- ไพ่ตๅ็ฝฎ๏ผๆฝ่ฑกๅจๅบๅฑ๏ผๅฎ็ฐไพ่ตๆฝ่ฑก
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Layer 4: Application โ ๅบ็จๅฑ
โ - af-cli (ๅฝไปค่ก) โ
โ - af-server (API ๆๅก) โ
โโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Layer 3: Runtime โ ่ฟ่กๆถๅฑ
โ - af-runtime (ไผ่ฏ็ฎก็ใ็ๆๅพช็ฏ) โ
โโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโ
โ โ
โโโโโโโโผโโโโโโโ โโโโโโโโโผโโโโโโโโโโ
โ Layer 2: โ โ Layer 2: โ ๅฎ็ฐๅฑ
โ Models โ โ Operations โ
โ - af-modelsโ โ - af-ops โ
โ (Qwen2็ญ) โ โ - af-io โ
โ โ โ - af-tokenizerโ
โโโโโโโโฌโโโโโโโ โโโโโโโโโฌโโโโโโโโโโ
โ โ
โโโโโโโโโโฌโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Layer 1: Core Abstractions โ ๆฝ่ฑกๅฑ
โ - af-core โ
โ โข Device trait (่ฎพๅคๆฝ่ฑก) โ
โ โข Tensor trait (ๅผ ้ๆฝ่ฑก) โ
โ โข Model trait (ๆจกๅๆฅๅฃ) โ
โ
โ โข MatmulOps/AttentionOps (็ฎๅญ) โ
โโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Layer 0: Backend โ ๅ็ซฏๅฑ
โ - af-backend-candle โ
โ โข ๅฎ็ฐๆๆ core traits โ
โ โข Candle ๆกๆถ้้
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
af-cli, af-server (ๅบ็จ)
โ
af-runtime (่ฟ่กๆถ)
โ โ โ
af-models af-ops af-tokenizer
โ โ โ
af-io af-modalities
โ โ
โโโโโโโโโโโโโโโโโโโโ
โ af-core โ โ ๆๆๆฝ่ฑก้ฝๅจ่ฟ้
โ (ๆ ธๅฟ traits) โ
โโโโโโโโโโคโโโโโโโโโโ
โ
af-backend-candle (ๅ็ซฏๅฎ็ฐ)
ๆทปๅ ๆฐๆจกๅ้ๅธธ็ฎๅ๏ผ
use af_core::{Model, ModelConfig};
use anyhow::Result;
// 1. ๅฎไนไฝ ็ๆจกๅ็ปๆ
pub struct MyCustomModel {
// ๆจกๅๅๆฐ
}
// 2. ๅฎ็ฐ Model trait
impl Model for MyCustomModel {
fn reset_state(&mut self) {
// ้็ฝฎ KV cache ๆๅ
ถไป็ถๆ
}
fn forward_step(&mut self, input_ids: &[u32]) -> Result<Vec<f32>> {
// ๅฎ็ฐๅๅไผ ๆญ
// ่ฟๅ vocab_size ้ฟๅบฆ็ logits
todo!()
}
fn config(&self) -> Option<ModelConfig> {
Some(ModelConfig {
vocab_size: 32000,
max_position_embeddings: 2048,
hidden_size: 768,
num_layers: 12,
})
}
}
// 3. ไฝฟ็จไฝ ็ๆจกๅ
let model = Box::new(MyCustomModel { /* ... */ });
let mut session = SessionBuilder::new().build(model)?;ๅ ณ้ฎไผๅฟ๏ผ
- โ
ๅช้ๅฎ็ฐ 2 ไธชๆนๆณ๏ผ
reset_stateๅforward_step - โ ๆ ้ไฟฎๆนๆกๆถไปฃ็ ๏ผๅฎๅ จ่งฃ่ฆ
- โ ่ชๅจ่ทๅพๆๆๅ่ฝ๏ผ้ๆ ทใไผ่ฏ็ฎก็็ญ
- โ ็ฑปๅๅฎๅ จ๏ผ็ผ่ฏๆถๆฃๆฅๆฅๅฃๆญฃ็กฎๆง
- M0: ๅบ็กๆถๆ + Candle ๅ็ซฏ
- ๆ ธๅฟๆฝ่ฑกๅฑ่ฎพ่ฎก๏ผaf-core๏ผ
- Candle ๅ็ซฏ้้ ๏ผaf-backend-candle๏ผ
- Model trait ๅฎไน
- ้ๆ ท็ญ็ฅๅฎ็ฐ๏ผgreedy/temperature/top-p/top-k๏ผ
- Qwen2 ๆจกๅๅฎ็ฐ
- ๆถๆ้ๆ๏ผไพ่ตๅ็ฝฎ๏ผ
- [๐] M1: ๆๆฌ LLM CPU ๆจ็ + KV cache
- Qwen2 ๆจกๅ + KV Cache
- Model trait ๅฎ็ฐ
- ๅฎๆด็ๆๅพช็ฏ๏ผprefill + decode๏ผ
- Tokenizer ้ๆ
- ็ซฏๅฐ็ซฏๆต่ฏ
-
M2: CUDA ๆฏๆ + Flash Attention
- CUDA ๅ็ซฏๆฏๆ
- Flash Attention ้ๆ
- ๆง่ฝๅบๅๆต่ฏ
-
M3: ๅพๅๆจกๆ (CLIP/ViT) + ๅพๆ้ฎ็ญ
- VisionEncoder ๅฎ็ฐ
- ๅพๆๅคๆจกๆๆจกๅ
- LLaVA ้ฃๆ ผๆจกๅๆฏๆ
-
M4: ่ง้ขๆจกๆ + ้ฟไธไธๆไผๅ
- ่ง้ข็ผ็ ๅจ
- ้ฟไธไธๆไผๅ
- ๆตๅผๅค็
-
M5: ้ๅๆฏๆ (int8/int4)
- GPTQ/AWQ ้ๅ
- ๅจๆ้ๅ
- ๆง่ฝ่ฏไผฐ
-
M6: Python ็ปๅฎ + ๆๅกๅ
- PyO3 Python ็ปๅฎ
- OpenAI ๅ ผๅฎน API
- ้จ็ฝฒๆๆกฃ
Apache-2.0
- Hugging Face Candle ๅข้
- ๆๆๅผๆบๆจกๅ็่ดก็ฎ่