有两个问题:(1)C API 中,模型预测应该属于只读,多线程场景下,为什么需要Clone多个PaddlePredictor呢? 如果Clone内存上会有所增加。
(2)Python接口中,Executor.run() 预测时,是支持多进程的把?我一直多进程并发预测的,请确认是否会有预测结果正确性问题。
gupuwyp21#
(1)预测时多线程之间会相互影响,所以要clone;(2)多进程之间是独立的,这么用应该没有问题
ldfqzlk82#
继续问一下:(1)内存增加怎么解决呢,(2)我们线上服务40个线程,而且线程内部还有bthread,请问应该如何搞呢?是不是每个线程内部的每个bthread也要clone。
i86rm4rw3#
一个thread内的bthread内部建议共用一个PaddlePredictor
mwkjh3gx4#
有没有wiki或者详细的解释一下原理,为什么多线程之间会有影响呢,而多个bthread就没有影响。都是并发,区别在哪儿?如果多个线程共用了同一个Predictor会出现什么问题?
eivgtgni5#
paddle运行过程中,有些数据是线程独占的,多线程用一个PaddlePredictor可能冲突或者数据访问竞争出现问题。bthread只是在分享一个线程资源,而且一个线程上同时也只能有一个bthread运行,不会产生冲突,要注意的是bthread在调用PaddlePredictor的过程中不能yield,必须是一个完整的调用PaddlePredictor直到这次调用结束。
tyu7yeag6#
临时变量不是线程安全,所以需要 Clone。 参数是只读,所以 Clone 是共享参数的。很多模型中间的临时变量占用内存更大。
因为临时变量的内存空间无法共享,因此PaddlePredictor 是严格线程不安全的,必须外部处理以保障性能。
rpppsulh7#
请问一下term_embding的词典会共享吗? 我那个term_dict 40W, 我看模型save的里面,term_emb占了200M。如果每个线程一份,那内存会非常大。 我现在还在解决paddle C-API编译依赖的问题,还没有真正加载,先了解一下。
brgchamk8#
@Superjomn@wopeizl
lf5gs5x29#
只创建一个Predictor,主模块内存40G, 每个线程clone一份(线上服务,40个线程),内存上升到44G。压力有点大。
9条答案
按热度按时间gupuwyp21#
(1)预测时多线程之间会相互影响,所以要clone;(2)多进程之间是独立的,这么用应该没有问题
ldfqzlk82#
继续问一下:
(1)内存增加怎么解决呢,
(2)我们线上服务40个线程,而且线程内部还有bthread,请问应该如何搞呢?是不是每个线程内部的每个bthread也要clone。
i86rm4rw3#
一个thread内的bthread内部建议共用一个PaddlePredictor
mwkjh3gx4#
有没有wiki或者详细的解释一下原理,为什么多线程之间会有影响呢,而多个bthread就没有影响。都是并发,区别在哪儿?如果多个线程共用了同一个Predictor会出现什么问题?
eivgtgni5#
paddle运行过程中,有些数据是线程独占的,多线程用一个PaddlePredictor可能冲突或者数据访问竞争出现问题。
bthread只是在分享一个线程资源,而且一个线程上同时也只能有一个bthread运行,不会产生冲突,要注意的是bthread在调用PaddlePredictor的过程中不能yield,必须是一个完整的调用PaddlePredictor直到这次调用结束。
tyu7yeag6#
临时变量不是线程安全,所以需要 Clone。 参数是只读,所以 Clone 是共享参数的。
很多模型中间的临时变量占用内存更大。
因为临时变量的内存空间无法共享,因此PaddlePredictor 是严格线程不安全的,必须外部处理以保障性能。
rpppsulh7#
请问一下term_embding的词典会共享吗? 我那个term_dict 40W, 我看模型save的里面,term_emb占了200M。如果每个线程一份,那内存会非常大。 我现在还在解决paddle C-API编译依赖的问题,还没有真正加载,先了解一下。
brgchamk8#
@Superjomn@wopeizl
lf5gs5x29#
只创建一个Predictor,主模块内存40G, 每个线程clone一份(线上服务,40个线程),内存上升到44G。压力有点大。