跳到主要内容

多模型并行

一模型一实例:一个 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),在 OpenpreferProvider 里指名。指名但不可用 = fail-closed,不会静默降级。

要点

  • 每个会话自己的线程池;不要指望 SDK 在多个模型之间做全局调度。
  • 显存不够就少开会话,SDK 不会给「最多 M 个模型」的常量。
  • 分别 Dispose。任一会话 Dispose 时,该会话不能还有在飞 InferImage