运行时 Provider
走 SDK 时,推理后端是可插拔 Provider 细包。内核 DarraAI.Core 零重依赖;ORT / CUDA / TensorRT / OpenVINO / DirectML / RKNN runtime 全在包里,由 darra_runtime_ensure 按硬件探测下载并校验。
edge-rknn 只发布 linux-arm64。 Windows / linux-x64 的内核包、语言包、环境管理器列表都不含它。
开放导出接到任意框架时不走本页——那些框架用它们自己的 EP / 插件。本页只描述 SDK 会话选中的 Provider。
清单字段、选包算法、离线包见 运行时清单。取包装包见 发布与下载。
细包一览
同一份 .darmodel(ONNX 载荷)在装了对应 Provider 的机器上跑。细包是唯一发布物;场景 profile / 离线包只是细包清单,不产生新二进制。
| id | 平台 | 后端 | 说明 |
|---|---|---|---|
onnx-cpu | Windows x64 / Linux x64 / Linux ARM64 | ORT CPU | 链尾兜底,零重依赖,随主包 |
onnx-cuda | Windows x64 | ORT CUDA EP | cu118–cu130 overlay;要 NVIDIA 驱动 |
onnx-openvino | Windows x64 / Linux x64 | ORT OpenVINO EP | Intel CPU / iGPU |
onnx-trt-ep | Windows x64 | ORT TensorRT EP | 进程内编译,不落盘明文 engine |
onnx-directml | Windows x64 | ORT DirectML EP | 任意 Windows GPU(NVIDIA / AMD / Intel) |
trt-native | Windows x64 | 裸 TensorRT engine + refit | 载荷 trt-engine;authoring 编 .engine 用,不进 runtime 自动选包集 |
paddle-cpu | Windows x64 / Linux x64 | Paddle Inference CPU | 载荷 paddle |
edge-rknn | 仅 linux-arm64 | RK3588 NPU + librknnrt | 只能运行,不含转换 |
合法 id 以 darra_ai.h 第 5 节与清单 providesProvider 为准。未知 id fail-closed。
自动选 vs 指名
ONNX 载荷、调用方不指名(prefer_provider = NULL)时,本机有 GPU 必须用 GPU,不许静默落到 CPU:
cuda → trt-ep → directml(任意 Windows GPU)→ openvino → cpu
- 指名(
prefer_provider或darra_runtime_ensure("onnx-cuda"))不可用 = fail-closed,返回DARRA_HARDWARE_MISSING/DARRA_DRIVER_TOO_OLD/DARRA_UNSUPPORTED_PLATFORM/DARRA_PROVIDER_MISSING,绝不换别的 Provider 冒充成功。 - 仅当调用方显式走 auto 策略时,才按上表选取;诊断 JSON 必须记录实际加载的 Provider 与包 id。
open*发现包未装会内部ensure一次(可能阻塞下载)。想看进度,先自己调darra_runtime_ensure(幂等)。
edge-rknn:仅 linux-arm64
| 平台 | 行为 |
|---|---|
| Linux ARM64(RK3588 板端) | 可装 edge-rknn,跑 PayloadKind=rknn 的容器 |
| Windows x64 | 没有此包。环境管理器列表不含它。指名 → DARRA_UNSUPPORTED_PLATFORM。收到 rknn 载荷 → DARRA_UNSUPPORTED_PAYLOAD |
| Linux x64 | 同上:不存在此包;rknn 载荷拒载 |
Windows / linux-x64 本机不做 RKNN 转换或推理(官方 rknn-toolkit2 无 Windows 版;不把 WSL 当用户前提)。Studio 可以把已转好的 .rknn 打进 .darmodel,但这两端收到仍拒载,文案如实:「该载荷需 linux-arm64 + edge-rknn + librknnrt」。真 NPU 等板,不在开发机虚拟机上测 RKNN。
NPU 驱动由板厂镜像自带。SDK 不代装。板镜像缺驱动 → DARRA_HARDWARE_MISSING / DARRA_DRIVER_TOO_OLD,诊断 JSON 给原因,不静默改用 onnx-cpu。
载荷 × Provider
载荷(PayloadKind) | Win x64 | Linux x64 | Linux ARM64 | macOS |
|---|---|---|---|---|
onnx(明文或 DARM1) | cuda → trt-ep → directml → openvino → cpu | cpu / openvino | cpu | v1 不做 |
trt-engine(DARM1) | trt-native | 不在 v1 | — | — |
openvino(DARM1) | onnx-openvino | onnx-openvino | — | — |
paddle(明文或 DARM1) | paddle-cpu | paddle-cpu | — | — |
rknn(DARM1) | 拒载 | 拒载 | edge-rknn + librknnrt | — |
.pt / .pth | 拒载(先在 Studio 转 ONNX) | 同左 | 同左 | — |
trt-engine / OpenVINO / Paddle / rknn 都能绑机(文件级,与 PayloadKind 无关)。缺对应 Provider 是推理失败,不是绑机失败。
场景 profile
profile 只是 members 清单,不产生新二进制。darra_runtime_ensure("<profileId>", ...) = 展开 members → 按本机 osArch + 硬件门逐个解析,不是无脑全装。任一成员失败如实报,已装成员保留,不整组回滚假装没发生。
| id | 成员意图 | 默认 |
|---|---|---|
cpu-only | onnx-cpu | 是(随主安装包) |
nvidia-gpu | onnx-cuda + onnx-trt-ep(按驱动选 CUDA 代际) | 否 |
intel-iap | onnx-openvino | 否 |
amd-dml | onnx-directml | 否 |
board-rk3588 | edge-rknn(成员只含 linux-arm64 包) | 否 |
cpu-only 零重依赖,是没装 GPU 包时的默认形态。
硬件门与驱动
Provider 包用 hardwareGate 声明要什么硬件。缺硬件 = DARRA_HARDWARE_MISSING;驱动低于包声明 = DARRA_DRIVER_TOO_OLD。
| 门 | 判定 |
|---|---|
gpu: nvidia / amd / intel | 本机 GPU 厂商必须相等 |
minDriver / minDriverCuda | 本机驱动 ≥ 该值 |
npu: rk3588 | SoC 匹配且 librknnrt 可加载 |
SDK 不代装系统驱动(NVIDIA / 板端 NPU 要管理员、重启、板厂镜像)。进程内能解决的(下包、校验、加载)全部自动;要动系统的只诊断 + 给官方链接。
onnx-cuda 的 CUDA 代际(cu118…cu130)是多包并存,选包按驱动上限取能跑的最新,不是运行时再降级。
装在哪、怎么校验
- 发现根:
{软件根}/Env/<providerId>/<version>/(软件根 = 进程 exe 目录;DARRA_ENV_ROOT可覆盖 Env 本身)。禁止装到 ProgramData / LocalAppData。 - 主模块必须过 sha256 白名单 +
abiVersion等于本机 Core ABI 主版本,否则DARRA_PROVIDER_ABI_MISMATCH。 - 下载 HTTPS;整体 sha256 + size,解压后再对
dependencies[]逐文件校验。任一不符 =DARRA_CHECKSUM_MISMATCH,不得跳过。 - 断网现场用离线整合包,仍走过同一套闸。见 运行时清单 · 离线整合包。
失败码对照见 错误码。