跳到主要内容

运行时 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-cpuWindows x64 / Linux x64 / Linux ARM64ORT CPU链尾兜底,零重依赖,随主包
onnx-cudaWindows x64ORT CUDA EPcu118–cu130 overlay;要 NVIDIA 驱动
onnx-openvinoWindows x64 / Linux x64ORT OpenVINO EPIntel CPU / iGPU
onnx-trt-epWindows x64ORT TensorRT EP进程内编译,不落盘明文 engine
onnx-directmlWindows x64ORT DirectML EP任意 Windows GPU(NVIDIA / AMD / Intel)
trt-nativeWindows x64裸 TensorRT engine + refit载荷 trt-engine;authoring 编 .engine 用,不进 runtime 自动选包集
paddle-cpuWindows x64 / Linux x64Paddle Inference CPU载荷 paddle
edge-rknn仅 linux-arm64RK3588 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_providerdarra_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

载荷(PayloadKindWin x64Linux x64Linux ARM64macOS
onnx(明文或 DARM1)cuda → trt-ep → directml → openvino → cpucpu / openvinocpuv1 不做
trt-engine(DARM1)trt-native不在 v1
openvino(DARM1)onnx-openvinoonnx-openvino
paddle(明文或 DARM1)paddle-cpupaddle-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-onlyonnx-cpu是(随主安装包)
nvidia-gpuonnx-cuda + onnx-trt-ep(按驱动选 CUDA 代际)
intel-iaponnx-openvino
amd-dmlonnx-directml
board-rk3588edge-rknn(成员只含 linux-arm64 包)

cpu-only 零重依赖,是没装 GPU 包时的默认形态。

硬件门与驱动

Provider 包用 hardwareGate 声明要什么硬件。缺硬件 = DARRA_HARDWARE_MISSING;驱动低于包声明 = DARRA_DRIVER_TOO_OLD

判定
gpu: nvidia / amd / intel本机 GPU 厂商必须相等
minDriver / minDriverCuda本机驱动 ≥ 该值
npu: rk3588SoC 匹配且 librknnrt 可加载

SDK 不代装系统驱动(NVIDIA / 板端 NPU 要管理员、重启、板厂镜像)。进程内能解决的(下包、校验、加载)全部自动;要动系统的只诊断 + 给官方链接。

onnx-cuda 的 CUDA 代际(cu118cu130)是多包并存,选包按驱动上限取能跑的最新,不是运行时再降级。

装在哪、怎么校验

  • 发现根:{软件根}/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不得跳过
  • 断网现场用离线整合包,仍走过同一套闸。见 运行时清单 · 离线整合包

失败码对照见 错误码