模型预测C-API,多线程预测为什么需要Clone多个PaddlePredictor

pes8fvy9  于 2022-10-20  发布在  其他
关注(0)|答案(9)|浏览(217)

有两个问题:
(1)C API 中,模型预测应该属于只读,多线程场景下,为什么需要Clone多个PaddlePredictor呢? 如果Clone内存上会有所增加。

(2)Python接口中,Executor.run() 预测时,是支持多进程的把?我一直多进程并发预测的,请确认是否会有预测结果正确性问题。

gupuwyp2

gupuwyp21#

(1)预测时多线程之间会相互影响,所以要clone;(2)多进程之间是独立的,这么用应该没有问题

ldfqzlk8

ldfqzlk82#

继续问一下:
(1)内存增加怎么解决呢,
(2)我们线上服务40个线程,而且线程内部还有bthread,请问应该如何搞呢?是不是每个线程内部的每个bthread也要clone。

i86rm4rw

i86rm4rw3#

一个thread内的bthread内部建议共用一个PaddlePredictor

mwkjh3gx

mwkjh3gx4#

有没有wiki或者详细的解释一下原理,为什么多线程之间会有影响呢,而多个bthread就没有影响。都是并发,区别在哪儿?如果多个线程共用了同一个Predictor会出现什么问题?

eivgtgni

eivgtgni5#

paddle运行过程中,有些数据是线程独占的,多线程用一个PaddlePredictor可能冲突或者数据访问竞争出现问题。
bthread只是在分享一个线程资源,而且一个线程上同时也只能有一个bthread运行,不会产生冲突,要注意的是bthread在调用PaddlePredictor的过程中不能yield,必须是一个完整的调用PaddlePredictor直到这次调用结束。

tyu7yeag

tyu7yeag6#

临时变量不是线程安全,所以需要 Clone。 参数是只读,所以 Clone 是共享参数的。
很多模型中间的临时变量占用内存更大。

因为临时变量的内存空间无法共享,因此PaddlePredictor 是严格线程不安全的,必须外部处理以保障性能。

rpppsulh

rpppsulh7#

请问一下term_embding的词典会共享吗? 我那个term_dict 40W, 我看模型save的里面,term_emb占了200M。如果每个线程一份,那内存会非常大。 我现在还在解决paddle C-API编译依赖的问题,还没有真正加载,先了解一下。

lf5gs5x2

lf5gs5x29#

只创建一个Predictor,主模块内存40G, 每个线程clone一份(线上服务,40个线程),内存上升到44G。压力有点大。

相关问题