Domain Ml

by actionbook5c40d3ad7851No license1.5K starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated 6 weeks ago

Use when building ML/AI apps in Rust. Keywords: machine learning, ML, AI, tensor, model, inference, neural network, deep learning, training, prediction, ndarray, tch-rs, burn, candle, 机器学习, 人工智能, 模型推理

AI-generated overview

Guides Rust machine-learning and AI application design, covering frameworks, memory efficiency, GPU batching and model loading.

What it does
This skill provides domain constraints and design guidance for building machine-learning and AI applications in Rust. It maps domain rules such as large data, GPU acceleration and model portability to Rust design implications, and recommends crates for tensors, ONNX inference, ML frameworks, PyTorch bindings, data processing and embeddings. It also supplies code patterns for an inference server and batched inference, plus tables of common mistakes and related skills.
When to use it
Use it when designing or implementing ML/AI applications in Rust, such as inference servers, batched prediction pipelines or model loading. It is also relevant when choosing between Rust ML crates or addressing memory, GPU and portability constraints.
Requirements
No scripts are shipped; it is instructions only. The guidance references Rust crates such as ndarray, tract, candle, burn, tch-rs, polars and fastembed, and assumes a Rust project with possible GPU (CUDA/Metal) support.

Machine Learning Domain

Layer 3: Domain Constraints

Domain Constraints → Design Implications

Domain RuleDesign ConstraintRust Implication
Large dataEfficient memoryZero-copy, streaming
GPU accelerationCUDA/Metal supportcandle, tch-rs
Model portabilityStandard formatsONNX
Batch processingThroughput over latencyBatched inference
Numerical precisionFloat handlingndarray, careful f32/f64
ReproducibilityDeterministicSeeded random, versioning

Critical Constraints

Memory Efficiency

RULE: Avoid copying large tensorsWHY: Memory bandwidth is bottleneckRUST: References, views, in-place ops

GPU Utilization

RULE: Batch operations for GPU efficiencyWHY: GPU overhead per kernel launchRUST: Batch sizes, async data loading

Model Portability

RULE: Use standard model formatsWHY: Train in Python, deploy in RustRUST: ONNX via tract or candle

Trace Down ↓

From constraints to design (Layer 2):

"Need efficient data pipelines"    ↓ m10-performance: Streaming, batching    ↓ polars: Lazy evaluation
"Need GPU inference"    ↓ m07-concurrency: Async data loading    ↓ candle/tch-rs: CUDA backend
"Need model loading"    ↓ m12-lifecycle: Lazy init, caching    ↓ tract: ONNX runtime

Use Case → Framework

Use CaseRecommendedWhy
Inference onlytract (ONNX)Lightweight, portable
Training + inferencecandle, burnPure Rust, GPU
PyTorch modelstch-rsDirect bindings
Data pipelinespolarsFast, lazy eval

Key Crates

PurposeCrate
Tensorsndarray
ONNX inferencetract
ML frameworkcandle, burn
PyTorch bindingstch-rs
Data processingpolars
Embeddingsfastembed

Design Patterns

PatternPurposeImplementation
Model loadingOnce, reuseOnceLock<Model>
BatchingThroughputCollect then process
StreamingLarge dataIterator-based
GPU asyncParallelismData loading parallel to compute

Code Pattern: Inference Server

rust
use std::sync::OnceLock;use tract_onnx::prelude::*;
static MODEL: OnceLock<SimplePlan<TypedFact, Box<dyn TypedOp>, Graph<TypedFact, Box<dyn TypedOp>>>> = OnceLock::new();
fn get_model() -> &'static SimplePlan<...> {    MODEL.get_or_init(|| {        tract_onnx::onnx()            .model_for_path("model.onnx")            .unwrap()            .into_optimized()            .unwrap()            .into_runnable()            .unwrap()    })}
async fn predict(input: Vec<f32>) -> anyhow::Result<Vec<f32>> {    let model = get_model();    let input = tract_ndarray::arr1(&input).into_shape((1, input.len()))?;    let result = model.run(tvec!(input.into()))?;    Ok(result[0].to_array_view::<f32>()?.iter().copied().collect())}

Code Pattern: Batched Inference

rust
async fn batch_predict(inputs: Vec<Vec<f32>>, batch_size: usize) -> Vec<Vec<f32>> {    let mut results = Vec::with_capacity(inputs.len());
    for batch in inputs.chunks(batch_size) {        // Stack inputs into batch tensor        let batch_tensor = stack_inputs(batch);
        // Run inference on batch        let batch_output = model.run(batch_tensor).await;
        // Unstack results        results.extend(unstack_outputs(batch_output));    }
    results}

Common Mistakes

MistakeDomain ViolationFix
Clone tensorsMemory wasteUse views
Single inferenceGPU underutilizedBatch processing
Load model per requestSlowSingleton pattern
Sync data loadingGPU idleAsync pipeline

Trace to Layer 1

ConstraintLayer 2 PatternLayer 1 Implementation
Memory efficiencyZero-copyndarray views
Model singletonLazy initOnceLock<Model>
Batch processingChunked iterationchunks() + parallel
GPU asyncConcurrent loadingtokio::spawn + GPU

Related Skills

WhenSee
Performancem10-performance
Lazy initializationm12-lifecycle
Async patternsm07-concurrency
Memory efficiencym01-ownership

Source and attribution

Source:actionbook/rust-skillsinskills/domain-mlat commit5c40d3a

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal