Rust 用法
面向最终用户的 darra-ai 日常用法。逐 API 签名见 会话、类型。
调用链
一条链打通:Session::open / Session::open_plain 打开 → infer_image 反复推理 → Drop 自动关闭。打开成本只付一次,之后同一会话反复推理,不要每张图重新打开。infer_image 永不收激活码。
加密容器 .darmodel 走 Session::open;未激活返 Error::PasswordRequired 时改走 Session::activate 补一次激活码,之后推理不再要码。分流用 Session::try_open / Session::try_activate,失败不抛错,读 OpenResult 再定。明文模型走 Session::open_plain,无需授权。
调用前先核 ABI:darra_ai::version() 交给 version_major 拆包,不为 1 立即停——SDK 与 DarraAI.Core 必须同一发布批次。
前置依赖
- Rust — rust-version 1.70
- 接入 — 路径依赖,publish = false,不发 crates.io
- 构建 — 环境变量 DARRA_AI_CORE_LIB_DIR 指向 Core 链接库目录(Windows 要 Core.lib,Linux 要 libCore.so)
- 运行 — Core.dll / libCore.so 在 PATH 或可执行文件旁
- feature — 默认 json(serde_json);只要字符串 JSON 可 default-features = false
- Provider — 运行时包提前部署,SDK 只验证并加载本地 Provider,不代装 NVIDIA / NPU 系统驱动
- 平台 — Windows x64、Linux x86_64、Linux aarch64;Windows 无 RKNN;macOS 不在 v1
安装
Cargo.toml 写一行路径依赖:
[dependencies]
darra-ai = { path = "<SDK 解压目录>/Rust/darra-ai" }
构建前设 DARRA_AI_CORE_LIB_DIR,指向 Core 链接库目录,再 cargo build:
$env:DARRA_AI_CORE_LIB_DIR = '<Core 链接库目录>'
cargo build
找不到库会直接报中文提示并中止,不会静默链错库。官方示例 infer:
cargo run -p darra-ai --example infer -- model.darmodel photo.jpg [key.darmkey]
cargo run -p darra-ai --example infer -- model.onnx photo.jpg
快速开始
最小可编译骨架(取自 examples/infer.rs 精简):
use std::fs;
use darra_ai::{ImageDesc, Session};
fn main() -> Result<(), darra_ai::Error> {
let packed = darra_ai::version();
if darra_ai::version_major(packed) != 1 {
return Err(darra_ai::Error::Internal {
message: format!("ABI 不匹配,库版本 = {}", darra_ai::version_string()),
hint: "Darra.AI SDK 与 DarraAI.Core 升到同一发布批次后重试。".to_string(),
});
}
let session = Session::open("model.darmodel", None)?;
let jpeg = fs::read("photo.jpg").map_err(|e| darra_ai::Error::IoNotFound {
message: format!("读图片失败:photo.jpg ({e})"),
hint: String::new(),
})?;
let json = session.infer_image(&jpeg, &ImageDesc::auto())?;
println!("{json}");
Ok(()) // Drop 即关闭会话
}
明文模型换一行入口即可:
let session = Session::open_plain("model.onnx", None)?;
按场景索引
| 场景 | 案例 | 一句话 |
|---|---|---|
| 单张最小链 | 推理入门 | 打开会话、推理一张图、关闭的最小调用链 |
| 相机连续帧 | 视频连续推理 | 逐帧进图,满队列丢最旧帧保最新画面 |
| 突发批量 | 图片队列 | 一次上百张进队列,容量与溢出策略由应用定 |
| 同模型多路 | 并行推理 | 同模型多路并发提交,推理线程数独立可配 |
| 多模型多卡 | 多模型并行 | 多模型或多卡分槽,按 Weight 分并发槽份额 |
同模型突发与流式排队见 推理池。失败码与处置见 错误处理,版本与本地诊断见 运行时。
设备池
多张卡按每卡权重分活,不是插队。和同一张卡上的推理池不是一回事。 打开没成功:路径空、文件不在、未激活、缺 Provider 返回 Error;ABI 不符是 Error::Internal。运行库缺符号在链接期失败,不是关了再开。
let mut pool = DevicePool::open_plain("model.onnx", None, None)?;
let ticket = pool.submit(&jpeg, &ImageDesc::auto(), -1)?;
let json = pool.wait(ticket)?;
pool.close();