多模型并行
一模型一实例:一个 AiSession = 一份已加载模型 + 一个 Provider。多模型 = 多会话。同模型要第二份实例也再开一个会话。没有「模型组 / 全局引擎」入口。
不同会话互不干扰,可并发。darra_runtime_ensure 进程内互斥除外(缺包时内部装 Provider 会串行)。
完整示例
检测 + 分类两路同时跑:
using Darra.AI.Runtime;
AiRuntime.Ensure("cpu-only");
using var detect = AiSession.Open("detect.darmodel", keyPath: "detect.darmkey");
using var classify = AiSession.Open("cls.darmodel", keyPath: "cls.darmkey");
byte[] jpg = File.ReadAllBytes("part.jpg");
var detectTask = Task.Run(() => detect.InferImage(jpg, ImageDesc.Auto()));
var clsTask = Task.Run(() => classify.InferImage(jpg, ImageDesc.Auto()));
string boxes = await detectTask;
string labels = await clsTask;
HandleBoth(boxes, labels);
两路可以绑不同 Provider(例如检测走 CUDA、分类走 CPU),在 Open 的 preferProvider 里指名。指名但不可用 = fail-closed,不会静默降级。
要点
- 每个会话自己的线程池;不要指望 SDK 在多个模型之间做全局调度。
- 显存不够就少开会话,SDK 不会给「最多 M 个模型」的常量。
- 分别
Dispose。任一会话Dispose时,该会话不能还有在飞InferImage。