Ship one binary with NPU + ROCm + CUDA support, fix CLI flag precedence
All checks were successful
Mirror to GitHub / mirror (push) Successful in 2s
release / build (push) Successful in 2m51s

Adds breadmill's `full` feature (npu + rocm + cuda together) and switches
the release workflow to build with it. All three backends are ort's
load-dynamic (dlopen) mode, so combining them doesn't require the NPU/ROCm/
CUDA toolkits on the build host -- which backend is actually available is
resolved at runtime via ORT_DYLIB_PATH / the dynamic linker, per whichever
backend is selected for that run.

Also fixes a real bug this surfaced: backend selection checked
`config.model.backend == "rocm"` unconditionally in an if/else-if chain, so
an explicit --cuda (or --npu) flag silently lost to an unrelated `backend`
value already sitting in config.toml. CLI flags now always take priority
over config.

Version bump: breadmill 0.2.0 -> 0.2.1.
This commit is contained in:
Breadway 2026-07-03 22:06:47 +08:00
parent 2618a33fd5
commit fdf596e58a
5 changed files with 56 additions and 14 deletions

View file

@ -105,17 +105,34 @@ fn run_daemon(force_reindex: bool, use_npu: bool, use_rocm: bool, use_cuda: bool
std::fs::create_dir_all(&state_dir).map_err(|e| e.to_string())?;
std::fs::create_dir_all(&cache_dir).map_err(|e| e.to_string())?;
let backend = if use_npu || config.model.backend == "npu" {
eprintln!("breadmill: NPU backend selected");
Backend::Npu { cache_dir: cache_dir.clone() }
} else if use_rocm || config.model.backend == "rocm" {
eprintln!("breadmill: ROCm backend selected");
Backend::Rocm
} else if use_cuda || config.model.backend == "cuda" {
eprintln!("breadmill: CUDA backend selected");
Backend::Cuda
// CLI flags always override config — otherwise an explicit --cuda/--npu on
// the command line would silently lose to an unrelated `backend = "..."`
// already sitting in config.toml, since that's whatever earlier branch a
// fixed if/else-if priority order happened to check first.
let backend_name = if use_npu {
"npu"
} else if use_rocm {
"rocm"
} else if use_cuda {
"cuda"
} else {
Backend::Cpu
config.model.backend.as_str()
};
let backend = match backend_name {
"npu" => {
eprintln!("breadmill: NPU backend selected");
Backend::Npu { cache_dir: cache_dir.clone() }
}
"rocm" => {
eprintln!("breadmill: ROCm backend selected");
Backend::Rocm
}
"cuda" => {
eprintln!("breadmill: CUDA backend selected");
Backend::Cuda
}
_ => Backend::Cpu,
};
let store = Store::open(&state_dir, dim)?;