并行推理
同会话允许并发调用 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 并发。