上篇我们聊了线程安全问题,你可能会发现:当两个线程同时调用同一个引擎推理时,模型输出会随机出错。
今天,我就带你手撕这个“并发恶魔”——用线程局部存储和引擎克隆,让TensorRT模型在10个、20个甚至50个线程下稳定输出。
开篇故事:一次线上事故的深夜排查
凌晨2点,我盯着监控面板上跳动的异常数据——一个部署在边缘服务器上的工业质检模型,白天跑得好好的,一到晚高峰(多路视频流同时推理)就出现随机误检。最诡异的是:同一张图片,单线程推理结果正常,多线程并发时,有时输出框漂移,有时类别完全错误。
我打开nvidia-smi,GPU利用率只有40%,显存也没爆。问题出在哪?我怀疑过显存碎片、怀疑过驱动版本,甚至怀疑过TensorRT的bug。
直到我用strace追踪系统调用,发现不同线程的推理结果在内存地址上发生了交叉污染——两个线程共享了同一个引擎对象,它们的输入缓冲区指向了同一块显存。
真相大白:TensorRT引擎默认不是线程安全的。当你把同一个engine对象传给多个线程时,它们会同时修改引擎内部的上下文状态,导致输出数据错乱。
痛点拆解:你以为的“线程安全”其实是个陷阱
很多同学认为:“我每次推理都调用enqueueV2,每个线程传不同的输入输出指针,应该没问题吧?” 错!
看这个反例代码:
# 反例:错误的多线程推理