Skip to content

guozhihao-224/AlloyForge

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

8 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

AlloyForge

ๅŸบไบŽ 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 ๅ›ข้˜Ÿ
  • ๆ‰€ๆœ‰ๅผ€ๆบๆจกๅž‹็š„่ดก็Œฎ่€…

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages