跳到主要内容

并行推理

同会话允许并发调用 InferImage。吞吐扩展推荐每线程一个会话,而不是很多线程抢一个会话。

SDK 没有「最多并行 N 张」这种硬上限。开多少路受现场 CPU / 内存 / GPU 显存约束,文档不编数字。

会话内线程池(不是张数上限)

SessionOptions.IntraOpThreads / InterOpThreads

  • 0 = 自动,自动上限 = min(硬件逻辑核数, 4)
  • >0 = 调用方指定,SDK 照填给本会话 Provider 线程池,不再二次封顶
  • 这是算子/图并行线程,不是「同时最多 4 张图」

CpuAffinityMask 只约束本会话线程。禁止改 Windows ReservedCpuSets,禁止动 PLC 隔离核。

完整示例:每线程一个会话

同一份模型开多路会话 = 多份已加载实例,API 相同,没有「模型组」入口。

using Darra.AI.Runtime;

string[] files = Directory.GetFiles(@"D:\inbox", "*.jpg");
int workers = 4; // 示例,按显存/CPU 自定,不是 SDK 上限

var sessions = new AiSession[workers];
for (int i = 0; i < workers; i++)
{
sessions[i] = AiSession.OpenEx(
"inspect.darmodel",
keyPath: "inspect.darmkey",
options: new SessionOptions { IntraOpThreads = 0, InterOpThreads = 0 });
}

try
{
Parallel.For(0, files.Length, new ParallelOptions { MaxDegreeOfParallelism = workers }, n =>
{
int w = n % workers;
byte[] jpg = File.ReadAllBytes(files[n]);
string json = sessions[w].InferImage(jpg, ImageDesc.Auto());
HandleResult(json);
});
}
finally
{
foreach (AiSession s in sessions)
s.Dispose();
}

同会话并发

也可以多线程调用同一个 session.InferImage。底层会话线程安全;解密明文窗口由 SDK 内部串行。要拉高吞吐,仍建议每线程一个会话。

Dispose 禁止与任何在飞 InferImage 并发。