llmfit Run Modes Explained: GPU, MoE Offload, CPU Offload, CPU Only, and Tensor Parallel
llmfit uses five distinct run modes to determine how a large language model executes on your hardware, ranging from full GPU acceleration to distributed cluster inference.
The RunMode enum in llmfit-core/src/fit.rs defines how the library balances memory constraints against inference speed. Understanding these modes helps you interpret fit reports and optimize deployment for your specific hardware configuration.
RunMode Enum Definition
The core enumeration appears at lines 88-94 of llmfit-core/src/fit.rs:
pub enum RunMode {
Gpu, // Fully loaded into VRAM – fast
MoeOffload, // MoE: active experts in VRAM, inactive offloaded to RAM
CpuOffload, // Partial GPU offload, spills to system RAM – mixed
CpuOnly, // Entirely in system RAM, no GPU – slow
TensorParallel, // Distributed via NCCL across cluster nodes
}
Each variant represents a fundamentally different memory placement strategy with direct performance implications.
How llmfit Selects a Run Mode
The selection logic executes inside ModelFit::analyze_inner following a priority-based decision tree:
- GPU availability check – If
system.has_gpuis true, the analyzer first attemptsRunMode::Gpu - MoE model validation – For Mixture-of-Experts models, it checks if active experts fit in VRAM before considering
MoeOffload - VRAM sufficiency test – When the full model exceeds GPU memory, it falls back to
CpuOffload - No-GPU fallback – Absent discrete GPU detection,
CpuOnlyis selected - Cluster override –
system.cluster_modeforcesTensorParallelregardless of single-node capacity
The MoE-specific offloading path is implemented in moe_offload_path, which calculates whether active experts can reside in VRAM while inactive experts spill to system RAM.
Detailed Comparison of llmfit Run Modes
Gpu Mode
Memory placement: Entire model weights reside in GPU VRAM
Performance characteristics: Fastest inference, bandwidth-bound by GPU memory throughput
Activation condition: Sufficient VRAM for complete model (or MoE active expert subset)
In score_fit, only GPU-based paths can achieve FitLevel::Perfect. The UI displays this mode as "GPU" via run_mode_text.
MoeOffload Mode
Memory placement: Active experts in VRAM, inactive experts in system RAM
Performance characteristics: Good throughput for very large MoE models; slower than pure GPU due to expert-swapping overhead, but superior to full CPU spill
Activation condition: MoE architecture detected where full model exceeds VRAM but active expert subset fits
The distinction between active and inactive experts comes from model fields is_moe and active_experts defined in llmfit-core/src/models.rs.
CpuOffload Mode
Memory placement: Model partially in VRAM, with automatic spilling to system RAM
Performance characteristics: Mixed speed—GPU compute cores remain utilized but PCIe transfers create bottlenecks
Activation condition: Model slightly exceeds available VRAM; CPU+GPU hybrid execution still beneficial
The UI labels this "CPU+GPU" to indicate the hybrid nature.
CpuOnly Mode
Memory placement: Entirely in system RAM, zero GPU involvement
Performance characteristics: Slowest inference path; CPU-optimized matrix operations without tensor core acceleration
Activation condition: No discrete GPU detected, or explicit override on unified-memory systems
Displays as "CPU" in fit reports.
TensorParallel Mode
Memory placement: Model weights sharded across multiple GPUs/nodes via NCCL
Performance characteristics: Scales linearly with cluster size; network latency and synchronization overhead reduce efficiency at small scales
Activation condition: system.cluster_mode enabled with vLLM backend
The UI abbreviates this mode as "TP" for Tensor Parallel.
Display and Scoring Implementation
Human-readable labels map to enum variants in run_mode_text:
pub fn run_mode_text(&self) -> &str {
match self.run_mode {
RunMode::Gpu => "GPU",
RunMode::TensorParallel => "TP",
RunMode::MoeOffload => "MoE",
RunMode::CpuOffload => "CPU+GPU",
RunMode::CpuOnly => "CPU",
}
}
The score_fit function applies different quality thresholds per mode—GPU paths alone qualify for perfect fits, while offloaded modes receive degraded scores proportional to their memory-transfer penalties.
Inspecting Run Modes Programmatically
Retrieve the selected mode after hardware analysis:
use llmfit_core::fit::ModelFit;
use llmfit_core::hardware::SystemSpecs;
use llmfit_core::models::LlmModel;
fn inspect_run_mode() {
let system = SystemSpecs::detect().unwrap();
let model = LlmModel::from_name("Llama-2-7B-chat-hf").unwrap();
let fit = ModelFit::analyze(&model, &system);
println!("Run mode: {}", fit.run_mode_text());
println!("Fit level: {}", fit.fit_text());
println!("Estimated throughput: {:.1} tok/s", fit.estimated_tps);
}
Force a specific runtime to observe mode changes:
let forced_runtime = Some(llmfit_core::fit::InferenceRuntime::LlamaCpp);
let fit = ModelFit::analyze_with_forced_runtime(&model, &system, None, forced_runtime);
println!("With forced LlamaCpp runtime → {}", fit.run_mode_text());
Key Source Files
| File | Purpose |
|---|---|
llmfit-core/src/fit.rs |
RunMode definition, selection logic, moe_offload_path, run_mode_text, score_fit |
llmfit-core/src/hardware.rs |
GPU detection, VRAM querying, unified memory identification |
llmfit-core/src/models.rs |
MoE fields (is_moe, active_experts, num_experts) |
llmfit-tui/src/display.rs |
Terminal rendering of run-mode labels |
Summary
- Gpu: Full VRAM residency, fastest inference, qualifies for perfect fit scores
- MoeOffload: Expert-selective offloading for large MoE models that don't fit entirely in GPU memory
- CpuOffload: Hybrid execution when models slightly exceed VRAM capacity
- CpuOnly: RAM-only fallback when no discrete GPU is available
- TensorParallel: Distributed execution across cluster nodes via vLLM and NCCL
The llmfit run mode system automatically negotiates between hardware constraints and model architecture to select the highest-performance viable execution path.
Frequently Asked Questions
What triggers TensorParallel mode instead of single-GPU execution?
TensorParallel activates when system.cluster_mode is enabled in your configuration, forcing distributed inference via vLLM across multiple nodes regardless of whether the model would fit on a single GPU. This overrides the standard single-node decision tree entirely.
Why does my MoE model use CpuOffload instead of MoeOffload?
MoeOffload requires that the active expert subset fits in available VRAM. If your system cannot accommodate even the active experts, the analyzer skips to CpuOffload or CpuOnly. Check your model's active_experts count against system.vram_bytes in the fit analysis.
Can I force a specific run mode manually?
No direct run-mode forcing exists in the public API. You influence selection indirectly through: forcing a runtime backend (analyze_with_forced_runtime), modifying cluster mode settings, or using quantization parameters that reduce memory requirements. The library prioritizes automatic optimal selection over manual override.
How does CpuOffload performance compare to Gpu mode?
CpuOffload maintains GPU compute utilization but incurs PCIe transfer overhead for memory spills. Throughput typically degrades 30-70% depending on activation sparsity and PCIe bandwidth. The score_fit function reflects this with reduced fit levels—Gpu alone achieves FitLevel::Perfect.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →