Rust 在 AI 基础设施中的崛起:为什么大模型框架纷纷拥抱 Rust

近年来,AI 基础设施经历了飞速的发展。从早期的 Python 原型验证,到如今的工业级生产部署,对性能、安全性和可维护性的要求不断提升。在这个演进过程中,Rust 语言凭借其独特的优势,正在悄然改变 AI 基础设施的底层格局。

如果你关注 AI 领域的技术趋势,你会发现越来越多的关键项目开始使用 Rust——从 HuggingFace 的 tokenizer 到数百个 PyTorch 的底层依赖,从 LLM 推理引擎到向量数据库。本文将深入分析 Rust 为什么在 AI 基础设施中崛起,以及它正在如何重塑这个领域。

Rust 在 AI 领域的现状

谁在使用 Rust?

先看几个标志性的 Rust AI 项目:

项目 领域 Rust 角色 GitHub Stars
Candle LLM 推理框架 纯 Rust 实现 16k+
Mistral.rs LLM 推理引擎 纯 Rust 实现 6k+
Burn 深度学习框架 纯 Rust 实现 10k+
Tokenizers 分词器 Rust 核心 + Python 绑定 9k+
Polars 数据处理 Rust 核心引擎 33k+
Qdrant 向量数据库 纯 Rust 实现 22k+
Lance 列式存储 Rust 核心 4k+
safetensors 安全张量格式 Rust 实现 3k+
Tract ONNX 推理 纯 Rust 实现 3k+
Rerun 可视化日志 Rust 核心 7k+

为什么是现在?

AI 基础设施正在经历三个关键转变,让 Rust 的时机成熟了:

// 1. 推理优化需求激增
// 生产环境中,推理效率和部署简洁性压倒训练灵活性
// Rust 的零成本抽象 + 无 GC 特性完美匹配

// 2. 边缘设备部署
// 从手机到嵌入式设备需要无运行时依赖
// Rust 编译为原生二进制,不依赖 Python runtime

// 3. 安全性和正确性
// 内存安全 + 类型系统在关键基础设施中至关重要
// Rust 的所有权系统从编译层面消除了数据竞争

性能优势:C 和 C++ 的替代者

零成本抽象

Rust 对 AI 工作负载最直接的吸引力就是性能。与 C++ 相比,Rust 在绝大多数场景下性能相当甚至更好,同时提供了更高层次的安全保证。

// Rust 实现矩阵乘法(简化示例)
fn matmul_f32(a: &[f32], b: &[f32], m: usize, n: usize, k: usize) -> Vec<f32> {
    let mut c = vec![0.0f32; m * n];
    for i in 0..m {
        for j in 0..n {
            let sum: f32 = (0..k)
                .map(|l| a[i * k + l] * b[l * n + j])
                .sum();
            c[i * n + j] = sum;
        }
    }
    c
}

SIMD 和向量化

Rust 通过 std::simdportable_simd 提供平台无关的 SIMD 操作:

use std::simd::f32x8;

// SIMD 优化的向量点积
fn dot_product_simd(a: &[f32], b: &[f32]) -> f32 {
    let chunks = a.len() / 8;
    let mut sum = f32x8::splat(0.0);

    for i in 0..chunks {
        let va = f32x8::from_slice(&a[i * 8..]);
        let vb = f32x8::from_slice(&b[i * 8..]);
        sum += va * vb;
    }

    // Sum reduction
    sum.reduce_sum()
}

内存效率

AI 模型的核心是张量运算,这意味着大量的内存访问。Rust 的所有权系统让开发者能够精确控制内存布局,减少缓存未命中:

// 连续内存布局:更适合 SIMD 和缓存
#[repr(C)]
struct TensorView<'a, T> {
    data: &'a [T],
    shape: &'a [usize],
    strides: &'a [usize],
}

// 与 PyTorch 的 Tensor 元数据等价
// 但 Rust 版本零开销,编译时验证

安全保证:消除内存错误

内存安全的代价

AI 框架(尤其是 PyTorch、TensorFlow)C++ 核心中内存安全问题层出不穷。Rust 的所有权模型从根本上解决了这些问题:

// C++ 中的典型 Bug
// float* data = new float[size];
// delete[] data;
// data[0] = 1.0f;  // Use-after-free!

// Rust 中的等价代码 — 编译失败
// let data = vec![0.0f32; size];
// drop(data);
// data[0] = 1.0;  // ❌ borrow of moved value

并发安全

在 AI 推理中,并行计算是常态。Rust 的 Send + Sync trait 在编译时保证线程安全:

use std::sync::Arc;
use std::thread;

// 安全并发:多个线程同时读取模型权重
struct InferenceEngine {
    weights: Arc<Vec<f32>>,
    config: Arc<InferenceConfig>,
}

impl InferenceEngine {
    fn parallel_infer(&self, inputs: Vec<Input>) -> Vec<Output> {
        inputs.into_par_iter()
            .map(|input| self.forward(&input))
            .collect()
    }
}

// 编译器保证:Arc<T> 是 Send + Sync
// 数据竞争在编译时就被消除了

Python 生态的完美互补

PyO3 和 maturin:Rust → Python 绑定

Rust 在 AI 领域的崛起不是因为要取代 Python,而是成为 Python 的"性能后盾"。PyO3 + maturin 让这个结合变得异常简单:

use pyo3::prelude::*;

// 在 Rust 中实现高性能 tokenizer
#[pyclass]
struct FastTokenizer {
    vocab: HashMap<String, u32>,
}

#[pymethods]
impl FastTokenizer {
    #[new]
    fn new(vocab: HashMap<String, u32>) -> Self {
        FastTokenizer { vocab }
    }

    // 比纯 Python 快 10-100x 的方法
    fn encode(&self, text: &str) -> Vec<u32> {
        text.split_whitespace()
            .map(|w| self.vocab.get(w).copied().unwrap_or(0))
            .collect()
    }
}

#[pymodule]
fn fast_tokenizer(m: &Bound<'_, PyModule>) -> PyResult<()> {
    m.add_class::<FastTokenizer>()?;
    Ok(())
}
# 一行命令构建
maturin develop

性能对比

# Python 实现
def slow_tokenize(text, vocab):
    return [vocab.get(w, 0) for w in text.split()]

# 调用 Rust 实现
from fast_tokenizer import FastTokenizer

tokenizer = FastTokenizer(vocab)
tokens = tokenizer.encode("Hello world")

# 速度对比(100 万次调用):
# Python: 12.4s
# Rust:   0.18s ← 69x 更快

npy / safetensors:序列化格式

HuggingFace 的 safetensors 格式使用 Rust 重写其核心序列化逻辑,实现了比 pickle 更安全、更高效的张量存储:

// safetensors 核心数据结构
#[derive(Serialize, Deserialize)]
struct SafeTensorsHeader {
    metadata: HashMap<String, String>,
    tensors: Vec<TensorInfo>,
}

#[derive(Serialize, Deserialize)]
struct TensorInfo {
    name: String,
    dtype: DType,
    shape: Vec<usize>,
    data_offsets: (usize, usize),
}

// 零拷贝反序列化(mmap 友好)
fn load_safetensors(path: &Path) -> Result<HashMap<String, Tensor>> {
    let file = std::fs::File::open(path)?;
    let mmap = unsafe { memmap2::Mmap::map(&file)? };
    // ... 直接读取 mmap 数据
}

LLM 推理框架的 Rust 实践

Candle:最小化依赖的 LLM 推理

Candle 是 HuggingFace 推出的纯 Rust LLM 推理框架,设计目标是无 CUDA 依赖 + 最小化二进制体积:

use candle_core::{Device, Tensor};
use candle_nn::{Linear, VarBuilder};
use candle_transformers::models::llama as model;

// 加载 LLaMA 模型进行推理
fn main() -> Result<()> {
    // 使用 CPU(也可指定 CUDA)
    let device = Device::Cpu;

    // 加载 safetensors 权重
    let vb = unsafe {
        VarBuilder::from_mmaped_safetensors(
            &["model.safetensors"],
            DType::F32,
            &device,
        )?
    };

    let config = model::Config::config_7b_v1();
    let llama = model::Llama::load(vb, &config)?;

    // 推理
    let input = Tensor::new(&[1u32, 100, 200], &device)?;
    let output = llama.forward(&input, 0)?;

    println!("Output shape: {:?}", output.shape());
    Ok(())
}

Candle 的几个关键优势:

// 1. 无 CUDA 运行时依赖
// 编译即运行,天然支持 CPU、Metal、Vulkan
// 二进制体积 < 10MB(不含模型权重)

// 2. 支持 WASM
// 可在浏览器中运行推理
// 示例:hf.co/chat 的 Web 版推理就用 Candle WASM

// 3. 量化支持(通过 Candle-quant)
// #[cfg(feature = "quantized")]
// fn load_quantized(path: &str) -> Result<QuantizedModel> {
//     QMatMul::from_qtensor(&qmatmul)?
// }

Mistral.rs:生产级推理引擎

Mistral.rs 是一个完全用 Rust 实现的 LLM 推理引擎,支持 GGUF、GGML、Safetensors 格式,以及 ISQ(原位量化):

use mistralrs::{
    IsqType, MistralRs, MistralRsBuilder,
    ModelSelected, Loader, GGUFLoaderBuilder,
};

#[tokio::main]
async fn main() -> Result<()> {
    // 配置加载器
    let loader = GGUFLoaderBuilder::new(
        "models/Phi-3-mini-4k-instruct-q4.gguf",
    )
    .with_isq(IsqType::Q4_0)
    .build();

    // 初始化引擎
    let mistralrs = MistralRsBuilder::new(loader, 1)
        .with_isq(IsqType::Q4K)
        .build()
        .await?;

    // 流式推理
    let mut stream = mistralrs
        .send(Messages::new("你是谁?"))
        .await?;

    // 逐 token 输出
    while let Some(chunk) = stream.next().await {
        print!("{}", chunk);
    }

    Ok(())
}

向量数据库的 Rust 选择

Qdrant:性能与可靠性的平衡

在向量数据库领域,Qdrant 是 Rust 实力的最佳证明。它比 Milvus(Go)和 Pinecone 的底层更高效:

// Qdrant 核心索引结构
pub struct HNSWIndex {
    // 分层可导航小世界图
    levels: Vec<Vec<Node>>,
    ef_construction: usize,
    m: usize,  // 每层最大连接数
}

impl HNSWIndex {
    // 近似最近邻搜索
    pub fn search(&self, query: &[f32], k: usize) -> Vec<ScoredPoint> {
        let entry = self.levels.last().unwrap()
            .first().unwrap();

        // 贪婪搜索
        let mut candidates: Vec<ScoredPoint> = vec![];
        // ... HNSW 算法实现
        candidates.truncate(k);
        candidates
    }
}
// Rust 的 match + enum 处理向量距离计算
#[derive(Clone, Copy)]
enum Distance {
    Cosine,
    Dot,
    Euclid,
}

impl Distance {
    fn compute(&self, a: &[f32], b: &[f32]) -> f32 {
        match self {
            Distance::Cosine => {
                let dot = dot_product(a, b);
                let norm_a = norm(a);
                let norm_b = norm(b);
                1.0 - dot / (norm_a * norm_b)
            }
            Distance::Dot => -dot_product(a, b),
            Distance::Euclid => {
                a.iter().zip(b)
                    .map(|(x, y)| (x - y).powi(2))
                    .sum::<f32>()
                    .sqrt()
            }
        }
    }
}

边缘计算与 WASM 部署

在浏览器中运行 AI

Rust 的 WASM 支持让在浏览器中运行 AI 模型变得可行:

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub struct WasmTokenizer {
    tokenizer: tokenizers::Tokenizer,
}

#[wasm_bindgen]
impl WasmTokenizer {
    #[wasm_bindgen(constructor)]
    pub fn new(json: &str) -> Result<WasmTokenizer, JsValue> {
        let tokenizer = tokenizers::Tokenizer::from_str(json)
            .map_err(|e| JsValue::from_str(&e.to_string()))?;
        Ok(WasmTokenizer { tokenizer })
    }

    pub fn encode(&self, text: &str) -> Result<Vec<u32>, JsValue> {
        let encoding = self.tokenizer
            .encode(text, true)
            .map_err(|e| JsValue::from_str(&e.to_string()))?;
        Ok(encoding.get_ids().to_vec())
    }
}
// 浏览器端使用
const response = await fetch('tokenizer.json');
const json = await response.text();
const tokenizer = WasmTokenizer.new(json);

// 分词发生在浏览器本地
const tokens = tokenizer.encode("Hello from browser!");
console.log(tokens);  // Uint32Array

嵌入式设备推理

// 在嵌入式 Linux 设备上运行 tiny model
// 总二进制大小 < 5MB,无需 Python 运行时
#![no_std]
#![no_main]

use cortex_m_rt::entry;
use embedded_nal::TcpStack;

#[entry]
fn main() -> ! {
    // 加载量化后的微型模型
    let model = TinyLlama::from_bytes(include_bytes!("model.q4"));
    let input = b"how are you";

    // 推理
    let output = model.predict(input);
    print_output(&output);

    loop {}
}

数据管道:Polars + Lance

Polars:比 Pandas 快 30x

Polars 是完全用 Rust 实现的数据框架库,其 API 与 Pandas 相似但性能差一个数量级:

use polars::prelude::*;

fn process_training_data() -> Result<DataFrame> {
    // 惰性查询:Polars 自动优化执行计划
    let df = LazyCsvReader::new("training_data.csv")
        .has_header(true)
        .finish()?
        .filter(col("label").eq(lit(1)))  // 只处理正样本
        .group_by([col("category")])
        .agg([
            col("features").apply(|s| {
                Ok(Some(normalize(s)))
            }).alias("normalized"),
            col("weight").sum().alias("total_weight"),
        ])
        .collect()?;  // 在此处统一执行

    // 转换为张量数据
    let tensor = df_to_tensor(&df)?;
    Ok(df)
}

fn normalize(s: &Series) -> Series {
    let arr = s.f32().unwrap();
    let mean = arr.mean();
    let std = arr.std(1);
    (arr - mean) / std
}
# 等效的 Pandas 代码
# pandas 要大 10-30x 内存和 3-10x 时间
import pandas as pd
df = pd.read_csv("training_data.csv")
df = df[df['label'] == 1]
# ... 处理慢

Lance:列式存储的现代选择

// Lance 用 Rust 重写了列式存储格式
// 比 Parquet 快 100x 的随机访问
use lance::dataset::Dataset;

#[tokio::main]
async fn main() -> Result<()> {
    // 创建数据集
    let dataset = Dataset::write(
        records,
        "s3://training-data/embeddings.lance",
        None,
    ).await?;

    // 快速随机访问(无需扫描整个文件)
    let rows = dataset
        .take(&[100, 200, 300], None)
        .await?;

    // 向量相似度搜索
    let results = dataset
        .scan()
        .nearest("embedding", &query_embedding, 10)
        .await?;

    Ok(())
}

工具链和生态

Cargo 的包管理优势

Rust 的包管理系统对 AI 基础设施开发来说是巨大的生产力提升:

# Cargo.toml — AI 项目依赖管理
[package]
name = "my-inference-engine"
version = "0.1.0"
edition = "2024"

[dependencies]
# 深度学习框架
candle-core = "0.8"
candle-nn = "0.8"
candle-transformers = "0.8"

# 数据处理
polars = { version = "0.44", features = ["lazy", "series"] }
tokenizers = "0.21"

# 序列化
safetensors = "0.6"
serde = { version = "1", features = ["derive"] }

# 数值计算
nalgebra = "0.33"
rand = "0.8"

# 测试
[dev-dependencies]
criterion = "0.5"  # 基准测试

跨平台编译

# Rust 的一键交叉编译
# 对比 Python:每平台都需要单独安装 Python + CUDA toolkit

# 编译到 Linux ARM(树莓派)
cargo build --target aarch64-unknown-linux-gnu --release

# 编译到 macOS(x86 + ARM 通用)
cargo build --target universal-apple-darwin --release

# 编译到 WASM
cargo build --target wasm32-unknown-unknown --release

# 编译到 Windows
cargo build --target x86_64-pc-windows-gnu --release

# 单条命令 = 完整的跨平台二进制

挑战与不足

生态系统成熟度

Rust 在 AI 领域也有明显的不足,需要客观看待:

// 1. 缺少成熟的自动微分框架
// 当前状态:正在发展中,但远不及 PyTorch
// candle_nn 提供有限的 autograd
let x = Tensor::new(&[1.0, 2.0, 3.0], &device)?;
let y = x.sin()?;  // 支持
// y.backward()?;  // ❌ Candle 不支持自动求导

// 2. GPU 算子支持有限
// CUDA kernel 需要写 cu 或通过 cuda_std
// 相比 PyTorch 的数千个算子差距巨大

// 3 编译时间
// 第一次编译:3-5 分钟
// 增量编译:30-60 秒
// 🔄 正在改进(增量编译、并行前端)

社区和人才储备

维度 Python Rust
AI 相关包数量 50,000+ 500+
成熟的深度学习框架 PyTorch / TF / JAX Candle / Burn(Beta)
学习曲线
AI 开发者占比 70%+ <5%
技术债务风险 高(代码腐化快) 低(类型系统强制健壮)

未来展望

趋势一:Rust 成为 AI 基础设施的"新 C++"

就像操作系统和嵌入式领域从 C 过渡到 C++(再到 Rust),AI 基础设施也会经历类似的演进。预计未来 3-5 年:

  • 新的推理引擎首选 Rust
  • 数据管道层全面 Rust 化
  • Python 用于顶层编排,Rust 用于底层实现

趋势二:WebGPU + WASM 推理

Rust 的 WASM 支持 + WebGPU 标准,让在浏览器中运行大模型推理成为现实:

// 未来的 WebGPU 推理
// 使用 WGPU(Rust 的 WebGPU 实现)
async fn run_inference_webgpu(model: &WgpuModel) -> Result<Vec<f32>> {
    let device = wgpu::Device::request(&wgpu::RequestAdapterOptions {
        power_preference: wgpu::PowerPreference::HighPerformance,
        ..Default::default()
    }).await?;

    // 直接在 GPU 上推理
    let output = model.forward(&input_tensor).await?;
    Ok(output)
}

趋势三:Candle 生态成熟

HuggingFace 正在全力推动 Candle 成为 Rust 领域的 PyTorch:

Candle + Tokenizers + Safetensors + Diffusers (Rust 版)
                    ↓
            完整的 Rust AI 工具链
                    ↓
       最终用户:不用碰一行 Python 代码

总结

Rust 在 AI 基础设施中的崛起不是一个偶然事件,而是开发者对性能、安全性和可维护性持续追求的自然结果。它的核心价值不在于发明新的范式,而在于用更好的工程实现承载已有的 AI 理论

对于团队来说,最佳策略是混合架构: - 顶层:Python — 原型开发、实验、数据分析 - 中间层:Rust — 高性能核心、推理引擎、数据管道 - 底层:CUDA/Metal — GPU 加速计算

如果你正在构建 AI 基础设施,现在正是认真考虑 Rust 的时候。不需要全盘迁移,但至少可以让它成为你工具箱中的重要一员。

建议:从 tokenizer 重写或推理引擎加速开始,用 Rust 替换最消耗 CPU 的那几个函数,你的用户会感谢你。