跳到主要内容

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();